From b433d015a6547598e568808d9cae16325bc8928f Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Wed, 15 Apr 2026 08:14:58 +1000 Subject: [PATCH 001/196] regen signature on allowed_signers file This was missed after the file was updated, but nobody noticed it until now. --- .git_allowed_signers.asc | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.git_allowed_signers.asc b/.git_allowed_signers.asc index 1a8401b838a3..4d7269b1b485 100644 --- a/.git_allowed_signers.asc +++ b/.git_allowed_signers.asc @@ -1,16 +1,16 @@ -----BEGIN PGP SIGNATURE----- -iQIzBAABCgAdFiEEcWi5g4FaXu9ZpK39Kj9BTnNgYLoFAmYHnZ8ACgkQKj9BTnNg -YLquuQ/6A8E6P2jcgn3wmbbCTXP7kmxoh3nmw/e6PC8CEua1512oT3GHOKVD5cGK -cgYRObpWvjOjg7L1HRABftq7a9M2zfsGnY/WNe3/fbetfkyY8hG8c31vA1ePIOt2 -AjBLCWFblH0CtyH/MssoQ19JCLtXK/GmekB1Q0JzyOog7w/0r3CKuUnZ0juCYR1R -4FBePl5l3nFSZEcFEdptGlNGeuolS5XBCqB9Y91TCzkVkH5eXUUW+shgjNhWCEhT -pZvkxfhsmOEnwNofyPdgKVfDBVkHmvuC67EU395mJVN4c2NZ8pOztb9hOt3xr980 -q44I4kT2NpaApCx1dWIGhMy/37LJ8heI0W1B+ofTA5n34/RU8UXH3SCkj2AK6Ao5 -H2u8vbmuWKUCiECmrw35EeKGmtuK/bWJzx3KBP7fx5J9S3mWUgT4W4xlWNN9RWoU -sSvH1ppie5ARINVaAWl5k44fk60ahTf80DbQBIOZBmQn7myZZka+yGcQbAiZZ1Gc -0l8+Nf5Ao1ckmuyY5o8FyWdsyDeK3+MqjPn5Rr1CqbKCn2VnqrVWbI33Eyu8c96U -bxVgU5H1BDhNjJC8UrT3LFPvJMO8p3a0IJ3eHydjk2jVOhOdBZmA0yoqUTrhPpXq -ymIHESjDJR8TDe4TCfb46o9oEC3cdbDwgnzPqdg0n+0uIsJLYiU= -=gl+l +iQIzBAABCgAdFiEEcWi5g4FaXu9ZpK39Kj9BTnNgYLoFAmnevEAACgkQKj9BTnNg +YLr72w//ay7JpFSfUF5h97Vi2T58fwkRO2aapXrK8f3mnzeelN9H09XBpRquFZCL +o5S/8RSmVtRjCTXyo7GjwhaAF6+XyKiKgwvjTnY9EA4leCCoNdBJ2/77xlBZdPD4 +AuKPRQKpGjJi+P+2yB0ocgpT6MWXDlg0xkdLWaiQC4xpADUD9AlebUVHtCPOqXWb +LgGampMjQu8usg9QX3x0oHpuMUot+wo3dTD2xjgWv03DmPK7wCUiA760GeEGibma +jv3JT8JZnDtPk4J0PpoJecoJsMhH9Zoy55yi3d4y/SxBUSIBFs2qcw4tO3iixZwD +mlZVW83KFhIlH6Q8GJtymrYrQ2Gw88wWZ6Oj3glzHCkrxUeO9MIbnTSzXekg6+O7 +qBxQC4xdlNtHFS+GvG3EZzztl8C4Qfmdl35bStQaVhWzygI5+o19yoeYi4lMTYQM +CAH6ONeDFvm3SwlTJk41O/zXz7mO1vRpsn5QMCHt3KLBZkkMrSKl4C2r9iuq7MeY +gx3mnPW6/yu1TzGUl5wtzeb6I2R1/zPK3ibhbGQyt4WggCio3D8xmcmhyxKL79fi +Pb02QXRYplXrkR6Lf2HCRdJoNu3bodqelkeiAtgj0CLHlK355dtmya6txn4Ccoc1 ++kH7vdHqPKJSrsMBZ/Qm+0dA9Kq4Qoib2tog9De09u5p8XQUdAY= +=9i1L -----END PGP SIGNATURE----- From f2da6737e237324b43afc002ce4836e65659fb2e Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 16 Apr 2026 19:32:34 +1000 Subject: [PATCH 002/196] Match case with other messages. --- .github/workflows/vm.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index dbfd6c186c33..5d12fb9e52e2 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -334,7 +334,7 @@ jobs: touch /etc/ssh/ssh_known_hosts pkg_add git - - name: Fetch sysupgrade version + - name: fetch sysupgrade version run: | ver=$(curl -s https://cdn.openbsd.org/pub/OpenBSD/snapshots/amd64/BUILDINFO) echo "SNAPSHOT_VERSION=${ver}" >> $GITHUB_ENV From b6d46558dbd482d0d9c46ab53805d1803967b59c Mon Sep 17 00:00:00 2001 From: Dmitry Misharov Date: Mon, 16 Mar 2026 09:08:57 +0100 Subject: [PATCH 003/196] account newer openssl versions in .github/setup_ci.sh --- .github/setup_ci.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index e1b3dcf04a84..d3b3f2b0c0d3 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -143,7 +143,8 @@ for TARGET in $TARGETS; do case ${INSTALL_OPENSSL} in 1.1.1_stable) INSTALL_OPENSSL="OpenSSL_1_1_1-stable" ;; 1.*) INSTALL_OPENSSL="OpenSSL_$(echo ${INSTALL_OPENSSL} | tr . _)" ;; - 3.*) INSTALL_OPENSSL="openssl-${INSTALL_OPENSSL}" ;; + master) ;; + *) INSTALL_OPENSSL="openssl-${INSTALL_OPENSSL}" ;; esac PACKAGES="${PACKAGES} putty-tools dropbear-bin" ;; From 713ec5c5ae9b8ca91c3b752bec12e728612d13f4 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 16 Apr 2026 20:55:23 +1000 Subject: [PATCH 004/196] Test against OpenSSL 3.6.2, 4.0.0 and 4.0-stable. --- .github/workflows/c-cpp.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 02cd10bfbb6e..c9bafbb5e1f5 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -99,6 +99,8 @@ jobs: - { target: ubuntu-latest, config: openssl-3.5.0 } - { target: ubuntu-latest, config: openssl-3.5.3 } # keep - { target: ubuntu-latest, config: openssl-3.5.4 } + - { target: ubuntu-latest, config: openssl-3.6.2 } + - { target: ubuntu-latest, config: openssl-4.0.0 } - { target: ubuntu-latest, config: openssl-1.1.1_stable } - { target: ubuntu-latest, config: openssl-3.0 } # stable branch - { target: ubuntu-latest, config: openssl-3.1 } # stable branch @@ -107,6 +109,7 @@ jobs: - { target: ubuntu-latest, config: openssl-3.4 } # stable branch - { target: ubuntu-latest, config: openssl-3.5 } # stable branch - { target: ubuntu-latest, config: openssl-3.6 } # stable branch + - { target: ubuntu-latest, config: openssl-4.0 } # stable branch - { target: ubuntu-latest, config: putty-versions } - { target: ubuntu-latest, config: zlib-develop } - { target: ubuntu-latest, config: tcmalloc } From eb34f95206c3556e10046f091ea95431c4be84f8 Mon Sep 17 00:00:00 2001 From: Bob Beck Date: Thu, 16 Apr 2026 10:09:02 -0600 Subject: [PATCH 005/196] Make ci work for OpenSSL 4 variants --- .github/install_libcrypto.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/install_libcrypto.sh b/.github/install_libcrypto.sh index d1aa23450679..cef9416808d8 100755 --- a/.github/install_libcrypto.sh +++ b/.github/install_libcrypto.sh @@ -51,7 +51,7 @@ if [ "${abi_compat_test}" = "y" ]; then ver="${major}.$((${minor} + 1))" echo selecting next release branch ${ver} ;; - openssl-3.*.*) + openssl-[34].*.*) major=$(echo ${ver} | cut -f1 -d.) minor=$(echo ${ver} | cut -f2 -d.) patch=$(echo ${ver} | cut -f3 -d.) From 00d955cf9e2e09eb3e98ebf6b375adccb7f25842 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Tue, 7 Apr 2026 07:40:40 +0000 Subject: [PATCH 006/196] upstream: want stdint.h here now that we've switched from u_intXX_t -> uintXX_t OpenBSD-Commit-ID: 6d5e80bd6f29a9db18b18beeb1cbe5423b59de44 --- sshbuf.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sshbuf.h b/sshbuf.h index b8ccb7385389..5ad230b3789d 100644 --- a/sshbuf.h +++ b/sshbuf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf.h,v 1.35 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: sshbuf.h,v 1.36 2026/04/07 07:40:40 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -21,6 +21,7 @@ #include #include #include +#include #ifdef WITH_OPENSSL # include From ca19b95ab6cd4efe5f2d8a08a377a2ac0b9caca1 Mon Sep 17 00:00:00 2001 From: "job@openbsd.org" Date: Mon, 13 Apr 2026 08:18:33 +0000 Subject: [PATCH 007/196] upstream: Also show the duration of the current session through the ~I escape OK dtucker@ OpenBSD-Commit-ID: 695c1a09c4cc8b417a1bd3eb207b0cc7fa831c7a --- packet.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packet.c b/packet.c index 190a579d1e50..8c1d313c2179 100644 --- a/packet.c +++ b/packet.c @@ -1,4 +1,4 @@ -/* $OpenBSD: packet.c,v 1.334 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: packet.c,v 1.335 2026/04/13 08:18:33 job Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -161,6 +161,9 @@ struct session_state { /* Flag indicating whether this module has been initialized. */ int initialized; + /* Monotonic clock timestamp when the connection was started. */ + time_t start_time; + /* Set to true if the connection is interactive. */ int interactive_mode; @@ -312,6 +315,7 @@ ssh_packet_set_connection(struct ssh *ssh, int fd_in, int fd_out) return NULL; } state = ssh->state; + state->start_time = monotime(); state->connection_in = fd_in; state->connection_out = fd_out; if ((r = cipher_init(&state->send_context, none, @@ -3079,6 +3083,7 @@ connection_info_message(struct ssh *ssh) xasprintf(&ret, "Connection information for %s pid %lld\r\n" "%s" + " duration %s\r\n" " kexalgorithm %s\r\n hostkeyalgorithm %s\r\n" " cipher %s\r\n mac %s\r\n compression %s\r\n" " rekey %s %s\r\n" @@ -3086,6 +3091,7 @@ connection_info_message(struct ssh *ssh) "%s", thishost, (long long)getpid(), tcp_info, + fmt_timeframe(monotime() - state->start_time), kex->name, kex->hostkey_alg, cipher, mac, comp, rekey_volume, rekey_time, From 45b30e0a5439a02417a4fe982a4b16a9c126ba6b Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 19 Apr 2026 23:37:22 +0000 Subject: [PATCH 008/196] upstream: correctly set extended type for client-side channels. Fixes interactive vs bulk IPQoS for client->server traffic. ok job@ OpenBSD-Commit-ID: 34f5131face8d6dc4ae6955196e5fcafb3570cfe --- clientloop.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/clientloop.c b/clientloop.c index 6a0e7b6b8234..8f9d16ca867c 100644 --- a/clientloop.c +++ b/clientloop.c @@ -1,4 +1,4 @@ -/* $OpenBSD: clientloop.c,v 1.422 2026/03/05 05:40:35 djm Exp $ */ +/* $OpenBSD: clientloop.c,v 1.423 2026/04/19 23:37:22 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -2711,7 +2711,7 @@ client_session2_setup(struct ssh *ssh, int id, int want_tty, int want_subsystem, { size_t i, j, len; int matched, r; - char *name, *val; + char *type = NULL, *cmdstring = NULL, *name, *val; Channel *c = NULL; debug2_f("id %d", id); @@ -2786,19 +2786,21 @@ client_session2_setup(struct ssh *ssh, int id, int want_tty, int want_subsystem, len = sshbuf_len(cmd); if (len > 0) { + if ((cmdstring = sshbuf_dup_string(cmd)) == NULL) + fatal_f("sshbuf_dup_string failed"); if (len > 900) len = 900; if (want_subsystem) { - debug("Sending subsystem: %.*s", - (int)len, (const u_char*)sshbuf_ptr(cmd)); + debug("Sending subsystem: %.*s", (int)len, cmdstring); channel_request_start(ssh, id, "subsystem", 1); client_expect_confirm(ssh, id, "subsystem", CONFIRM_CLOSE); + xasprintf(&type, "session:subsystem:%s", cmdstring); } else { - debug("Sending command: %.*s", - (int)len, (const u_char*)sshbuf_ptr(cmd)); + debug("Sending command: %.*s", (int)len, cmdstring); channel_request_start(ssh, id, "exec", 1); client_expect_confirm(ssh, id, "exec", CONFIRM_CLOSE); + xasprintf(&type, "session:command"); } if ((r = sshpkt_put_stringb(ssh, cmd)) != 0 || (r = sshpkt_send(ssh)) != 0) @@ -2808,7 +2810,11 @@ client_session2_setup(struct ssh *ssh, int id, int want_tty, int want_subsystem, client_expect_confirm(ssh, id, "shell", CONFIRM_CLOSE); if ((r = sshpkt_send(ssh)) != 0) fatal_fr(r, "send shell"); + xasprintf(&type, "session:shell"); } + channel_set_xtype(ssh, id, type); + free(cmdstring); + free(type); session_setup_complete = 1; client_repledge(); From 7235471fb40705130d7f5816ec31ab562efc8cf9 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 25 Apr 2026 20:00:38 +1000 Subject: [PATCH 009/196] Check for OPENSSL_NO_ENGINE for --with-ssl-engine. OpenSSL 4 removes support for ENGINE, but it provides no-op stubs for the ENGINE functions in addition to setting OPENSSL_NO_ENGINE. The presence of the stubs fooled the old configure test, so if someone tried --with-ssl-engine with OpenSSL 4.0.0 it'd try but fail at build time. Explicitly check for OPENSSL_NO_ENGINE. before trying to enable ENGINE support. bz#3952. --- configure.ac | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/configure.ac b/configure.ac index a8e9df66bddc..dcb4c327eff4 100644 --- a/configure.ac +++ b/configure.ac @@ -3240,12 +3240,23 @@ if test "x$openssl" = "xyes" ; then ]) if test "x$openssl_engine" = "xyes" ; then + AC_CHECK_HEADERS([openssl/opensslconf.h openssl/configuration.h]) AC_MSG_CHECKING([for OpenSSL ENGINE support]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #ifdef HAVE_OPENSSL_OPENSSLCONF_H + # include + #endif + #ifdef HAVE_OPENSSL_CONFIGURATION_H + # include + #endif #include ]], [[ + #ifndef OPENSSL_NO_ENGINE ENGINE_load_builtin_engines(); ENGINE_register_all_complete(); + #else + #error "OPENSSL_NO_ENGINE" + #endif ]])], [ AC_MSG_RESULT([yes]) AC_DEFINE([USE_OPENSSL_ENGINE], [1], From 1afbd7bd1fb71e8b1d06f99978d439aec59dddca Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 27 Apr 2026 20:51:17 +1000 Subject: [PATCH 010/196] Re-enable SHA1 sigs in OpenSSL on Cygwin for tests. Recently Cygwin imported changes from Fedora which disable SHA1 signatures by default. This breaks the unit tests (and a couple of regression tests), so set rh-allow-sha1-signatures=yes in the OpenSSL config to re-enable them. --- .github/setup_ci.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index d3b3f2b0c0d3..5d85aa054d07 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -30,6 +30,10 @@ case "$host" in takeown /F regress icacls regress set +x + echo Enabling OpenSSL rh-allow-sha1-signatures for unit tests. + cp /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf.bak + sed -i -e '/\[ default_modules \]/a alg_section = evp_properties\n[evp_properties]\nrh-allow-sha1-signatures = yes\n' /etc/pki/tls/openssl.cnf + diff -u /etc/pki/tls/openssl.cnf.bak /etc/pki/tls/openssl.cnf PACKAGES="$PACKAGES,autoconf,automake,cygwin-devel,gcc-core" PACKAGES="$PACKAGES,make,openssl,libssl-devel,zlib-devel" ;; From 8751cd9c5cac7b358b5648df0510b3f53b95fc22 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 20 Apr 2026 22:55:48 +1000 Subject: [PATCH 011/196] Add tests for libressl-4.3.1. --- .github/workflows/c-cpp.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index c9bafbb5e1f5..dc0e8c415800 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -83,6 +83,7 @@ jobs: - { target: ubuntu-latest, config: libressl-4.0.1 } - { target: ubuntu-latest, config: libressl-4.1.1 } - { target: ubuntu-latest, config: libressl-4.2.0 } + - { target: ubuntu-latest, config: libressl-4.3.1 } - { target: ubuntu-latest, config: openssl-master } - { target: ubuntu-latest, config: openssl-noec } - { target: ubuntu-latest, config: openssl-1.1.1 } From ba110a56a7180fef18e02dfaccad97cc510a558f Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 20 Apr 2026 22:46:17 +1000 Subject: [PATCH 012/196] Allow setting TEST_SSH_TRACE via Github. --- .github/workflows/c-cpp.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index dc0e8c415800..76faedb1f8d8 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -9,6 +9,7 @@ name: CI # fail immediately. # # LTESTS: Override the set of tests run. +# TEST_SSH_TRACE: Set to yes for additional regress output. on: push: @@ -158,6 +159,7 @@ jobs: env: TEST_SSH_UNSAFE_PERMISSIONS: 1 TEST_SSH_HOSTBASED_AUTH: yes + TEST_SSH_TRACE: ${{ vars.TEST_SSH_TRACE }} LTESTS: ${{ vars.LTESTS }} - name: test OpenSSL3 ABI compatibility if: ${{ startsWith(matrix.config, 'openssl-3') }} From 6c5235cb6692415e475fea4c0b69ee7ea0af8055 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 20 Apr 2026 18:45:37 +1000 Subject: [PATCH 013/196] Reorder steps to change perms before displaying. --- .github/workflows/c-cpp.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 76faedb1f8d8..97be7eb638fc 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -166,12 +166,12 @@ jobs: run: | sh .github/install_libcrypto.sh -a ${{ matrix.config }} /opt/openssl sh .github/run_test.sh ${{ matrix.config }} - - name: show logs - if: failure() - run: for i in regress/failed*.log; do echo ====; echo logfile $i; echo =====; cat $i; done - name: chown logs if: failure() - run: test -x "$(which sudo 2>&1)" && sudo chown -R "${LOGNAME}" regress + run: sh -c 'SUDO="$(which sudo 2>/dev/null)"; $SUDO chown -R "${LOGNAME}" regress' + - name: show logs + if: failure() + run: sh -c "for i in regress/failed*.log; do echo ====; echo logfile $i; echo =====; cat $i; done" - name: save logs if: failure() uses: actions/upload-artifact@main From 4e0d1aea897d77d3b93e191eda58436e44a53818 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 20 Apr 2026 18:47:23 +1000 Subject: [PATCH 014/196] Simplify Cygwin permissions setting. --- .github/setup_ci.sh | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index 5d85aa054d07..fca8591a70b9 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -20,16 +20,13 @@ case "$host" in PACKAGER=setup echo Setting CYGWIN system environment variable. setx CYGWIN "winsymlinks:native" - echo Removing extended ACLs so umask works as expected. - set -x - setfacl -b . regress - icacls regress /c /t /q /Inheritance:d - icacls regress /c /t /q /Grant ${USERNAME}:F - icacls regress /c /t /q /Remove:g "Authenticated Users" \ - BUILTIN\\Administrators BUILTIN Everyone System Users - takeown /F regress + echo Removing extended ACLs on regress so umask works as expected. + echo "Original ACLs" + icacls regress + setfacl -b regress + icacls regress /c /t /q /grant 'BUILTIN\Administrators:(RX)' + echo "Modifiled ACLs" icacls regress - set +x echo Enabling OpenSSL rh-allow-sha1-signatures for unit tests. cp /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf.bak sed -i -e '/\[ default_modules \]/a alg_section = evp_properties\n[evp_properties]\nrh-allow-sha1-signatures = yes\n' /etc/pki/tls/openssl.cnf From b41203e500e067095ef64a8de8ca4417a6f39552 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 27 Apr 2026 21:16:56 +1000 Subject: [PATCH 015/196] Comment out new PAM valgrind test until debugged. --- .github/workflows/c-cpp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 97be7eb638fc..af6dab1ddb1d 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -64,7 +64,7 @@ jobs: - { target: ubuntu-22.04, config: valgrind-2 } - { target: ubuntu-22.04, config: valgrind-3 } - { target: ubuntu-22.04, config: valgrind-4 } - - { target: ubuntu-22.04, config: valgrind-pam-1 } + # - { target: ubuntu-22.04, config: valgrind-pam-1 } - { target: ubuntu-22.04, config: valgrind-unit } - { target: ubuntu-22.04, config: without-openssl } - { target: ubuntu-latest, config: gcc-14 } From 2be9cec2fc062ffa087db55d26203db8f1567661 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 27 Apr 2026 21:53:36 +1000 Subject: [PATCH 016/196] Update OpenSSL tested versions. --- .github/workflows/c-cpp.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index af6dab1ddb1d..ddfd4343d6f5 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -95,12 +95,12 @@ jobs: - { target: ubuntu-latest, config: openssl-3.1.0 } - { target: ubuntu-latest, config: openssl-3.1.8 } - { target: ubuntu-latest, config: openssl-3.2.6 } - - { target: ubuntu-latest, config: openssl-3.3.5 } + - { target: ubuntu-latest, config: openssl-3.3.7 } - { target: ubuntu-latest, config: openssl-3.4.0 } - - { target: ubuntu-latest, config: openssl-3.4.3 } + - { target: ubuntu-latest, config: openssl-3.4.5 } - { target: ubuntu-latest, config: openssl-3.5.0 } - { target: ubuntu-latest, config: openssl-3.5.3 } # keep - - { target: ubuntu-latest, config: openssl-3.5.4 } + - { target: ubuntu-latest, config: openssl-3.5.6 } - { target: ubuntu-latest, config: openssl-3.6.2 } - { target: ubuntu-latest, config: openssl-4.0.0 } - { target: ubuntu-latest, config: openssl-1.1.1_stable } From ff254f67401fb27e6ae81a266f2d41d4c16bdbba Mon Sep 17 00:00:00 2001 From: "claudio@openbsd.org" Date: Thu, 23 Apr 2026 12:57:47 +0000 Subject: [PATCH 017/196] upstream: Drop -Winline from CDIAGFLAGS it breaks on sparc64 On sparc64 ssh/unittests/kex fails to build with: usr.bin/ssh/libcrux_mlkem768_sha3.h:8196: warning: inlining failed in call to 'libcrux_ml_kem_polynomial_ZERO_89_ea': --param max-inline-insns-single limit reached OK djm@ (long time ago) reminded by tb@ OpenBSD-Regress-ID: c32094e3436536474039a4aeefabdbf0bd826554 --- regress/unittests/Makefile.inc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/regress/unittests/Makefile.inc b/regress/unittests/Makefile.inc index a5c2e8c21188..3c713c74e9d7 100644 --- a/regress/unittests/Makefile.inc +++ b/regress/unittests/Makefile.inc @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile.inc,v 1.19 2025/10/23 19:06:10 miod Exp $ +# $OpenBSD: Makefile.inc,v 1.20 2026/04/23 12:57:47 claudio Exp $ .include .include @@ -35,7 +35,6 @@ CDIAGFLAGS+= -Wcomment CDIAGFLAGS+= -Wformat CDIAGFLAGS+= -Wformat-security CDIAGFLAGS+= -Wimplicit -CDIAGFLAGS+= -Winline CDIAGFLAGS+= -Wmissing-declarations CDIAGFLAGS+= -Wmissing-prototypes CDIAGFLAGS+= -Wold-style-definition From 2029eddf4d57c654d53cdac7a192511de3b386dd Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Mon, 27 Apr 2026 05:49:41 +0000 Subject: [PATCH 018/196] upstream: Use supported hostkeyalgorithms specifically in sshd_config instead of supported key types, which is almost but not completely correct. OpenBSD-Regress-ID: 43c3b348576900f3e710bff5d6a87f0e803c5b3d --- regress/keyscan.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/regress/keyscan.sh b/regress/keyscan.sh index 75a14ee0eecb..411c8222fdab 100644 --- a/regress/keyscan.sh +++ b/regress/keyscan.sh @@ -1,9 +1,11 @@ -# $OpenBSD: keyscan.sh,v 1.13 2020/01/22 07:31:27 dtucker Exp $ +# $OpenBSD: keyscan.sh,v 1.14 2026/04/27 05:49:41 dtucker Exp $ # Placed in the Public Domain. tid="keyscan" -for i in $SSH_KEYTYPES; do +# Enable all supported host key algos. +algs="" +for i in `$SSH -Q HostKeyAlgorithms`; do if [ -z "$algs" ]; then algs="$i" else From 6185d1e6f74fb7749ff0227dfe44b2c3a9dd0885 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 28 Apr 2026 09:09:57 +1000 Subject: [PATCH 019/196] Rename obsd arm64 snapshot VM for consistency. --- .github/workflows/selfhosted.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/selfhosted.yml b/.github/workflows/selfhosted.yml index aa01c8b296a9..008fa60f8ee8 100644 --- a/.github/workflows/selfhosted.yml +++ b/.github/workflows/selfhosted.yml @@ -88,7 +88,7 @@ jobs: - { target: nbsd10, config: pam, host: libvirt } - { target: omnios, config: pam, host: libvirt } # ARM64 VMs - - { target: obsd-arm64, config: default, host: libvirt-arm64 } + - { target: obsdsnap-arm64, config: default, host: libvirt-arm64 } # VMs with persistent disks that have their own runner. - { target: win10, config: default, host: persist-win10 } - { target: win10, config: cygwin-release, host: persist-win10 } From b9ccca0edfbd46b3114192956d9aaea3e7bc3c08 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Wed, 29 Apr 2026 09:14:31 +1000 Subject: [PATCH 020/196] Add tracking for 10.3 branch. --- .github/ci-status.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/ci-status.md b/.github/ci-status.md index 00a1db0df76a..b38c67a300e2 100644 --- a/.github/ci-status.md +++ b/.github/ci-status.md @@ -8,6 +8,11 @@ master : [![Coverity Status](https://scan.coverity.com/projects/21341/badge.svg)](https://scan.coverity.com/projects/openssh-portable)
+10.3 : +[![C/C++ CI](../../../actions/workflows/c-cpp.yml/badge.svg?branch=V_10_3)](../../../actions/workflows/c-cpp.yml?query=branch:V_10_3) +[![VM CI](../../../actions/workflows/vm.yml/badge.svg?branch=V_10_3)](../../../actions/workflows/vm.yml?query=branch:V_10_3) +[![C/C++ CI self-hosted](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml/badge.svg?branch=V_10_3)](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml?query=branch:V_10_3) + 10.2 : [![C/C++ CI](../../../actions/workflows/c-cpp.yml/badge.svg?branch=V_10_2)](../../../actions/workflows/c-cpp.yml?query=branch:V_10_2) [![VM CI](../../../actions/workflows/vm.yml/badge.svg?branch=V_10_2)](../../../actions/workflows/vm.yml?query=branch:V_10_2) From f24dc9e993de6f99d5dcb06ba3a401fe5792b2f4 Mon Sep 17 00:00:00 2001 From: "job@openbsd.org" Date: Mon, 20 Apr 2026 07:43:52 +0000 Subject: [PATCH 021/196] upstream: Clarify comment on what setting extended types for channels does OK djm@ OpenBSD-Commit-ID: fa035fb19b74571992fa3adca4396a4c572a7a8a --- channels.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/channels.c b/channels.c index d7c55fc899d4..0d4cc08068cd 100644 --- a/channels.c +++ b/channels.c @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.458 2026/03/28 05:16:18 djm Exp $ */ +/* $OpenBSD: channels.c,v 1.459 2026/04/20 07:43:52 job Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -368,7 +368,7 @@ channel_classify(struct ssh *ssh, Channel *c) /* * Sets "extended type" of a channel; used by session layer to add additional * information about channel types (e.g. shell, login, subsystem) that can then - * be used to select timeouts. + * be used to select timeouts and DSCP values. * Will reset c->inactive_deadline as a side-effect. */ void From 1bfe4ce37c3c531150b33d1a9d4dae6234028076 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Tue, 28 Apr 2026 21:32:05 +0000 Subject: [PATCH 022/196] upstream: unveil the actual listening socket path and its directory so it can be cleaned up at exit. Reported by / tested by David Krause, ok markus@ OpenBSD-Commit-ID: b45d740e9a63dec0fad436ed78f6912b39f0cd53 --- ssh-agent.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ssh-agent.c b/ssh-agent.c index c73abd1d08f8..b8cecd234903 100644 --- a/ssh-agent.c +++ b/ssh-agent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-agent.c,v 1.324 2026/03/10 07:27:14 djm Exp $ */ +/* $OpenBSD: ssh-agent.c,v 1.325 2026/04/28 21:32:05 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -2572,6 +2572,14 @@ main(int ac, char **av) sigaddset(&nsigset, SIGTERM); sigaddset(&nsigset, SIGUSR1); + if (socket_name != NULL && unveil(socket_name, "c") == -1) { + fatal("%s: unveil %s %s", __progname, socket_name, + strerror(errno)); + } + if (*socket_dir != '\0' && unveil(socket_dir, "c") == -1) { + fatal("%s: unveil %s %s", __progname, socket_dir, + strerror(errno)); + } if (unveil("/", "r") == -1) fatal("%s: unveil /: %s", __progname, strerror(errno)); if ((ccp = getenv("SSH_SK_HELPER")) == NULL || *ccp == '\0') From 1c553a16065a95284468cd79b1c4919929dfe3ac Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 29 Apr 2026 22:22:10 +0000 Subject: [PATCH 023/196] upstream: fiddle with mask after umask call and not before; avoids fortify warnings on android. bz3954 OpenBSD-Commit-ID: 82224426b2ee989c68f305caa50aa3d3b4993a84 --- scp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scp.c b/scp.c index 1faa9a555744..621db83c02d1 100644 --- a/scp.c +++ b/scp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: scp.c,v 1.273 2026/04/02 07:42:16 djm Exp $ */ +/* $OpenBSD: scp.c,v 1.274 2026/04/29 22:22:10 djm Exp $ */ /* * scp - secure remote copy. This is basically patched BSD rcp which * uses ssh to do the data transfer (instead of using rcmd). @@ -1679,8 +1679,8 @@ sink(int argc, char **argv, const char *src) setimes = targisdir = 0; mask = umask(0); if (!pflag) { - mask |= 07000; (void) umask(mask); + mask |= 07000; } if (argc != 1) { run_err("ambiguous target"); From 7ab5e4073a508a342be49e2c238087b2de4e099f Mon Sep 17 00:00:00 2001 From: Renaud Allard Date: Sat, 21 Mar 2026 19:23:04 +0100 Subject: [PATCH 024/196] vm.yml: fix solaris PAM tests Add missing SSHD_CONFOPTS="UsePam yes" to the solaris PAM test step so it actually tests PAM functionality instead of re-running the default tests with a PAM-enabled binary. --- .github/workflows/vm.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index 5d12fb9e52e2..11edae16b26c 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -466,5 +466,5 @@ jobs: shell: solaris {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder make tests + sudo -u builder env SSHD_CONFOPTS="UsePam yes" make tests From 5fa60ae0d2ed3fc441f54c9349afbd63b6301929 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 1 May 2026 09:19:56 +1000 Subject: [PATCH 025/196] Remove 9.9 and 10.0 branches from build status page. --- .github/ci-status.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/ci-status.md b/.github/ci-status.md index b38c67a300e2..5d17f893761d 100644 --- a/.github/ci-status.md +++ b/.github/ci-status.md @@ -23,10 +23,3 @@ master : [![VM CI](../../../actions/workflows/vm.yml/badge.svg?branch=V_10_1)](../../../actions/workflows/vm.yml?query=branch:V_10_1) [![C/C++ CI self-hosted](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml/badge.svg?branch=V_10_1)](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml?query=branch:V_10_1) -10.0 : -[![C/C++ CI](../../../actions/workflows/c-cpp.yml/badge.svg?branch=V_10_0)](../../../actions/workflows/c-cpp.yml?query=branch:V_10_0) -[![C/C++ CI self-hosted](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml/badge.svg?branch=V_10_0)](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml?query=branch:V_10_0) - -9.9 : -[![C/C++ CI](../../../actions/workflows/c-cpp.yml/badge.svg?branch=V_9_9)](../../../actions/workflows/c-cpp.yml?query=branch:V_9_9) -[![C/C++ CI self-hosted](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml/badge.svg?branch=V_9_9)](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml?query=branch:V_9_9) From 328993c8991e5cde61f5abf1b87b26fa2537ae6c Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 4 May 2026 16:05:34 +1000 Subject: [PATCH 026/196] skip ("#if 0") strvisx and stravis we don't use the in OpenSSH and some compilers throw warnings compiling them that break -Werror --- openbsd-compat/vis.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openbsd-compat/vis.c b/openbsd-compat/vis.c index 0e04ed025dde..c216282e8a9f 100644 --- a/openbsd-compat/vis.c +++ b/openbsd-compat/vis.c @@ -213,6 +213,7 @@ strnvis(char *dst, const char *src, size_t siz, int flag) return (dst - start); } +#if 0 /* unused in OpenSSH */ int stravis(char **outp, const char *src, int flag) { @@ -247,5 +248,6 @@ strvisx(char *dst, const char *src, size_t len, int flag) *dst = '\0'; return (dst - start); } +#endif /* unused */ #endif From cb654c2ce7b0113a14aba979ffe9f7f5ad312013 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 4 May 2026 17:41:37 +1000 Subject: [PATCH 027/196] Add RUN_ONLY_PLATFORM to run a subset of tests. --- .github/workflows/vm.yml | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index 11edae16b26c..0c9fa3336ff3 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -2,11 +2,7 @@ # Security -> Actions -> Variables) to restrict the tests that are run # The supported variables are: # -# RUN_ONLY_TARGET_CONFIG: Run only the single matching target and config, -# separated by spaces, eg "ubuntu-latest default". All other tests will -# fail immediately. -# -# LTESTS: Override the set of tests run. +# RUN_ONLY_PLATFORM: run only tests on specified platform. name: CI VM on: @@ -18,7 +14,7 @@ on: jobs: dragonflybsd: name: "dragonflybsd-${{ matrix.target }}" - if: github.repository != 'openssh/openssh-portable-selfhosted' + if: github.repository != 'openssh/openssh-portable-selfhosted' && (vars.RUN_ONLY_PLATFORM == '' || vars.RUN_ONLY_PLATFORM == 'dragonflybsd') strategy: fail-fast: false matrix: @@ -78,7 +74,7 @@ jobs: freebsd: name: "freebsd-${{ matrix.target }}" - if: github.repository != 'openssh/openssh-portable-selfhosted' + if: github.repository != 'openssh/openssh-portable-selfhosted' && (vars.RUN_ONLY_PLATFORM == '' || vars.RUN_ONLY_PLATFORM == 'freebsd') strategy: fail-fast: false matrix: @@ -141,7 +137,7 @@ jobs: netbsd: name: "netbsd-${{ matrix.target }}" - if: github.repository != 'openssh/openssh-portable-selfhosted' + if: github.repository != 'openssh/openssh-portable-selfhosted' && (vars.RUN_ONLY_PLATFORM == '' || vars.RUN_ONLY_PLATFORM == 'netbsd') strategy: fail-fast: false matrix: @@ -205,7 +201,7 @@ jobs: omnios: name: "omnios-${{ matrix.target }}" - if: github.repository != 'openssh/openssh-portable-selfhosted' + if: github.repository != 'openssh/openssh-portable-selfhosted' && (vars.RUN_ONLY_PLATFORM == '' || vars.RUN_ONLY_PLATFORM == 'omnios') strategy: fail-fast: false matrix: @@ -256,7 +252,7 @@ jobs: openbsd: name: "openbsd-${{ matrix.target }}" - if: github.repository != 'openssh/openssh-portable-selfhosted' + if: github.repository != 'openssh/openssh-portable-selfhosted' && (vars.RUN_ONLY_PLATFORM == '' || vars.RUN_ONLY_PLATFORM == 'openbsd') strategy: fail-fast: false matrix: @@ -312,7 +308,7 @@ jobs: # plaform (the latest snapshot) and most recent upstream code (or at least # the most recent code in the github mirror) instead of OpenSSH Portable. name: "openbsd-current-upstream" - if: github.repository != 'openssh/openssh-portable-selfhosted' + if: github.repository != 'openssh/openssh-portable-selfhosted' && (vars.RUN_ONLY_PLATFORM == '' || vars.RUN_ONLY_PLATFORM == 'openbsd') strategy: fail-fast: false runs-on: ubuntu-latest @@ -408,7 +404,7 @@ jobs: solaris: name: "solaris-${{ matrix.target }}" - if: github.repository != 'openssh/openssh-portable-selfhosted' + if: github.repository != 'openssh/openssh-portable-selfhosted' && (vars.RUN_ONLY_PLATFORM == '' || vars.RUN_ONLY_PLATFORM == 'solaris') strategy: fail-fast: false matrix: From 05af6553e9026df935163a12d14ff4d205465717 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 4 May 2026 18:47:03 +1000 Subject: [PATCH 028/196] Add Solaris 11.4-clang-19 test. --- .github/workflows/vm.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index 0c9fa3336ff3..2465e1ec9767 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -410,6 +410,7 @@ jobs: matrix: target: - "11.4-gcc" + - "11.4-clang-19" config: [default] runs-on: ubuntu-latest steps: From f9d62eaa536cba92bcb42658ff5f72c287c47e49 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 4 May 2026 21:39:01 +1000 Subject: [PATCH 029/196] Only run t-exec when re-testing with PAM. There's no point rerunning unit tests. --- .github/workflows/vm.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index 2465e1ec9767..505781b31887 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -66,11 +66,11 @@ jobs: - name: "PAM: make" shell: dragonflybsd {0} run: cd $GITHUB_WORKSPACE && sudo -u builder make -j4 - - name: "PAM: make tests" + - name: "PAM: make t-exec" shell: dragonflybsd {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo SSHD_CONFOPTS="UsePam yes" make tests + sudo -u builder env SUDO=sudo SSHD_CONFOPTS="UsePam yes" make t-exec freebsd: name: "freebsd-${{ matrix.target }}" @@ -128,11 +128,11 @@ jobs: - name: "PAM: make" shell: freebsd {0} run: cd $GITHUB_WORKSPACE && sudo -u builder make -j4 - - name: "PAM: make tests" + - name: "PAM: make t-exec" shell: freebsd {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo SSHD_CONFOPTS="UsePam yes" make tests + sudo -u builder env SUDO=sudo SSHD_CONFOPTS="UsePam yes" make t-exec netbsd: @@ -192,11 +192,11 @@ jobs: - name: "PAM: make" shell: netbsd {0} run: cd $GITHUB_WORKSPACE && sudo -u builder make -j4 - - name: "PAM: make tests" + - name: "PAM: make t-exec" shell: netbsd {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo SSHD_CONFOPTS="UsePam yes" make tests + sudo -u builder env SUDO=sudo SSHD_CONFOPTS="UsePam yes" make t-exec omnios: From 6296749fe19a14d11826dd04591ebb84c110e96b Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 4 May 2026 21:40:52 +1000 Subject: [PATCH 030/196] Improve Solaris PAM tests. - Set up and run tests with SUDO. - Set random password to use for password & kbdint auth tests. - Only run t-exec when re-testing with PAM, don't rerun unit tests. - When testing PAM builds, test with and without UsePAM. --- .github/workflows/vm.yml | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index 505781b31887..05721f55610d 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -424,11 +424,21 @@ jobs: release: ${{ matrix.target }} usesh: true prepare: | - set -x + echo Setting up user builder. useradd -m builder + openssl rand -base64 9 >$GITHUB_WORKSPACE/regress/password + chown builder $GITHUB_WORKSPACE/regress/password + pw=$(tr -d '\n' <$GITHUB_WORKSPACE/regress/password | openssl passwd -6 -stdin) + passwd -p "$pw" builder + echo Setting up sudo. sed -e "s/^root.*ALL$/root ALL=(ALL) NOPASSWD: ALL/" /etc/sudoers >>/tmp/sudoers mv /tmp/sudoers /etc/sudoers - echo "builder ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers + echo "builder ALL=(ALL) NOPASSWD: ALL" >/etc/sudoers.d/builder + echo 'Testing sudo config for root->builder.' + sudo -u builder id + echo 'Testing sudo config for builder->root.' + sudo -u builder sudo id + echo Creating directories. mkdir -p /var/empty /usr/local/etc cp $GITHUB_WORKSPACE/moduli /usr/local/etc/moduli @@ -448,7 +458,7 @@ jobs: shell: solaris {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder make tests + sudo -u builder env SUDO=sudo make tests - name: "PAM: configure" shell: solaris {0} @@ -459,9 +469,15 @@ jobs: - name: "PAM: make" shell: solaris {0} run: cd $GITHUB_WORKSPACE && sudo -u builder make - - name: "PAM: make tests" + - name: "PAM: make t-exec UsePAM=no" + shell: solaris {0} + run: | + cd $GITHUB_WORKSPACE + sudo -u builder env SUDO=sudo make t-exec + - name: "PAM: make t-exec UsePAM=yes" shell: solaris {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder env SSHD_CONFOPTS="UsePam yes" make tests + cp regress/password regress/kbdintpw + sudo -u builder env SUDO=sudo TEST_SSH_SSHD_CONFOPTS="UsePam yes" make t-exec From a05de3f67f69582e061445d5d78e5fcd01067299 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 4 May 2026 22:57:58 +1000 Subject: [PATCH 031/196] Update to FreeBSD 14.4, add 15.0. --- .github/workflows/vm.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index 05721f55610d..2d0120f17e11 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -80,8 +80,8 @@ jobs: matrix: target: - "13.5" - - "14.3" - # - "15.0" # "pkg" breaks with a libutil.so error... + - "14.4" + - "15.0" config: [default] runs-on: ubuntu-latest steps: From 504d01d81fe0d17725786b05737db9cd7f3b2b5c Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 4 May 2026 23:15:05 +1000 Subject: [PATCH 032/196] Improve FreeBSD PAM tests. - Set random password and use for password auth test. - When testing PAM builds, test with and without UsePAM. --- .github/workflows/vm.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index 2d0120f17e11..f6fb05a91b9e 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -96,7 +96,9 @@ jobs: usesh: true prepare: | pkg install -y sudo - pw useradd builder -m + openssl rand -base64 9 >$GITHUB_WORKSPACE/regress/password + pw useradd builder -m -h0 <$GITHUB_WORKSPACE/regress/password + chown builder $GITHUB_WORKSPACE/regress/password echo "builder ALL=(ALL:ALL) NOPASSWD: ALL" >>/usr/local/etc/sudoers mkdir -p /var/empty /usr/local/etc cp $GITHUB_WORKSPACE/moduli /usr/local/etc/moduli @@ -117,7 +119,7 @@ jobs: shell: freebsd {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo make tests + sudo -u builder env SUDO=sudo make tests SKIP_LTESTS=scp3 - name: "PAM: configure" shell: freebsd {0} @@ -128,11 +130,17 @@ jobs: - name: "PAM: make" shell: freebsd {0} run: cd $GITHUB_WORKSPACE && sudo -u builder make -j4 - - name: "PAM: make t-exec" + - name: "PAM: make t-exec UsePAM=no" shell: freebsd {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo SSHD_CONFOPTS="UsePam yes" make t-exec + sudo -u builder env SUDO=sudo make t-exec SKIP_LTESTS=scp3 + - name: "PAM: make t-exec UsePAM=yes" + shell: freebsd {0} + run: | + cd $GITHUB_WORKSPACE + cp regress/password regress/kbdintpw + sudo -u builder env SUDO=sudo TEST_SSH_SSHD_CONFOPTS="UsePam yes" make t-exec SKIP_LTESTS=scp3 netbsd: From 4ea08a0353f85b5b0cc1ddd70da5fa23e7d588a4 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 4 May 2026 23:33:57 +1000 Subject: [PATCH 033/196] Improve NetBSD PAM tests. - Set random password and use for password auth test. - When testing PAM builds, test with and without UsePAM. --- .github/workflows/vm.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index f6fb05a91b9e..7d5161b5bb6b 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -168,7 +168,9 @@ jobs: usesh: true prepare: | /usr/sbin/pkg_add sudo - /usr/sbin/useradd -m builder + openssl rand -base64 9 >$GITHUB_WORKSPACE/regress/password + pw=$(tr -d '\n' <$GITHUB_WORKSPACE/regress/password | pwhash) + /usr/sbin/useradd -m -p "${pw}" builder echo "builder ALL=(ALL:ALL) NOPASSWD: ALL" >>/usr/pkg/etc/sudoers mkdir -p /var/empty /usr/local/etc cp $GITHUB_WORKSPACE/moduli /usr/local/etc/moduli @@ -200,11 +202,17 @@ jobs: - name: "PAM: make" shell: netbsd {0} run: cd $GITHUB_WORKSPACE && sudo -u builder make -j4 - - name: "PAM: make t-exec" + - name: "PAM: make t-exec UsePAM=no" shell: netbsd {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo SSHD_CONFOPTS="UsePam yes" make t-exec + sudo -u builder env SUDO=sudo make t-exec + - name: "PAM: make t-exec UsePAM=yes" + shell: netbsd {0} + run: | + cd $GITHUB_WORKSPACE + cp regress/password regress/kbdintpw + sudo -u builder env SUDO=sudo TEST_SSH_SSHD_CONFOPTS="UsePam yes" make t-exec omnios: From 3754f2edd42039ace7d53873975870fbe9143b94 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Tue, 5 May 2026 05:34:27 +0000 Subject: [PATCH 034/196] upstream: classify dynamic-tcpip channels as bulk, not interactive; bz3958, ok markus@ OpenBSD-Commit-ID: b18f1c1eaff8423bf069ff6103e8865cec18d64b --- channels.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/channels.h b/channels.h index 2fcf9f8cb72b..84112cfa43bf 100644 --- a/channels.h +++ b/channels.h @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.h,v 1.164 2026/03/05 05:40:35 djm Exp $ */ +/* $OpenBSD: channels.h,v 1.165 2026/05/05 05:34:27 djm Exp $ */ /* * Author: Tatu Ylonen @@ -84,7 +84,8 @@ /* default pattern-lists used to classify channel types as bulk */ #define CHANNEL_BULK_TTY "" -#define CHANNEL_BULK_NOTTY "direct-*,forwarded-*,tun-*,x11-*,session*" +#define CHANNEL_BULK_NOTTY "direct-*,forwarded-*,dynamic-*," + "tun-*,x11-*,session*" struct ssh; struct Channel; From ac4a41265a3beccba7dc6f45c657298311280f01 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Tue, 5 May 2026 06:21:14 +0000 Subject: [PATCH 035/196] upstream: unbreak; spotted by Darren's test army OpenBSD-Commit-ID: e95ceda842a2c7a08fc00ac3a529877d87fee7b2 --- channels.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/channels.h b/channels.h index 84112cfa43bf..2ce972b2a66a 100644 --- a/channels.h +++ b/channels.h @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.h,v 1.165 2026/05/05 05:34:27 djm Exp $ */ +/* $OpenBSD: channels.h,v 1.166 2026/05/05 06:21:14 djm Exp $ */ /* * Author: Tatu Ylonen @@ -84,7 +84,7 @@ /* default pattern-lists used to classify channel types as bulk */ #define CHANNEL_BULK_TTY "" -#define CHANNEL_BULK_NOTTY "direct-*,forwarded-*,dynamic-*," +#define CHANNEL_BULK_NOTTY "direct-*,forwarded-*,dynamic-*," \ "tun-*,x11-*,session*" struct ssh; From 56e73cd804cff08e38caaa03b75bec253f16fd62 Mon Sep 17 00:00:00 2001 From: Darafei Praliaskouski Date: Sat, 9 May 2026 19:50:31 +0400 Subject: [PATCH 036/196] ci: avoid rsync dependency in NetBSD VM jobs --- .github/workflows/vm.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index 7d5161b5bb6b..2aed986518db 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -166,7 +166,12 @@ jobs: with: release: ${{ matrix.target }} usesh: true + sync: scp + copyback: false prepare: | + case "$(uname -r)" in + 9.*) export PKG_PATH="ftp://ftp.NetBSD.org/pub/pkgsrc/packages/NetBSD/$(uname -p)/9.0_2026Q1/All" ;; + esac /usr/sbin/pkg_add sudo openssl rand -base64 9 >$GITHUB_WORKSPACE/regress/password pw=$(tr -d '\n' <$GITHUB_WORKSPACE/regress/password | pwhash) @@ -496,4 +501,3 @@ jobs: cd $GITHUB_WORKSPACE cp regress/password regress/kbdintpw sudo -u builder env SUDO=sudo TEST_SSH_SSHD_CONFOPTS="UsePam yes" make t-exec - From 67f31cefd8ccf0f55f24e806c4dc86b028fa65ff Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Tue, 12 May 2026 14:36:27 +1000 Subject: [PATCH 037/196] update getrrsetbyname.c from OpenBSD upstream revision 1.15 date: 2026/05/09 01:54:51; author: tb; state: Exp; lines: +14 -13; commitid: zZPVUWycKAslGJtO; Avoid recursive cleanup in getrrsetbyname() Instead of freeing struct dns_query and struct dns_rr by walking the linked lists recursively, use a simple loop. This avoids a possible stack exhaustion unlikely to be reachable with the limits modern resolvers impose. From Dhiraj Mishra --- openbsd-compat/getrrsetbyname.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/openbsd-compat/getrrsetbyname.c b/openbsd-compat/getrrsetbyname.c index ad35148c9298..36e558c2c624 100644 --- a/openbsd-compat/getrrsetbyname.c +++ b/openbsd-compat/getrrsetbyname.c @@ -595,27 +595,28 @@ parse_dns_rrsection(const u_char *answer, int size, const u_char **cp, static void free_dns_query(struct dns_query *p) { - if (p == NULL) - return; + struct dns_query *next; - if (p->name) + while (p != NULL) { + next = p->next; free(p->name); - free_dns_query(p->next); - free(p); + free(p); + p = next; + } } static void free_dns_rr(struct dns_rr *p) { - if (p == NULL) - return; + struct dns_rr *next; - if (p->name) + while (p != NULL) { + next = p->next; free(p->name); - if (p->rdata) free(p->rdata); - free_dns_rr(p->next); - free(p); + free(p); + p = next; + } } static void From ded80eb0ff89f18ccf25cd3dc7997d92d755ef6a Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 12 May 2026 18:05:24 +1000 Subject: [PATCH 038/196] Add VM test versions for : OmniOS and FreeBSD. Add OmniOS r151056 and r151058 (with build-essentials, so hopefully faster and lower dependency) and FreeBSD 12.4 for better coverage. --- .github/workflows/vm.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index 2aed986518db..4f659dba176f 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -79,6 +79,7 @@ jobs: fail-fast: false matrix: target: + - "12.4" - "13.5" - "14.4" - "15.0" @@ -227,8 +228,10 @@ jobs: fail-fast: false matrix: target: - - "r151054" - "r151046" + - "r151054" + - "r151056-build" + - "r151058-build" config: [default] runs-on: ubuntu-latest steps: From 99f1e0c2f91f00e0bb3c4a814ec448fda2b0e144 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 12 May 2026 18:50:20 +1000 Subject: [PATCH 039/196] OmniOS: check for gcc before installing. --- .github/workflows/vm.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index 4f659dba176f..8aa7b74ec8a8 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -246,8 +246,10 @@ jobs: usesh: true prepare: | set -x - pfexec pkg refresh - pfexec pkg install build-essential + if [ ! -x $(which gcc 2>/dev/null) ]; then + pfexec pkg refresh + pfexec pkg install build-essential + fi useradd -m builder sed -e "s/^root.*ALL$/root ALL=(ALL) NOPASSWD: ALL/" /etc/sudoers >>/tmp/sudoers mv /tmp/sudoers /etc/sudoers From 6d9116d4dfefe387e42250ec7c01aad56ce43bda Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 12 May 2026 19:43:48 +1000 Subject: [PATCH 040/196] Handle missing packages for FreeBSD 12.4. (Most) FreeBSD mirrors no longer have packages for 12.x, so install the only thing we need (sudo) from source on. --- .github/workflows/vm.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index 8aa7b74ec8a8..ec31aed11ea7 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -96,7 +96,16 @@ jobs: release: ${{ matrix.target }} usesh: true prepare: | - pkg install -y sudo + case $(uname -r) in + 12.*) + ftp ftp://ftp.sudo.ws/pub/sudo/sudo-1.8.32.tar.gz + tar xfz sudo-1.8.32.tar.gz + (cd sudo-1.8.32 && ./configure --sysconfdir=/usr/local/etc && make && make install) + ;; + *) + pkg install -y sudo + ;; + esac openssl rand -base64 9 >$GITHUB_WORKSPACE/regress/password pw useradd builder -m -h0 <$GITHUB_WORKSPACE/regress/password chown builder $GITHUB_WORKSPACE/regress/password From 55df196e39cb23fd53e42b2f07292ffc01650bff Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 12 May 2026 19:53:54 +1000 Subject: [PATCH 041/196] Retire OmniOS r151046 & r151054 test configs. They require packages from an external mirror which has been unreliable lately, so stop relying on it. --- .github/workflows/vm.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index ec31aed11ea7..4ac3b27a020b 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -237,8 +237,6 @@ jobs: fail-fast: false matrix: target: - - "r151046" - - "r151054" - "r151056-build" - "r151058-build" config: [default] From cf6c0b3b94cdc223f1b8be1ef2d93e993af5d976 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 13 May 2026 05:11:02 +0000 Subject: [PATCH 042/196] upstream: fix hard-to-reach NULL deref during pubkey auth To hit this, the user must be using a PEM style private key with no corresponding .pub key adjacent to it. OpenBSD-Commit-ID: b7150acc5322fa33f21491834d9471fbe3d30f20 --- sshconnect2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sshconnect2.c b/sshconnect2.c index 478a9a52fd38..5a48c73edbef 100644 --- a/sshconnect2.c +++ b/sshconnect2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect2.c,v 1.385 2026/04/02 07:48:13 djm Exp $ */ +/* $OpenBSD: sshconnect2.c,v 1.386 2026/05/13 05:11:02 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2008 Damien Miller. All rights reserved. @@ -1277,7 +1277,7 @@ identity_sign(struct identity *id, u_char **sigp, size_t *lenp, * PKCS#11 tokens may not support all signature algorithms, * so check what we get back. */ - if ((id->key->flags & SSHKEY_FLAG_EXT) != 0 && + if (id->key != NULL && (id->key->flags & SSHKEY_FLAG_EXT) != 0 && (r = sshkey_check_sigtype(*sigp, *lenp, alg)) != 0) { debug_fr(r, "sshkey_check_sigtype"); goto out; From 33392024f46e7aabaeaf947cc3b110d60a9fd9e3 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 13 May 2026 05:58:58 +0000 Subject: [PATCH 043/196] upstream: avoid validating bad cipher or mac lists in config files / commandline arguments as valid. Identified by SUSE and reported by Camila Camargo de Matos ok deraadt@ tb@ OpenBSD-Commit-ID: 45d51154f2418549e08b80fa33df6c6532046054 --- cipher.c | 8 +++++--- mac.c | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/cipher.c b/cipher.c index f770e666cf16..b42baf967740 100644 --- a/cipher.c +++ b/cipher.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cipher.c,v 1.126 2026/02/14 00:18:34 jsg Exp $ */ +/* $OpenBSD: cipher.c,v 1.127 2026/05/13 05:58:58 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -206,6 +206,7 @@ ciphers_valid(const char *names) const struct sshcipher *c; char *cipher_list, *cp; char *p; + int found = 0; if (names == NULL || strcmp(names, "") == 0) return 0; @@ -217,10 +218,11 @@ ciphers_valid(const char *names) if (c == NULL || (c->flags & CFLAG_INTERNAL) != 0) { free(cipher_list); return 0; - } + } else + found = 1; } free(cipher_list); - return 1; + return found; } const char * diff --git a/mac.c b/mac.c index 17607830c5d2..30496b40272d 100644 --- a/mac.c +++ b/mac.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mac.c,v 1.38 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: mac.c,v 1.39 2026/05/13 05:58:58 djm Exp $ */ /* * Copyright (c) 2001 Markus Friedl. All rights reserved. * @@ -236,6 +236,7 @@ int mac_valid(const char *names) { char *maclist, *cp, *p; + int found = 0; if (names == NULL || strcmp(names, "") == 0) return 0; @@ -246,8 +247,9 @@ mac_valid(const char *names) if (mac_setup(NULL, p) < 0) { free(maclist); return 0; - } + } else + found = 1; } free(maclist); - return 1; + return found; } From 62fce76130485773c635da8adaeb7de78382a5f0 Mon Sep 17 00:00:00 2001 From: "tb@openbsd.org" Date: Mon, 18 May 2026 04:14:57 +0000 Subject: [PATCH 044/196] upstream: chacha: avoid -Wunterminated-string-initialization warning The sizes of sigma[] and tau[] aren't used, so include a trailing NUL and thereby avoid upsetting modern compilers about use of dangerous, valid C. ok deraadt djm OpenBSD-Commit-ID: 030a71ff16bb1e6135170c6507bc558eabe7345c --- chacha.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/chacha.c b/chacha.c index 9d79b661c159..de79b3729112 100644 --- a/chacha.c +++ b/chacha.c @@ -1,4 +1,4 @@ -/* $OpenBSD: chacha.c,v 1.2 2023/07/17 05:26:38 djm Exp $ */ +/* $OpenBSD: chacha.c,v 1.3 2026/05/18 04:14:57 tb Exp $ */ /* chacha-merged.c version 20080118 D. J. Bernstein @@ -48,8 +48,8 @@ typedef struct chacha_ctx chacha_ctx; a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); \ c = PLUS(c,d); b = ROTATE(XOR(b,c), 7); -static const char __attribute__ ((__nonstring__)) sigma[16] = "expand 32-byte k"; -static const char __attribute__ ((__nonstring__)) tau[16] = "expand 16-byte k"; +static const char sigma[] = "expand 32-byte k"; +static const char tau[] = "expand 16-byte k"; void chacha_keysetup(chacha_ctx *x,const u8 *k,u32 kbits) From e5c9cf9ac7543a5e59dabf11f993a9c032b9b71f Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Thu, 21 May 2026 02:50:59 +0000 Subject: [PATCH 045/196] upstream: mention usefulness of request type allow/denylisting for servers accepting untrusted clients OpenBSD-Commit-ID: 8b991bd263b46374a8e73f02d05cdccca73ae520 --- sftp-server.8 | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/sftp-server.8 b/sftp-server.8 index 5311bf9299fa..d9060ab9a7f7 100644 --- a/sftp-server.8 +++ b/sftp-server.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: sftp-server.8,v 1.31 2021/07/27 14:14:25 jmc Exp $ +.\" $OpenBSD: sftp-server.8,v 1.32 2026/05/21 02:50:59 djm Exp $ .\" .\" Copyright (c) 2000 Markus Friedl. All rights reserved. .\" @@ -22,7 +22,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 27 2021 $ +.Dd $Mdocdate: May 21 2026 $ .Dt SFTP-SERVER 8 .Os .Sh NAME @@ -109,6 +109,17 @@ The flag can be used to determine the supported request types. If both denied and allowed lists are specified, then the denied list is applied before the allowed list. +This flag, along with the +.Fl p +flag, may be used to disable operations that are irrelevant or undesirable +for the server. +For example, a +.Nm +that accepts connections from untrusted clients may wish to disable the +.Dq copy-data +or +.Dq users-groups-by-id +operations. .It Fl p Ar allowed_requests Specifies a comma-separated list of SFTP protocol requests that are permitted by the server. From a5a1b7e75389231bf817433d93f15732ba13c0ad Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Thu, 21 May 2026 04:04:57 +0000 Subject: [PATCH 046/196] upstream: mention that compression could potentially leak information about session contents (cf. the CRIME attack on TLS) if a connection allows attacker- controlled traffic over it alongside trused traffic. This might occur in some forwarding scenarios. with deraadt@ OpenBSD-Commit-ID: 03d145cdbf3a8713e8309724b5c9a9b76c317749 --- ssh_config.5 | 11 +++++++++-- sshd_config.5 | 11 +++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/ssh_config.5 b/ssh_config.5 index b459b0449709..50962fa719b1 100644 --- a/ssh_config.5 +++ b/ssh_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh_config.5,v 1.423 2026/03/23 01:33:46 djm Exp $ -.Dd $Mdocdate: March 23 2026 $ +.\" $OpenBSD: ssh_config.5,v 1.424 2026/05/21 04:04:57 djm Exp $ +.Dd $Mdocdate: May 21 2026 $ .Dt SSH_CONFIG 5 .Os .Sh NAME @@ -648,6 +648,13 @@ The argument must be or .Cm no (the default). +.Pp +Compression applies to all traffic that flows over the SSH connection. +If untrusted traffic (such as an open port-forward) is permitted over the +connection alongside trusted traffic, then compression may leak information +about session contents. +For this reason, it is not recommended to enable compression for connections +that share trusted and untrusted traffic. .It Cm ConnectionAttempts Specifies the number of tries (one per second) to make before exiting. The argument must be an integer. diff --git a/sshd_config.5 b/sshd_config.5 index 3f5e29812d3f..4112166ecd56 100644 --- a/sshd_config.5 +++ b/sshd_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: sshd_config.5,v 1.397 2026/03/28 05:07:12 djm Exp $ -.Dd $Mdocdate: March 28 2026 $ +.\" $OpenBSD: sshd_config.5,v 1.398 2026/05/21 04:04:57 djm Exp $ +.Dd $Mdocdate: May 21 2026 $ .Dt SSHD_CONFIG 5 .Os .Sh NAME @@ -633,6 +633,13 @@ or .Cm no . The default is .Cm yes . +.Pp +Compression applies to all traffic that flows over the SSH connection. +If untrusted traffic (such as an open port-forward) is permitted over the +connection alongside trusted traffic, then compression may leak information +about session contents. +For this reason, it is not recommended to enable compression for connections +that share trusted and untrusted traffic. .It Cm DenyGroups This keyword can be followed by a list of group name patterns, separated by spaces. From 18b9db789e278c4d6a5ff21093a45683950db3ae Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 19 May 2026 18:37:26 +1000 Subject: [PATCH 047/196] Add interop tests against Dropbear >= 2020.79 --- .github/configs | 5 +++++ .github/install_dropbear.sh | 35 +++++++++++++++++++++++++++++++++++ .github/run_test.sh | 16 ++++++++++++++++ .github/setup_ci.sh | 6 ++++++ .github/workflows/c-cpp.yml | 1 + 5 files changed, 63 insertions(+) create mode 100755 .github/install_dropbear.sh diff --git a/.github/configs b/.github/configs index 9ad2439df493..a7bb698e25ca 100755 --- a/.github/configs +++ b/.github/configs @@ -185,6 +185,11 @@ case "$config" in libressl-*) LIBCRYPTOFLAGS="--with-ssl-dir=/opt/libressl --with-rpath=-Wl,-rpath," ;; + dropbear-*) + CONFIGFLAGS="--with-dbclient=/usr/local/bin/plink --with-dropbear=/usr/local/sbin/dropbear" + # We don't need to rerun the regular tests, just the interop ones. + TEST_TARGET=interop-tests + ;; putty-*) CONFIGFLAGS="--with-plink=/usr/local/bin/plink --with-puttygen=/usr/local/bin/puttygen" # We don't need to rerun the regular tests, just the interop ones. diff --git a/.github/install_dropbear.sh b/.github/install_dropbear.sh new file mode 100755 index 000000000000..ed91c52f7cdb --- /dev/null +++ b/.github/install_dropbear.sh @@ -0,0 +1,35 @@ +#!/bin/sh +# +# Install specified Dropbear version into /usr/local. +# + +ver="$1" + +echo +echo --------------------------------------------- +echo Installing dropbear version: ${ver} +echo --------------------------------------------- + +set -e + +cd /tmp + +if [ ! -d dropbear-clean ]; then + git clone https://github.com/mkj/dropbear.git dropbear-clean + (cd dropbear-clean && git config --global advice.detachedHead false) +fi + +rm -rf dropbear +cp -a dropbear-clean dropbear +cd dropbear +git checkout "$ver" +git status +echo "Building Dropbear version '$ver'" +( + autoreconf 2>&1 && + ./configure 2>&1 && + make clean 2>&1 && + make 2>&1 && + sudo make install 2>&1) >/tmp/db-build.log 2>&1 || cat /tmp/db-build.log + +echo "Installed dropbear version: '$(/usr/local/bin/dbclient -V 2>&1)'" diff --git a/.github/run_test.sh b/.github/run_test.sh index c67d00700f23..0a7d2656de9e 100755 --- a/.github/run_test.sh +++ b/.github/run_test.sh @@ -45,6 +45,22 @@ if [ "$1" = "putty-versions" ]; then exit 0 fi +if [ "$1" = "dropbear-versions" ]; then + make regress-binaries + # Work backward from current version to last version we support. + for ver in master $(cd /tmp/dropbear && git tag | grep -E 'DROPBEAR_' | sort -rn); do + year=$(echo "$ver" | cut -f2 -d_ | cut -f1 -d.) + if [ "$ver" != "master" ] && [ "$year" -lt "2020" ]; then + exit 0 + fi + .github/install_dropbear.sh "${ver}" + ${env} make ${TEST_TARGET} \ + SKIP_LTESTS="${SKIP_LTESTS}" LTESTS="${LTESTS}" + done + + exit 0 +fi + if [ -z "${LTESTS}" ]; then ${env} make ${TEST_TARGET} SKIP_LTESTS="${SKIP_LTESTS}" else diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index fca8591a70b9..4dd35801caaa 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -165,6 +165,9 @@ for TARGET in $TARGETS; do INSTALL_AWSLC=1 PACKAGES="${PACKAGES} cmake ninja-build" ;; + dropbear-versions) + INSTALL_DROPBEAR=master + ;; putty-*) INSTALL_PUTTY=0.83 PACKAGES="${PACKAGES} cmake" @@ -274,6 +277,9 @@ if [ ! -z "${INSTALL_ZLIB}" ]; then sudo make install prefix=/opt/zlib) fi +if [ ! -z "${INSTALL_DROPBEAR}" ]; then + .github/install_dropbear.sh "${INSTALL_DROPBEAR}" +fi if [ ! -z "${INSTALL_PUTTY}" ]; then .github/install_putty.sh "${INSTALL_PUTTY}" fi diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index ddfd4343d6f5..df833fd86c1f 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -112,6 +112,7 @@ jobs: - { target: ubuntu-latest, config: openssl-3.5 } # stable branch - { target: ubuntu-latest, config: openssl-3.6 } # stable branch - { target: ubuntu-latest, config: openssl-4.0 } # stable branch + - { target: ubuntu-latest, config: dropbear-versions } - { target: ubuntu-latest, config: putty-versions } - { target: ubuntu-latest, config: zlib-develop } - { target: ubuntu-latest, config: tcmalloc } From 498372545f48effd30a4d4c005eea25b1141fc74 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 21 May 2026 18:25:50 +1000 Subject: [PATCH 048/196] Use backticks for shell portability w/ Solaris. --- .github/run_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/run_test.sh b/.github/run_test.sh index 0a7d2656de9e..e99c9eef0f39 100755 --- a/.github/run_test.sh +++ b/.github/run_test.sh @@ -48,7 +48,7 @@ fi if [ "$1" = "dropbear-versions" ]; then make regress-binaries # Work backward from current version to last version we support. - for ver in master $(cd /tmp/dropbear && git tag | grep -E 'DROPBEAR_' | sort -rn); do + for ver in master `cd /tmp/dropbear && git tag | grep -E 'DROPBEAR_' | sort -rn`; do year=$(echo "$ver" | cut -f2 -d_ | cut -f1 -d.) if [ "$ver" != "master" ] && [ "$year" -lt "2020" ]; then exit 0 From d0d7981cf56363e6320f2aa6cf798e293420a7cf Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 21 May 2026 18:38:47 +1000 Subject: [PATCH 049/196] Another shell portability fix for Solaris. --- .github/run_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/run_test.sh b/.github/run_test.sh index e99c9eef0f39..7d873fe179a6 100755 --- a/.github/run_test.sh +++ b/.github/run_test.sh @@ -49,7 +49,7 @@ if [ "$1" = "dropbear-versions" ]; then make regress-binaries # Work backward from current version to last version we support. for ver in master `cd /tmp/dropbear && git tag | grep -E 'DROPBEAR_' | sort -rn`; do - year=$(echo "$ver" | cut -f2 -d_ | cut -f1 -d.) + year=`echo "$ver" | cut -f2 -d_ | cut -f1 -d.` if [ "$ver" != "master" ] && [ "$year" -lt "2020" ]; then exit 0 fi From 66847768ffd5a2a004891c8d3bd79eaba12625b7 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 21 May 2026 18:39:54 +1000 Subject: [PATCH 050/196] Add OpenBSD 7.9 test VM. --- .github/workflows/vm.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index 4ac3b27a020b..667593a529e8 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -295,6 +295,7 @@ jobs: - "7.6" - "7.7" - "7.8" + - "7.9" config: [default] runs-on: ubuntu-latest steps: From 42b213c66ba143f543b824ea5951f1ceb3fdd15b Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Fri, 22 May 2026 03:02:00 +1000 Subject: [PATCH 051/196] Fix IPTOS_DSCP_VA fallback 0x2c is the unshifted value, and was copied over from openbsd before it was fixed to be 0xb0 in [0]. Source of discrepancy identified by Leah Neukirchen. [0] https://cvsweb.openbsd.org/log/src/sys/netinet/ip.h#rev1.22 --- defines.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/defines.h b/defines.h index 1d5bc049863e..54f0fc83f957 100644 --- a/defines.h +++ b/defines.h @@ -95,7 +95,7 @@ enum # define IPTOS_DSCP_CS7 0xe0 #endif /* IPTOS_DSCP_CS0 */ #ifndef IPTOS_DSCP_VA -# define IPTOS_DSCP_VA 0x2c +# define IPTOS_DSCP_VA 0xb0 #endif /* IPTOS_DSCP_VA */ #ifndef IPTOS_DSCP_EF # define IPTOS_DSCP_EF 0xb8 From 3468ac72962970728a204e5052a3be9826090b13 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 26 May 2026 09:33:51 +1000 Subject: [PATCH 052/196] Hardenedmalloc needs -std=c23 so build with clang. --- .github/setup_ci.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index 4dd35801caaa..fa5781813957 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -226,7 +226,7 @@ if [ "${INSTALL_HARDENED_MALLOC}" = "yes" ]; then (cd ${HOME} && git clone https://github.com/GrapheneOS/hardened_malloc.git && cd ${HOME}/hardened_malloc && - make && sudo cp out/libhardened_malloc.so /usr/lib/) + make CC=clang && sudo cp out/libhardened_malloc.so /usr/lib/) fi if [ ! -z "${INSTALL_OPENSSL}" ]; then From 0a561f90672b6dc6187763f3b90e47c4c4247875 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 26 May 2026 10:48:19 +1000 Subject: [PATCH 053/196] Run hardenedmalloc test on ubuntu-latest. Needed for newer clang that supports -std=c23. --- .github/workflows/c-cpp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index df833fd86c1f..62509262f30b 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -52,7 +52,6 @@ jobs: - { target: ubuntu-22.04, config: gcc-12-Werror } - { target: ubuntu-22.04, config: gcc-sanitize-address } - { target: ubuntu-22.04, config: gcc-sanitize-undefined } - - { target: ubuntu-22.04, config: hardenedmalloc } - { target: ubuntu-22.04, config: heimdal } - { target: ubuntu-22.04, config: kitchensink } - { target: ubuntu-22.04, config: krb5 } @@ -72,6 +71,7 @@ jobs: - { target: ubuntu-latest, config: clang-19 } - { target: ubuntu-latest, config: boringssl } - { target: ubuntu-latest, config: aws-lc } + - { target: ubuntu-latest, config: hardenedmalloc } - { target: ubuntu-latest, config: libressl-master } - { target: ubuntu-latest, config: libressl-3.2.7 } - { target: ubuntu-latest, config: libressl-3.3.6 } From 0e2db7bc017d968ef57b0b5b4fd86643ecdb05e4 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Mon, 4 May 2026 10:57:24 +0000 Subject: [PATCH 054/196] upstream: Fix skip message. OpenBSD-Regress-ID: d192bbc19cc5914e64a3bb35a347eca0318729af --- regress/kbdint.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/regress/kbdint.sh b/regress/kbdint.sh index 7db876180c52..6c29b929866d 100644 --- a/regress/kbdint.sh +++ b/regress/kbdint.sh @@ -1,4 +1,4 @@ -# $OpenBSD: kbdint.sh,v 1.2 2026/02/24 00:39:59 dtucker Exp $ +# $OpenBSD: kbdint.sh,v 1.3 2026/05/04 10:57:24 dtucker Exp $ # Placed in the Public Domain. # # This tests keyboard-interactive authentication. It does not run by default, @@ -11,7 +11,7 @@ tid="kbdint" if [ -z "$SUDO" -o ! -f ${OBJ}/kbdintpw ]; then - skip "Password auth requires SUDO and kbdintpw file." + skip "kbdint auth test requires SUDO and kbdintpw file." fi # Enable keyboard-interactive auth From 0cadf7e0e88f4088595afbea21f2e43f3ae28abc Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Tue, 12 May 2026 13:02:40 +0000 Subject: [PATCH 055/196] upstream: Dropbear recently added a -Q option; use it to query KEX if available. OpenBSD-Regress-ID: beab781f357e27e75dfdd2ec600a7dff2c63cb5b --- regress/dropbear-kex.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/regress/dropbear-kex.sh b/regress/dropbear-kex.sh index 72717fbb7866..9ce366a43447 100644 --- a/regress/dropbear-kex.sh +++ b/regress/dropbear-kex.sh @@ -1,4 +1,4 @@ -# $OpenBSD: dropbear-kex.sh,v 1.4 2025/03/11 07:42:08 dtucker Exp $ +# $OpenBSD: dropbear-kex.sh,v 1.5 2026/05/12 13:02:40 dtucker Exp $ # Placed in the Public Domain. tid="dropbear kex" @@ -13,10 +13,12 @@ kex="curve25519-sha256 curve25519-sha256@libssh.org" if $SSH -Q kex | grep 'diffie-hellman-group14-sha256' >/dev/null; then kex="$kex diffie-hellman-group14-sha256" fi -# There's no flag to query KEX, so if MACs does not contain SHA1, assume -# there's also SHA1-based KEX methods either. +# Until recently, dbclient had no way to query KEX. If -Qkex is available +# then use it, otherwise check if MACs contain SHA1 and if present assume +# there's also SHA1-based KEX methods. if $SSH -Q kex | grep 'diffie-hellman-group14-sha1' >/dev/null && \ - $DBCLIENT -m help hst 2>&1 | grep -- '-sha1' >/dev/null ; then + ($DBCLIENT -Q kex 2>/dev/null | grep 'diffie-hellman-group14-sha1' >/dev/null || \ + $DBCLIENT -m help hst 2>&1 | grep -- '-sha1' >/dev/null) ; then kex="$kex diffie-hellman-group14-sha1" fi From f44f124a234785b9d2cd59a6da28737fb3c4ad9a Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Wed, 27 May 2026 23:04:36 +0000 Subject: [PATCH 056/196] upstream: Test all mutually supported algorithms, using dropbear's new -Q option to query its algorithms where possible. OpenBSD-Regress-ID: 7e1fa733dec3bfa9f8931e535a9397209b5953f3 --- regress/dropbear-server.sh | 202 ++++++++++++++++++++++++++++++++----- 1 file changed, 177 insertions(+), 25 deletions(-) diff --git a/regress/dropbear-server.sh b/regress/dropbear-server.sh index c72c86bfd39e..49379a53ec8d 100644 --- a/regress/dropbear-server.sh +++ b/regress/dropbear-server.sh @@ -1,8 +1,14 @@ -# $OpenBSD: dropbear-server.sh,v 1.2 2025/06/29 05:35:00 dtucker Exp $ +# $OpenBSD: dropbear-server.sh,v 1.3 2026/05/27 23:04:36 dtucker Exp $ # Placed in the Public Domain. tid="dropbear server" +authkeydir=/var/run/dropbear-regress + +if [ -z "$SUDO" -a ! -w /var/run ]; then + skip "need SUDO to create dir in /var/run, test won't work without it" +fi + if test "x$REGRESS_INTEROP_DROPBEAR" != "xyes" ; then skip "dropbear interop tests not enabled" fi @@ -21,37 +27,158 @@ else trace "dropbear version $ver (${major}.${minor}) ok" fi -if [ -z "$SUDO" -a ! -w /var/run ]; then - skip "need SUDO to create dir in /var/run, test won't work without" +# Dropbear versions 2026.91 and earlier only support 4 hostkeys in total, +# however this was increased shortly after that release. Test for this. +$SUDO $DROPBEARCONVERT openssh dropbear "$OBJ/host.ed25519" "$OBJ/db.25519" >/dev/null 2>&1 +$SUDO chown $USER $OBJ/$dbkey +k="-r $OBJ/db.ed25519" +if $DROPBEAR $k $k $k $k $k -V >/dev/null 2>&1; then + limit_4_hostkeys=no +else + trace "dropbear supports only 4 host keys" + limit_4_hostkeys=yes fi -authkeydir=/var/run/dropbear-regress -ciphers=`$DBCLIENT -c help hst 2>&1 | awk '/ ciphers: /{print $4}' | tr ',' ' '` -macs=`$DBCLIENT -m help hst 2>&1 | awk '/ MACs: /{print $4}' | tr ',' ' '` -if [ -z "$macs" ] || [ -z "$ciphers" ]; then - skip "dbclient query ciphers '$ciphers' or macs '$macs' failed" +# +# Determine the set of algos supported by the Dropbear we're testing against. +# +if $DROPBEAR -Q help >/dev/null 2>&1; then + # We can directly query the server for supported algos. + dbciphers=`$DROPBEAR -Q cipher` + dbmacs=`$DROPBEAR -Q mac` + dbkexs=`$DROPBEAR -Q kex` + dbhkalgs=`$DROPBEAR -Q sig` + dbpktypes=`$DROPBEAR -Q sig` +else + # We infer ciphers and macs from dbclient and hard code the rest. + # Since this test only supports back to Dropbear 2025.07 (due to the + # need for '-D') we have a pretty good idea what to hard code. + dbciphers=`$DBCLIENT -c help hst 2>&1 | awk '/ ciphers: /{print $4}' | tr ',' ' '` + dbmacs=`$DBCLIENT -m help hst 2>&1 | awk '/ MACs: /{print $4}' | tr ',' ' '` + dbkexs="curve25519-sha256 curve25519-sha256@libssh.org" + dbkexs="$dbkexs diffie-hellman-group14-sha256" + dbkexs="$dbkexs ecdh-sha2-nistp256 ecdh-sha2-nistp384 ecdh-sha2-nistp521" + dbkexs="$dbkexs sntrup761x25519-sha512 mlkem768x25519-sha256" + dbhkalgs="ssh-ed25519 ecdsa-sha2-nistp256 ecdsa-sha2-nistp521 rsa-sha2-256" + dbpktypes="ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521" + dbpktypes="$dbpktypes ssh-ed25519 rsa-sha2-256" fi +if [ -z "$dbmacs" ] || [ -z "$dbciphers" ] || [ -z "$dbkexs" ] || \ + [ -z "$dbhkalgs" ] || [ -z "$dbpktypes" ]; then + fail "query ciphers '$dbciphers' macs '$dbmacs' kexs '$dbkexs' " \ + "dbhkalgs '$dbhkalgs' or bpktypes '$bpktypes' failed" +fi + +# +# Filter out ciphers, macs and kexes not supported by the OpenSSH we're testing +# and put the ones we want into ciphers, macs and kexes. +# +ciphers="" +for c in $dbciphers; do + if $SSH -Q Ciphers | grep -E "^$c\$" >/dev/null; then + ciphers="$ciphers $c" + else + trace "ssh does not support cipher '$c'" + fi +done + +macs="" +for m in $dbmacs; do + if $SSH -Q MACs | grep -E "^$m\$" >/dev/null; then + macs="$macs $m" + else + trace "ssh does not support mac '$m'" + fi +done + +kexs="" +for k in $dbkexs; do + if $SSH -Q KexAlgorithms | grep -E "^$k\$" >/dev/null; then + kexs="$kexs $k" + else + trace "ssh does not support kex '$k'" + fi +done + +# +# Now filter by supported HostKeyAlgorithms. The key types are not a 1:1 +# correlation with the algos, so we first check that the algo is supported, +# and if so put it in hkalgs add the appropriate key type to keytypes for +# later deduplication and processing. +# +hkalgs="" +keytypes="" +for alg in $dbhkalgs; do + if ! $SSH -Q HostKeyAlgorithms | grep -E "^$alg\$" >/dev/null; then + trace "ssh does not support $alg" + alg="" + fi + + kt="$alg" + case "$alg" in + sk-*) + trace "omitting sk alg $alg" + alg="" + ;; + ecdsa-sha2-nistp384) + if [ "$limit_4_hostkeys" = "yes" ]; then + trace "dropbear host key limit=4, omitting $alg" + alg="" + fi + ;; + rsa-sha2*) + kt=ssh-rsa + ;; + esac + + if [ "$alg" != "" ]; then + hkalgs="$hkalgs $alg" + keytypes="$keytypes $kt" + fi +done + +# +# Deduplicate key types (because the various RSA hostkey algos use the same +# type and Dropbear has a limit on the number of hostkeys it'll load) and +# construct hkeyopts to be passed to dropbear command line. +# +hkeyopts="" +for kt in `for i in $keytypes; do echo $i; done | sort -u`; do + key="host.$kt" + dbkey="db.$kt" + trace "convert hostkey '$key' to '$dbkey'" + if $SUDO $DROPBEARCONVERT openssh dropbear "$OBJ/$key" \ + "$OBJ/$dbkey" >/dev/null 2>&1; then + if [ ! -f "$OBJ/$dbkey" ]; then + fail "convert $key to $dbkey" + fi + $SUDO chown $USER $OBJ/$dbkey + fi + trace "hkeyopts add -r $OBJ/db.$kt" + hkeyopts="$hkeyopts -r $OBJ/db.$kt" +done + +pktypes="" +for pk in $dbpktypes; do + if $SSH -Q PubkeyAcceptedAlgorithms | grep -E "^$pk\$" >/dev/null; then + case "$pk" in + sk-*) ;; + *) pktypes="$pktypes $pk" ;; + esac + else + trace "ssh does not support pubkey type '$pk'" + fi +done + # Set up authorized_keys for dropbear. umask 077 $SUDO mkdir -p $authkeydir $SUDO chown -R $USER $authkeydir cp $OBJ/authorized_keys_$USER $authkeydir/authorized_keys -for i in `$SUDO $SSHD -f $OBJ/sshd_config -T | grep -v sk- | \ - awk '$1=="hostkey" {print $2}'`; do - file=`basename "$i"` - file=`echo "$file" | sed s/^host\./db\./g` - if $SUDO $DROPBEARCONVERT openssh dropbear "$i" "$OBJ/$file" \ - >/dev/null 2>&1; then - $SUDO chown $USER $OBJ/$file - hkeys="-r $OBJ/$file" - fi -done - rm -f $OBJ/dropbear.pid -$DROPBEAR -D $authkeydir -p $PORT -P $OBJ/dropbear.pid $hkeys -E \ - 2>$OBJ/sshd.log +$DROPBEAR -E -D $authkeydir -p $PORT -P $OBJ/dropbear.pid $hkeyopts 2>>$OBJ/sshd.log if [ $? -ne 0 ]; then fatal "starting dropbear server failed" fi @@ -62,15 +189,40 @@ done pid=`cat $OBJ/dropbear.pid` trap "kill $pid; $SUDO rm -rf $authkeydir" 0 +trace ciphers $ciphers +trace macs $macs +trace kexs $kexs +trace hkalgs $hkalgs +trace pktypes $pktypes + for c in $ciphers; do - for m in $macs; do - trace "$tid: cipher $c mac $m hk $hk" + case "$c" in + chacha20-poly1305@openssh.com|aes*-gcm@openssh.com) + tmpmacs="" ;; + *) + tmpmacs="$macs" ;; + esac + + for m in $tmpmacs; do + for k in $kexs; do + for hk in $hkalgs; do + for pk in $pktypes; do + verbose "$tid: cipher $c mac $m kex $k hkalg $hk pk $pk" rm -f ${COPY} - ${SSH} -F $OBJ/ssh_config -oCiphers=$c -oMacs=$m \ - somehost cat ${DATA} > ${COPY} + if [ "$m" = "" ]; then + macopts="" + else + macopts="-oMacs=$m" + fi + ${SSH} -F $OBJ/ssh_config -oCiphers=$c $macopts -oKexAlgorithms=$k \ + -oHostKeyAlgorithms=$hk -oPubkeyAcceptedAlgorithms=$pk \ + somehost cat ${DATA} > ${COPY} if [ $? -ne 0 ]; then fail "connect dropbear server failed" fi cmp ${DATA} ${COPY} || fail "corrupted copy" + done + done + done done done From 7fbe3e440eae0cd2315545ce5abd89e936b3a92f Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 27 May 2026 03:04:30 +0000 Subject: [PATCH 057/196] upstream: add a -V flag to print the version, but mostly as a way to check the binary is functional; ok deraadt@ OpenBSD-Commit-ID: 0cc5cb22cbfe09ac4c316dd5da0af7a4193a42af --- ssh-agent.1 | 8 ++++++-- ssh-agent.c | 9 +++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/ssh-agent.1 b/ssh-agent.1 index 016f7e0ebc76..ff1653386d04 100644 --- a/ssh-agent.1 +++ b/ssh-agent.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-agent.1,v 1.86 2025/10/04 21:41:35 naddy Exp $ +.\" $OpenBSD: ssh-agent.1,v 1.87 2026/05/27 03:04:30 djm Exp $ .\" .\" Author: Tatu Ylonen .\" Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -34,7 +34,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: October 4 2025 $ +.Dd $Mdocdate: May 27 2026 $ .Dt SSH-AGENT 1 .Os .Sh NAME @@ -62,6 +62,8 @@ .Fl k .Nm ssh-agent .Fl u +.Nm ssh-agent +.Fl V .Sh DESCRIPTION .Nm is a program to hold private keys used for public key authentication. @@ -208,6 +210,8 @@ If a command (and optional arguments) is given, this is executed as a subprocess of the agent. The agent exits automatically when the command given on the command line terminates. +.It Fl V +Display the version number and exit. .El .Pp There are three main ways to get an agent set up. diff --git a/ssh-agent.c b/ssh-agent.c index b8cecd234903..07746193e5a1 100644 --- a/ssh-agent.c +++ b/ssh-agent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-agent.c,v 1.325 2026/04/28 21:32:05 djm Exp $ */ +/* $OpenBSD: ssh-agent.c,v 1.326 2026/05/27 03:04:30 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -80,6 +80,7 @@ #include "ssh-pkcs11.h" #include "sk-api.h" #include "myproposal.h" +#include "version.h" #ifndef DEFAULT_ALLOWED_PROVIDERS # define DEFAULT_ALLOWED_PROVIDERS "/usr/lib*/*,/usr/local/lib*/*" @@ -2268,7 +2269,7 @@ main(int ac, char **av) __progname = ssh_get_progname(av[0]); seed_rng(); - while ((ch = getopt(ac, av, "cDdksTuUE:a:O:P:t:")) != -1) { + while ((ch = getopt(ac, av, "cDdksTuUVE:a:O:P:t:")) != -1) { switch (ch) { case 'E': fingerprint_hash = ssh_digest_alg_by_name(optarg); @@ -2334,6 +2335,10 @@ main(int ac, char **av) case 'U': U_flag++; break; + case 'V': + fprintf(stderr, "%s, %s\n", + SSH_VERSION, SSH_OPENSSL_VERSION); + exit(0); default: usage(); } From 3a05a07e78f7b88ba70fa7f96808bcb86a55cbe8 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 27 May 2026 03:05:21 +0000 Subject: [PATCH 058/196] upstream: use "ssh-agent -V" to test the binary is functional after relinking requested deraadt@ OpenBSD-Commit-ID: eb4169949bf61188fb7336b11b73833019d10d7b --- .skipped-commit-ids | 1 + 1 file changed, 1 insertion(+) diff --git a/.skipped-commit-ids b/.skipped-commit-ids index f4b7ee22e092..b8bebcf4d108 100644 --- a/.skipped-commit-ids +++ b/.skipped-commit-ids @@ -47,6 +47,7 @@ da414a364c25b187fc686da7aacec2c35d29238a ssh-keygen, fixup'ed into 21682417 a05e13a7e2c0b65bb4b47184fef731243431c6ff Makefile.inc 7e8178786157e863f6ff63c5d55200d7b6b04f9e remove old sandbox files 98eefed432ff8253b307002e20d28da14b93e7e3 Makefile.inc +eb4169949bf61188fb7336b11b73833019d10d7b Makefile changes Old upstream tree: From 26a8c13e6154a905b4eaf48798b134372747e86f Mon Sep 17 00:00:00 2001 From: "tb@openbsd.org" Date: Wed, 27 May 2026 03:28:07 +0000 Subject: [PATCH 059/196] upstream: ssh-agent: add -V to usage() ok djm OpenBSD-Commit-ID: ea9bc250ce34c4c8317896673ca37f3ee17223c7 --- ssh-agent.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ssh-agent.c b/ssh-agent.c index 07746193e5a1..4a1781360f4e 100644 --- a/ssh-agent.c +++ b/ssh-agent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-agent.c,v 1.326 2026/05/27 03:04:30 djm Exp $ */ +/* $OpenBSD: ssh-agent.c,v 1.327 2026/05/27 03:28:07 tb Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -2222,7 +2222,8 @@ usage(void) " ssh-agent [-TU] [-a bind_address] [-E fingerprint_hash] [-O option]\n" " [-P allowed_providers] [-t life] command [arg ...]\n" " ssh-agent [-c | -s] -k\n" - " ssh-agent -u\n"); + " ssh-agent -u\n" + " ssh-agent -V\n"); exit(1); } From 3bee4a1a260809992a0877d7ef202c4ff3e0be24 Mon Sep 17 00:00:00 2001 From: "tb@openbsd.org" Date: Wed, 27 May 2026 13:54:15 +0000 Subject: [PATCH 060/196] upstream: ssh: use sentinel idiom for timegm(3) and mktime(3) There is nothing wrong with times before the epoch, even -1, so use the idiom recently added to the CAVEATS section to figure out whether there was an error in the timegm() or mktime() calls. We should sweep the tree for this. If anyone is bored, feel free to beat me to it... ok deraadt djm OpenBSD-Commit-ID: e2b1721966dc782e776db5d6cfb18958534f9d4b --- misc.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/misc.c b/misc.c index ed3e9d31425c..d9fd49dfa0be 100644 --- a/misc.c +++ b/misc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: misc.c,v 1.213 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: misc.c,v 1.214 2026/05/27 13:54:15 tb Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2005-2020 Damien Miller. All rights reserved. @@ -2588,10 +2588,12 @@ parse_absolute_time(const char *s, uint64_t *tp) if ((cp = strptime(buf, fmt, &tm)) == NULL || *cp != '\0') return SSH_ERR_INVALID_FORMAT; if (is_utc) { - if ((tt = timegm(&tm)) < 0) + tm.tm_wday = -1; + if ((tt = timegm(&tm)) == -1 && tm.tm_wday == -1) return SSH_ERR_INVALID_FORMAT; } else { - if ((tt = mktime(&tm)) < 0) + tm.tm_wday = -1; + if ((tt = mktime(&tm)) == -1 && tm.tm_wday == -1) return SSH_ERR_INVALID_FORMAT; } /* success */ From 16908221360a01b1801c6ca70c26b73c83509ea3 Mon Sep 17 00:00:00 2001 From: "deraadt@openbsd.org" Date: Wed, 27 May 2026 13:57:26 +0000 Subject: [PATCH 061/196] upstream: Use the new RELINK feature in bsd.prog.mk to build the relink kits. OpenBSD-Commit-ID: df5c950444e208b320265fa8a1afd676e2edfa6e --- .skipped-commit-ids | 1 + 1 file changed, 1 insertion(+) diff --git a/.skipped-commit-ids b/.skipped-commit-ids index b8bebcf4d108..8de9e24033ea 100644 --- a/.skipped-commit-ids +++ b/.skipped-commit-ids @@ -48,6 +48,7 @@ a05e13a7e2c0b65bb4b47184fef731243431c6ff Makefile.inc 7e8178786157e863f6ff63c5d55200d7b6b04f9e remove old sandbox files 98eefed432ff8253b307002e20d28da14b93e7e3 Makefile.inc eb4169949bf61188fb7336b11b73833019d10d7b Makefile changes +df5c950444e208b320265fa8a1afd676e2edfa6e Makefile changes Old upstream tree: From 4f4aeee6edaa248f1e7ce22ee3f35ce183eabf38 Mon Sep 17 00:00:00 2001 From: Manfred Kaiser Date: Sun, 24 May 2026 09:53:42 +0200 Subject: [PATCH 062/196] sandbox-seccomp-filter: remove duplicate SC_ALLOW(__NR_clock_gettime64) The syscall is already permitted at line 297 in its own ifdef guard. No functional change. --- sandbox-seccomp-filter.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/sandbox-seccomp-filter.c b/sandbox-seccomp-filter.c index 7b2444930d1a..67a8a82aa910 100644 --- a/sandbox-seccomp-filter.c +++ b/sandbox-seccomp-filter.c @@ -381,9 +381,6 @@ static const struct sock_filter preauth_insns[] = { #ifdef __NR_clock_nanosleep_time64 SC_ALLOW(__NR_clock_nanosleep_time64), #endif -#ifdef __NR_clock_gettime64 - SC_ALLOW(__NR_clock_gettime64), -#endif #ifdef __NR__newselect SC_ALLOW(__NR__newselect), #endif From 7ab700f1706b154d4bc5cf66e19c05be6d9b1fc1 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Sat, 30 May 2026 23:24:01 +1000 Subject: [PATCH 063/196] Make failure to set SECCOMP or NO_NEW_PRIVS fatal If your Linux system lacks support for these then please don't enable the seccomp sandbox. Prompted by manfred.kaiser@ssh-mitm.at --- sandbox-seccomp-filter.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/sandbox-seccomp-filter.c b/sandbox-seccomp-filter.c index 67a8a82aa910..bf753eef22c0 100644 --- a/sandbox-seccomp-filter.c +++ b/sandbox-seccomp-filter.c @@ -535,7 +535,6 @@ void ssh_sandbox_child(struct ssh_sandbox *box) { struct rlimit rl_zero, rl_one = {.rlim_cur = 1, .rlim_max = 1}; - int nnp_failed = 0; /* Set rlimits for completeness if possible. */ rl_zero.rlim_cur = rl_zero.rlim_max = 0; @@ -558,18 +557,11 @@ ssh_sandbox_child(struct ssh_sandbox *box) #endif /* SANDBOX_SECCOMP_FILTER_DEBUG */ debug3_f("setting PR_SET_NO_NEW_PRIVS"); - if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1) { - debug("%s: prctl(PR_SET_NO_NEW_PRIVS): %s", - __func__, strerror(errno)); - nnp_failed = 1; - } + if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1) + fatal_f("prctl(PR_SET_NO_NEW_PRIVS): %s", strerror(errno)); debug3_f("attaching seccomp filter program"); if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &preauth_program) == -1) - debug("%s: prctl(PR_SET_SECCOMP): %s", - __func__, strerror(errno)); - else if (nnp_failed) - fatal("%s: SECCOMP_MODE_FILTER activated but " - "PR_SET_NO_NEW_PRIVS failed", __func__); + fatal_f("prctl(PR_SET_SECCOMP): %s", strerror(errno)); } #endif /* SANDBOX_SECCOMP_FILTER */ From 9d4c0b31f172782def72ccc2fb2dc217d3135e6f Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 31 May 2026 04:19:16 +0000 Subject: [PATCH 064/196] upstream: Replace the old recursive match_pattern() with an implementation that uses a NFA for matching. This avoids the exponential worst- case behaviour for the old implementation. ok markus@ OpenBSD-Commit-ID: fc6b75a52f4c0acb52b7900658c8d25ff873cbae --- match.c | 137 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 88 insertions(+), 49 deletions(-) diff --git a/match.c b/match.c index 3ef5369310c6..b8f350df17e3 100644 --- a/match.c +++ b/match.c @@ -1,4 +1,4 @@ -/* $OpenBSD: match.c,v 1.45 2024/09/06 02:30:44 djm Exp $ */ +/* $OpenBSD: match.c,v 1.46 2026/05/31 04:19:16 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -13,6 +13,7 @@ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. + * Copyright (c) 2026 Damien Miller. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -49,67 +50,105 @@ #include "match.h" #include "misc.h" +/* + * Computes the epsilon closure of an NFA set. + * In our wildcard grammar, epsilon transitions only exist for '*' wildcards, + * allowing us to transition from state i to i+1 without consuming input. + * + * This function modifies 'states' in place. + */ +static void +epsilon_closure(char *states, const char *pattern, size_t M) +{ + size_t i; + + /* only need a forward pass as there are no back jumps in our grammar */ + for (i = 0; i < M; i++) { + if (!states[i] || pattern[i] != '*') + continue; + /* + * State i is active, and pattern[i] is '*', so we can + * epsilon-transition to i+1. + */ + states[i + 1] = 1; + } +} + /* * Returns true if the given string matches the pattern (which may contain ? - * and * as wildcards), and zero if it does not match. + * and * as wildcards), and zero if it does not match. Uses an NFA internally. */ int match_pattern(const char *s, const char *pattern) { - for (;;) { - /* If at end of pattern, accept if also at end of string. */ - if (!*pattern) - return !*s; - - if (*pattern == '*') { - /* Skip this and any consecutive asterisks. */ - while (*pattern == '*') - pattern++; - - /* If at end of pattern, accept immediately. */ - if (!*pattern) - return 1; - - /* If next character in pattern is known, optimize. */ - if (*pattern != '?' && *pattern != '*') { + size_t M; + size_t i; + char *states, *next_states, *tmp; + int active, matched = 0; + + /* trivial case: empty pattern vs empty input */ + if ((M = strlen(pattern)) == 0) + return *s == '\0'; + + /* A state for each pattern character, plus one final accepting state */ + states = xcalloc(M + 1, sizeof(*states)); + next_states = xcalloc(M + 1, sizeof(*next_states)); + + /* Initial state: state 0 is active */ + states[0] = 1; + /* Other states might be reachable now if the pattern starts with '*' */ + epsilon_closure(states, pattern, M); + + for (; *s; s++) { + memset(next_states, 0, M + 1); + + /* Calculate the reachable next states given the input char */ + for (i = 0; i < M; i++) { + if (!states[i]) + continue; + if (pattern[i] == '*') { + /* + * '*' matches any character, so we can + * stay in state i + */ + next_states[i] = 1; + } else if (pattern[i] == '?' || pattern[i] == *s) { /* - * Look instances of the next character in - * pattern, and try to match starting from - * those. + * '?' matches any character, or we have + * a literal match. */ - for (; *s; s++) - if (*s == *pattern && - match_pattern(s + 1, pattern + 1)) - return 1; - /* Failed. */ - return 0; + next_states[i + 1] = 1; } - /* - * Move ahead one character at a time and try to - * match at each position. - */ - for (; *s; s++) - if (match_pattern(s, pattern)) - return 1; - /* Failed. */ - return 0; } - /* - * There must be at least one more character in the string. - * If we are at the end, fail. - */ - if (!*s) - return 0; - /* Check if the next character of the string is acceptable. */ - if (*pattern != '?' && *pattern != *s) - return 0; + /* Expand the reachable next states with epsilon transitions */ + epsilon_closure(next_states, pattern, M); - /* Move to the next character, both in string and in pattern. */ - s++; - pattern++; + /* Swap states and next_states */ + tmp = states; + states = next_states; + next_states = tmp; + + /* Check if we have any active pattern states left */ + active = 0; + for (i = 0; i <= M; i++) { + if (states[i]) { + active = 1; + break; + } + } + if (!active) + goto out; /* No active states, fail early */ } - /* NOTREACHED */ + /* + * We matched only if we ended up in the final, accepting state + * after consuming all the input. + */ + matched = states[M]; + out: + free(states); + free(next_states); + return matched; } /* From 1e82d2cfcfd05ec2e4515894a92223f40839c7b8 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 31 May 2026 04:24:39 +0000 Subject: [PATCH 065/196] upstream: fix client use-after-free on error path if cipher_init() fails; reported by Qualys Security Advisory Team, ok markus@ OpenBSD-Commit-ID: a8731da0c462b2b9d11314ba505c26ee0cdada83 --- packet.c | 7 ++++--- ssh.c | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packet.c b/packet.c index 8c1d313c2179..53a29e338a69 100644 --- a/packet.c +++ b/packet.c @@ -1,4 +1,4 @@ -/* $OpenBSD: packet.c,v 1.335 2026/04/13 08:18:33 job Exp $ */ +/* $OpenBSD: packet.c,v 1.336 2026/05/31 04:24:39 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -302,7 +302,7 @@ ssh_packet_set_connection(struct ssh *ssh, int fd_in, int fd_out) { struct session_state *state; const struct sshcipher *none = cipher_by_name("none"); - int r; + int r, wasnull = ssh == NULL; if (none == NULL) { error_f("cannot load cipher 'none'"); @@ -323,7 +323,8 @@ ssh_packet_set_connection(struct ssh *ssh, int fd_in, int fd_out) (r = cipher_init(&state->receive_context, none, (const u_char *)"", 0, NULL, 0, CIPHER_DECRYPT)) != 0) { error_fr(r, "cipher_init failed"); - free(ssh); /* XXX need ssh_free_session_state? */ + if (wasnull) + free(ssh); /* XXX need ssh_free_session_state? */ return NULL; } state->newkeys[MODE_IN] = state->newkeys[MODE_OUT] = NULL; diff --git a/ssh.c b/ssh.c index 531f28eb2a56..943e1908eec4 100644 --- a/ssh.c +++ b/ssh.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh.c,v 1.630 2026/04/02 07:50:55 djm Exp $ */ +/* $OpenBSD: ssh.c,v 1.631 2026/05/31 04:24:39 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1650,7 +1650,8 @@ main(int ac, char **av) if (options.control_path != NULL) { int sock; if ((sock = muxclient(options.control_path)) >= 0) { - ssh_packet_set_connection(ssh, sock, sock); + if (ssh_packet_set_connection(ssh, sock, sock) == NULL) + fatal("ssh_packet_set_connection failed"); ssh_packet_set_mux(ssh); goto skip_connect; } From 10f66b2af950c94af3b25027abec5209d90eb451 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 31 May 2026 04:31:04 +0000 Subject: [PATCH 066/196] upstream: Enforce a maximum size for usernames in agent key use constraints Along with the match_pattern() performance change that was just committed this avoids a denial-of-service where an agent client could waste CPU on an agent by sending user constraints with lots of wildcards. Reported by Huzaifa Sidhpurwala of Redhat ok markus OpenBSD-Commit-ID: 0483817f1a8accf4dbff42b7073ee4d119105d71 --- ssh-agent.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/ssh-agent.c b/ssh-agent.c index 4a1781360f4e..151b2b324b65 100644 --- a/ssh-agent.c +++ b/ssh-agent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-agent.c,v 1.327 2026/05/27 03:28:07 tb Exp $ */ +/* $OpenBSD: ssh-agent.c,v 1.328 2026/05/31 04:31:04 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -101,6 +101,8 @@ #define AGENT_MAX_DEST_CONSTRAINTS 1024 /* Maximum number of associated certificate constraints to accept on a key */ #define AGENT_MAX_EXT_CERTS 1024 +/* Max length of username constraint */ +#define AGENT_USER_CONSTRAINT_MAX_LEN 256 /* XXX store hostkey_sid in a refcounted tree */ @@ -1078,13 +1080,13 @@ static int parse_dest_constraint_hop(struct sshbuf *b, struct dest_constraint_hop *dch) { u_char key_is_ca; - size_t elen = 0; + size_t elen = 0, userlen = 0; int r; struct sshkey *k = NULL; char *fp; memset(dch, '\0', sizeof(*dch)); - if ((r = sshbuf_get_cstring(b, &dch->user, NULL)) != 0 || + if ((r = sshbuf_get_cstring(b, &dch->user, &userlen)) != 0 || (r = sshbuf_get_cstring(b, &dch->hostname, NULL)) != 0 || (r = sshbuf_get_string_direct(b, NULL, &elen)) != 0) { error_fr(r, "parse"); @@ -1102,6 +1104,10 @@ parse_dest_constraint_hop(struct sshbuf *b, struct dest_constraint_hop *dch) if (*dch->user == '\0') { free(dch->user); dch->user = NULL; + } else if (userlen > AGENT_USER_CONSTRAINT_MAX_LEN) { + error_f("user match pattern too long"); + r = SSH_ERR_INVALID_FORMAT; + goto out; } while (sshbuf_len(b) != 0) { dch->keys = xrecallocarray(dch->keys, dch->nkeys, From 26cde4cfc55eb1d336e1249d702c0c4705b0424b Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 31 May 2026 04:37:56 +0000 Subject: [PATCH 067/196] upstream: stricter validation of the transport state passed from the unprivileged preauth sshd-auth process to the user-privileged postauth sshd-session process. These are harmless unless an attacker had an exploit for sshd-auth in which case they could be used for post-auth memory DoS or to crash you own session in a new and exciting way. Reported by bylee3 and Kayky Vinicius ok markus OpenBSD-Commit-ID: 214e256904a4ae4f83d2083096796c9689c1d7b5 --- cipher.c | 8 +++++++- cipher.h | 3 ++- packet.c | 12 +++++++++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/cipher.c b/cipher.c index b42baf967740..f3e8fd55350f 100644 --- a/cipher.c +++ b/cipher.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cipher.c,v 1.127 2026/05/13 05:58:58 djm Exp $ */ +/* $OpenBSD: cipher.c,v 1.128 2026/05/31 04:37:56 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -183,6 +183,12 @@ cipher_is_cbc(const struct sshcipher *c) return (c->flags & CFLAG_CBC) != 0; } +u_int +cipher_is_internal(const struct sshcipher *c) +{ + return (c->flags & CFLAG_INTERNAL) != 0; +} + u_int cipher_ctx_is_plaintext(struct sshcipher_ctx *cc) { diff --git a/cipher.h b/cipher.h index 6533ff2bbdec..061a26b20015 100644 --- a/cipher.h +++ b/cipher.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cipher.h,v 1.56 2023/10/10 06:49:54 tb Exp $ */ +/* $OpenBSD: cipher.h,v 1.57 2026/05/31 04:37:56 djm Exp $ */ /* * Author: Tatu Ylonen @@ -68,6 +68,7 @@ u_int cipher_seclen(const struct sshcipher *); u_int cipher_authlen(const struct sshcipher *); u_int cipher_ivlen(const struct sshcipher *); u_int cipher_is_cbc(const struct sshcipher *); +u_int cipher_is_internal(const struct sshcipher *); u_int cipher_ctx_is_plaintext(struct sshcipher_ctx *); diff --git a/packet.c b/packet.c index 53a29e338a69..78316626fe66 100644 --- a/packet.c +++ b/packet.c @@ -1,4 +1,4 @@ -/* $OpenBSD: packet.c,v 1.336 2026/05/31 04:24:39 djm Exp $ */ +/* $OpenBSD: packet.c,v 1.337 2026/05/31 04:37:56 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -2535,7 +2535,9 @@ newkeys_from_blob(struct sshbuf *m, struct ssh *ssh, int mode) (r = sshbuf_get_string(b, &enc->key, &keylen)) != 0 || (r = sshbuf_get_string(b, &enc->iv, &ivlen)) != 0) goto out; - if ((enc->cipher = cipher_by_name(enc->name)) == NULL) { + if ((enc->cipher = cipher_by_name(enc->name)) == NULL || + enc->block_size != cipher_blocksize(enc->cipher) || + cipher_is_internal(enc->cipher)) { r = SSH_ERR_INVALID_FORMAT; goto out; } @@ -2547,7 +2549,7 @@ newkeys_from_blob(struct sshbuf *m, struct ssh *ssh, int mode) if ((r = sshbuf_get_u32(b, (u_int *)&mac->enabled)) != 0 || (r = sshbuf_get_string(b, &mac->key, &maclen)) != 0) goto out; - if (maclen > mac->key_len) { + if (maclen != mac->key_len) { r = SSH_ERR_INVALID_FORMAT; goto out; } @@ -2593,6 +2595,10 @@ kex_from_blob(struct sshbuf *m, struct kex **kexp) (r = sshbuf_get_stringb(m, kex->session_id)) != 0 || (r = sshbuf_get_u32(m, &kex->flags)) != 0) goto out; + if (kex->we_need > 1024) { + r = SSH_ERR_INVALID_FORMAT; + goto out; + } kex->server = 1; kex->done = 1; r = 0; From 72b05ecd141b9683285dcdb439de01903c1a07d3 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 31 May 2026 04:44:38 +0000 Subject: [PATCH 068/196] upstream: make the transport protocol stricter by disconnecting if the peer sends non-KEX messages during a key re-exchange. Previously an evil peer could continue sending non-KEX messages without penalty, causing memory to be wasted up until the connection terminated or the server/client hit a OOM limit. reported by Marko Jevtic; ok markus@ OpenBSD-Commit-ID: 8937f0f2096156f5c68ae2dce77956373589d757 --- kex.c | 9 +++++++-- kex.h | 3 ++- packet.c | 9 ++++++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/kex.c b/kex.c index 85b112c75f21..11b271d47484 100644 --- a/kex.c +++ b/kex.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kex.c,v 1.193 2026/03/05 05:40:35 djm Exp $ */ +/* $OpenBSD: kex.c,v 1.194 2026/05/31 04:44:38 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. * @@ -566,7 +566,7 @@ kex_input_newkeys(int type, uint32_t seq, struct ssh *ssh) kex->done = 1; kex->flags &= ~KEX_INITIAL; sshbuf_reset(kex->peer); - kex->flags &= ~KEX_INIT_SENT; + kex->flags &= ~(KEX_INIT_SENT|KEX_INIT_RECVD); return 0; } @@ -624,6 +624,11 @@ kex_input_kexinit(int type, uint32_t seq, struct ssh *ssh) } free(kex->name); kex->name = NULL; + if ((kex->flags & KEX_INIT_RECVD) != 0) { + ssh_packet_disconnect(ssh, + "multiple KEXINIT received from peer"); + } + kex->flags |= KEX_INIT_RECVD; ssh_dispatch_set(ssh, SSH2_MSG_KEXINIT, &kex_protocol_error); ptr = sshpkt_ptr(ssh, &dlen); if ((r = sshbuf_put(kex->peer, ptr, dlen)) != 0) diff --git a/kex.h b/kex.h index 4f6d92164c7e..a4d50f1a3d24 100644 --- a/kex.h +++ b/kex.h @@ -1,4 +1,4 @@ -/* $OpenBSD: kex.h,v 1.129 2026/03/05 05:40:36 djm Exp $ */ +/* $OpenBSD: kex.h,v 1.130 2026/05/31 04:44:38 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. @@ -115,6 +115,7 @@ enum kex_exchange { #define KEX_HAS_PING 0x0020 #define KEX_HAS_EXT_INFO_IN_AUTH 0x0040 #define KEX_HAS_NEWAGENT 0x0080 /* only set in client */ +#define KEX_INIT_RECVD 0x0100 /* kex->pq */ #define KEX_NOT_PQ 0 diff --git a/packet.c b/packet.c index 78316626fe66..8d8f73ca0263 100644 --- a/packet.c +++ b/packet.c @@ -1,4 +1,4 @@ -/* $OpenBSD: packet.c,v 1.337 2026/05/31 04:37:56 djm Exp $ */ +/* $OpenBSD: packet.c,v 1.338 2026/05/31 04:44:38 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1949,6 +1949,13 @@ ssh_packet_read_poll_seqnr(struct ssh *ssh, u_char *typep, uint32_t *seqnr_p) DBG(debug("Received SSH2_MSG_PONG len %zu", len)); break; default: + if (ssh->kex != NULL && + (ssh->kex->flags & KEX_INIT_RECVD) != 0 && + !ssh_packet_type_is_kex(*typep)) { + error("non-transport message %u received " + "from peer during key exchange", *typep); + return SSH_ERR_PROTOCOL_ERROR; + } return 0; } } From 8dfe7ed6e2fd988de08df508355a196b956b2753 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 31 May 2026 04:47:29 +0000 Subject: [PATCH 069/196] upstream: DisableForwarding=yes didn't override PermitTunnel=yes Reported independently by Huzaifa Sidhpurwala of Redhat and Marko Jevtic; ok markus@ OpenBSD-Commit-ID: b5c13f0746cf079b21f8deba47407fad49ccbf4c --- serverloop.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/serverloop.c b/serverloop.c index 8e63480ecefa..8a6e3db8024e 100644 --- a/serverloop.c +++ b/serverloop.c @@ -1,4 +1,4 @@ -/* $OpenBSD: serverloop.c,v 1.246 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: serverloop.c,v 1.247 2026/05/31 04:47:29 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -523,7 +523,7 @@ server_request_tun(struct ssh *ssh) ssh_packet_send_debug(ssh, "Unsupported tunnel device mode."); return NULL; } - if ((options.permit_tun & mode) == 0) { + if ((options.permit_tun & mode) == 0 || options.disable_forwarding) { ssh_packet_send_debug(ssh, "Server has rejected tunnel device " "forwarding"); return NULL; From 073faa6beceea162eeeb7963c7352a6c851e507a Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 31 May 2026 04:51:45 +0000 Subject: [PATCH 070/196] upstream: Fix two separate one-byte out-of-cound reads 1) if a server sent an empty reply to a SSH2_FXP_REALPATH request 2) if a batch command used the full 2048 byte buffer but ended in a literal backslash character Both reported by Zhenpeng (Leo) Lin from depthfirst ok markus@ OpenBSD-Commit-ID: d1ccc1f5a6eb109065ce8a552fea8e502381ce59 --- sftp.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sftp.c b/sftp.c index eebb166e8de4..0ab9206c2772 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.250 2026/02/11 17:01:34 dtucker Exp $ */ +/* $OpenBSD: sftp.c,v 1.251 2026/05/31 04:51:45 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -369,10 +369,9 @@ path_strip(const char *path, const char *strip) { size_t len; - if (strip == NULL) + if (strip == NULL || (len = strlen(strip)) == 0) return (xstrdup(path)); - len = strlen(strip); if (strncmp(path, strip, len) == 0) { if (strip[len - 1] != '/' && path[len] == '/') len++; @@ -1283,6 +1282,8 @@ makeargv(const char *arg, int *argcp, int sloppy, char *lastquote, /* Unescape everything */ /* XXX support \n and friends? */ i++; + if (arg[i] == '\0') + goto early_nul; argvs[j++] = arg[i]; } } @@ -1293,6 +1294,7 @@ makeargv(const char *arg, int *argcp, int sloppy, char *lastquote, goto string_done; } else if (arg[i] == '\0') { if (state == MA_SQUOTE || state == MA_DQUOTE) { + early_nul: if (sloppy) { state = MA_UNQUOTED; if (terminated != NULL) From 5a5e47740b6466d58242aca28b9e584bab4ccf1d Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 31 May 2026 04:59:51 +0000 Subject: [PATCH 071/196] upstream: disallow use of the copy-data extension to read and write to the same inode simultaneously; reported by Qifan Zhang of Palo Alto Networks; ok markus@ OpenBSD-Commit-ID: 94ceb85146d92dbc1289c55d308498d5f56f274a --- sftp-server.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/sftp-server.c b/sftp-server.c index ebdb31d32c6a..ed57339d5b13 100644 --- a/sftp-server.c +++ b/sftp-server.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-server.c,v 1.153 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: sftp-server.c,v 1.154 2026/05/31 04:59:51 djm Exp $ */ /* * Copyright (c) 2000-2004 Markus Friedl. All rights reserved. * @@ -1606,6 +1606,7 @@ process_extended_copy_data(uint32_t id) uint64_t len, read_off, read_len, write_off; int r, copy_until_eof, status = SSH2_FX_OP_UNSUPPORTED; size_t ret; + struct stat st_read, st_write; if ((r = get_handle(iqueue, &read_handle)) != 0 || (r = sshbuf_get_u64(iqueue, &read_off)) != 0 || @@ -1628,12 +1629,30 @@ process_extended_copy_data(uint32_t id) } else copy_until_eof = 0; + /* Disallow reading & writing to the same handle, path or inode */ read_fd = handle_to_fd(read_handle); write_fd = handle_to_fd(write_handle); - - /* Disallow reading & writing to the same handle or same path or dirs */ + if (fstat(read_fd, &st_read) != 0) { + status = errno_to_portable(errno); + error_f("fstat read_fd failed: %s", strerror(errno)); + goto out; + } + if (fstat(write_fd, &st_write) != 0) { + status = errno_to_portable(errno); + error_f("fstat write_fd failed: %s", strerror(errno)); + goto out; + } if (read_handle == write_handle || read_fd < 0 || write_fd < 0 || - !strcmp(handle_to_name(read_handle), handle_to_name(write_handle))) { + !strcmp(handle_to_name(read_handle), handle_to_name(write_handle)) || + (st_read.st_dev != 0 && st_read.st_ino != 0 && + st_read.st_dev == st_write.st_dev && + st_read.st_ino == st_write.st_ino)) { + error_f("refusing to read/write same file: " + "read \"%s\" dev %lu ino %lu, write \"%s\" dev %lu ino %lu", + handle_to_name(read_handle), + (u_long)st_read.st_dev, (u_long)st_read.st_ino, + handle_to_name(write_handle), + (u_long)st_write.st_dev, (u_long)st_write.st_ino); status = SSH2_FX_FAILURE; goto out; } From df18979e1137f41a3ffa25f9d06c4fc55073cb34 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 31 May 2026 05:55:21 +0000 Subject: [PATCH 072/196] upstream: DNS0x20[1] can randomise the case of domain names returned by lookup to force some more uniqueness in queries to reduce the likelihood of spoofing attacks succeeding. Normally this should be hidden from the user by the resolver, but in some cases it can leak through. When it does, it can mess up ssh's CanonicalizePermittedCNAMEs. Fix this by forcing the name we received from the system resolver to lowercase. bz3966, report and fix by Martin D Kealey [1] https://datatracker.ietf.org/doc/html/draft-vixie-dnsext-dns0x20-00 OpenBSD-Commit-ID: e0b300d3b3af289e053d928380af71949f95bfb0 --- ssh.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ssh.c b/ssh.c index 943e1908eec4..91c16dcca571 100644 --- a/ssh.c +++ b/ssh.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh.c,v 1.631 2026/05/31 04:24:39 djm Exp $ */ +/* $OpenBSD: ssh.c,v 1.632 2026/05/31 05:55:21 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -399,6 +399,7 @@ check_follow_cname(int direct, char **namep, const char *cname) "\"%s\" => \"%s\"", *namep, cname); free(*namep); *namep = xstrdup(cname); + lowercase(*namep); return 1; } return 0; From a1dd1c80687fbfbdca19d3a314a8176b90ae471b Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 31 May 2026 06:14:42 +0000 Subject: [PATCH 073/196] upstream: avoid strlen(NULL) crash if an X11 channel was created before the x11-req SSH_MSG_CHANNEL_REQUEST was sent. Reported by Ben Perry via GHPR679 OpenBSD-Commit-ID: 31db0da9ab6c73e6bbf4021ffd53dc3ce5c65f23 --- channels.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/channels.c b/channels.c index 0d4cc08068cd..949f5776530d 100644 --- a/channels.c +++ b/channels.c @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.459 2026/04/20 07:43:52 job Exp $ */ +/* $OpenBSD: channels.c,v 1.460 2026/05/31 06:14:42 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1376,6 +1376,11 @@ x11_open_helper(struct ssh *ssh, struct sshbuf *b) u_char *ucp; u_int proto_len, data_len; + if (sc->x11_saved_proto == NULL) { + error("X11 forwarding opened before X11 forwarding requested"); + return -1; + } + /* Is this being called after the refusal deadline? */ if (sc->x11_refuse_time != 0 && monotime() >= sc->x11_refuse_time) { From bebc855fdb3f8c7f96fd392f67bec2134cc42b1b Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 31 May 2026 11:30:50 +0000 Subject: [PATCH 074/196] upstream: big refactor of sshd config management code. This generates much of the initialisation, defaults and keyword table code from a set of macros rather than hand coding them. These same macros are also used to generate serialisation and deserialisation code. The macros are admittedly ugly but have the advantage of forcing a good degree of consistency across places that need to stay in sync with each other. The new de/serialisation code is used to pass configurations across the various sshd-* process boundaries. This removes the need to pass around raw text configurations that need to be re-parsed as well as eliminating some raw pointer leakage across the processes where structures were previously clumsily serialised. feedback/ok markus@ OpenBSD-Commit-ID: 9a5109a480637e08c290eeb82aa8ef2ca7e848ce --- monitor.c | 58 +- monitor_wrap.c | 84 +-- monitor_wrap.h | 6 +- servconf.c | 1927 +++++++++++++++++++++++++++++++++++------------- servconf.h | 471 +++++++----- sshd-auth.c | 57 +- 6 files changed, 1733 insertions(+), 870 deletions(-) diff --git a/monitor.c b/monitor.c index 9d6672bb628e..73a85408e400 100644 --- a/monitor.c +++ b/monitor.c @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor.c,v 1.255 2026/03/28 05:06:16 djm Exp $ */ +/* $OpenBSD: monitor.c,v 1.256 2026/05/31 11:30:50 djm Exp $ */ /* * Copyright 2002 Niels Provos * Copyright 2002 Markus Friedl @@ -592,34 +592,26 @@ monitor_reset_key_state(void) int mm_answer_state(struct ssh *ssh, int sock, struct sshbuf *unused) { - struct sshbuf *m = NULL, *inc = NULL, *hostkeys = NULL; + struct sshbuf *m = NULL, *config = NULL, *hostkeys = NULL; struct sshbuf *opts = NULL, *confdata = NULL; - struct include_item *item = NULL; int postauth; int r; debug_f("config len %zu", sshbuf_len(cfg)); if ((m = sshbuf_new()) == NULL || - (inc = sshbuf_new()) == NULL || + (config = sshbuf_new()) == NULL || (opts = sshbuf_new()) == NULL || (confdata = sshbuf_new()) == NULL) fatal_f("sshbuf_new failed"); - /* XXX unnecessary? */ - /* pack includes into a string */ - TAILQ_FOREACH(item, &includes, entry) { - if ((r = sshbuf_put_cstring(inc, item->selector)) != 0 || - (r = sshbuf_put_cstring(inc, item->filename)) != 0 || - (r = sshbuf_put_stringb(inc, item->contents)) != 0) - fatal_fr(r, "compose includes"); - } - hostkeys = pack_hostkeys(); + if ((r = serialise_server_options(&options, &config)) != 0) + fatal_fr(r, "serialise_server_options"); /* * Protocol from monitor to unpriv privsep process: - * string configuration + * string configuration_blob * uint64 timing_secret XXX move delays to monitor and remove * string host_keys[] { * string public_key @@ -627,23 +619,17 @@ mm_answer_state(struct ssh *ssh, int sock, struct sshbuf *unused) * } * string server_banner * string client_banner - * string included_files[] { - * string selector - * string filename - * string contents - * } * string configuration_data (postauth) * string keystate (postauth) * string authenticated_user (postauth) * string session_info (postauth) * string authopts (postauth) */ - if ((r = sshbuf_put_stringb(m, cfg)) != 0 || + if ((r = sshbuf_put_stringb(m, config)) != 0 || (r = sshbuf_put_u64(m, options.timing_secret)) != 0 || (r = sshbuf_put_stringb(m, hostkeys)) != 0 || (r = sshbuf_put_stringb(m, ssh->kex->server_version)) != 0 || - (r = sshbuf_put_stringb(m, ssh->kex->client_version)) != 0 || - (r = sshbuf_put_stringb(m, inc)) != 0) + (r = sshbuf_put_stringb(m, ssh->kex->client_version)) != 0) fatal_fr(r, "compose config"); postauth = (authctxt && authctxt->pw && authctxt->authenticated); @@ -652,7 +638,7 @@ mm_answer_state(struct ssh *ssh, int sock, struct sshbuf *unused) fatal_f("internal error: called in postauth"); } - sshbuf_free(inc); + sshbuf_free(config); sshbuf_free(opts); sshbuf_free(confdata); sshbuf_free(hostkeys); @@ -832,27 +818,15 @@ void mm_encode_server_options(struct sshbuf *m) { int r; - u_int i; + struct sshbuf *config; - /* XXX this leaks raw pointers to the unpriv child processes */ - if ((r = sshbuf_put_string(m, &options, sizeof(options))) != 0) + if ((config = sshbuf_new()) == NULL) + fatal_f("sshbuf_new failed"); + if ((r = serialise_server_options(&options, &config)) != 0) + fatal_fr(r, "serialise_server_options"); + if ((r = sshbuf_put_stringb(m, config)) != 0) fatal_fr(r, "assemble options"); - -#define M_CP_STROPT(x) do { \ - if (options.x != NULL && \ - (r = sshbuf_put_cstring(m, options.x)) != 0) \ - fatal_fr(r, "assemble %s", #x); \ - } while (0) -#define M_CP_STRARRAYOPT(x, nx, clobber) do { \ - for (i = 0; i < options.nx; i++) { \ - if ((r = sshbuf_put_cstring(m, options.x[i])) != 0) \ - fatal_fr(r, "assemble %s", #x); \ - } \ - } while (0) - /* See comment in servconf.h */ - COPY_MATCH_STRING_OPTS(); -#undef M_CP_STROPT -#undef M_CP_STRARRAYOPT + sshbuf_free(config); } /* Retrieves the password entry and also checks if the user is permitted */ diff --git a/monitor_wrap.c b/monitor_wrap.c index 81596a4cc66b..e2b9a2802898 100644 --- a/monitor_wrap.c +++ b/monitor_wrap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor_wrap.c,v 1.146 2026/03/02 02:40:15 djm Exp $ */ +/* $OpenBSD: monitor_wrap.c,v 1.147 2026/05/31 11:30:50 djm Exp $ */ /* * Copyright 2002 Niels Provos * Copyright 2002 Markus Friedl @@ -302,55 +302,20 @@ mm_sshkey_sign(struct ssh *ssh, struct sshkey *key, u_char **sigp, size_t *lenp, void mm_decode_activate_server_options(struct ssh *ssh, struct sshbuf *m) { - const u_char *p; - size_t len; - u_int i; - ServerOptions *newopts; + struct sshbuf *config; int r; + u_int i; - if ((r = sshbuf_get_string_direct(m, &p, &len)) != 0) + if ((r = sshbuf_froms(m, &config)) != 0) fatal_fr(r, "parse opts"); - if (len != sizeof(*newopts)) - fatal_f("option block size mismatch"); - newopts = xcalloc(sizeof(*newopts), 1); - memcpy(newopts, p, sizeof(*newopts)); - -#define M_CP_STROPT(x) do { \ - if (newopts->x != NULL && \ - (r = sshbuf_get_cstring(m, &newopts->x, NULL)) != 0) \ - fatal_fr(r, "parse %s", #x); \ - } while (0) -#define M_CP_STRARRAYOPT(x, nx, clobber) do { \ - newopts->x = newopts->nx == 0 ? \ - NULL : xcalloc(newopts->nx, sizeof(*newopts->x)); \ - for (i = 0; i < newopts->nx; i++) { \ - if ((r = sshbuf_get_cstring(m, \ - &newopts->x[i], NULL)) != 0) \ - fatal_fr(r, "parse %s", #x); \ - } \ - } while (0) - /* See comment in servconf.h */ - COPY_MATCH_STRING_OPTS(); -#undef M_CP_STROPT -#undef M_CP_STRARRAYOPT + if ((r = deserialise_server_options(config, &options)) != 0) + fatal_fr(r, "deserialise_server_options"); + sshbuf_free(config); - copy_set_server_options(&options, newopts, 1); log_change_level(options.log_level); log_verbose_reset(); for (i = 0; i < options.num_log_verbose; i++) log_verbose_add(options.log_verbose[i]); - - /* use the macro hell to clean up too */ -#define M_CP_STROPT(x) free(newopts->x) -#define M_CP_STRARRAYOPT(x, nx, clobber) do { \ - for (i = 0; i < newopts->nx; i++) \ - free(newopts->x[i]); \ - free(newopts->x); \ - } while (0) - COPY_MATCH_STRING_OPTS(); -#undef M_CP_STROPT -#undef M_CP_STRARRAYOPT - free(newopts); } #define GETPW(b, id) \ @@ -885,22 +850,19 @@ mm_terminate(void) /* Request state information */ void -mm_get_state(struct ssh *ssh, struct include_list *includes, - struct sshbuf *conf, struct sshbuf **confdatap, +mm_get_state(struct ssh *ssh, + ServerOptions *opts, struct sshbuf **confdatap, uint64_t *timing_secretp, struct sshbuf **hostkeysp, struct sshbuf **keystatep, u_char **pw_namep, struct sshbuf **authinfop, struct sshbuf **auth_optsp) { - struct sshbuf *m, *inc; - u_char *cp; - size_t len; + struct sshbuf *m, *config; int r; - struct include_item *item; debug3_f("entering"); - if ((m = sshbuf_new()) == NULL || (inc = sshbuf_new()) == NULL) + if ((m = sshbuf_new()) == NULL || (config = sshbuf_new()) == NULL) fatal_f("sshbuf_new failed"); mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_STATE, m); @@ -909,12 +871,11 @@ mm_get_state(struct ssh *ssh, struct include_list *includes, mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_STATE, m); - if ((r = sshbuf_get_string(m, &cp, &len)) != 0 || + if ((r = sshbuf_froms(m, &config)) != 0 || (r = sshbuf_get_u64(m, timing_secretp)) != 0 || (r = sshbuf_froms(m, hostkeysp)) != 0 || (r = sshbuf_get_stringb(m, ssh->kex->server_version)) != 0 || - (r = sshbuf_get_stringb(m, ssh->kex->client_version)) != 0 || - (r = sshbuf_get_stringb(m, inc)) != 0) + (r = sshbuf_get_stringb(m, ssh->kex->client_version)) != 0) fatal_fr(r, "parse config"); /* postauth */ @@ -926,24 +887,11 @@ mm_get_state(struct ssh *ssh, struct include_list *includes, (r = sshbuf_froms(m, auth_optsp)) != 0) fatal_fr(r, "parse config postauth"); } + if ((r = deserialise_server_options(config, opts)) != 0) + fatal_fr(r, "deserialise_server_options"); - if (conf != NULL && (r = sshbuf_put(conf, cp, len))) - fatal_fr(r, "sshbuf_put"); - - while (sshbuf_len(inc) != 0) { - item = xcalloc(1, sizeof(*item)); - if ((item->contents = sshbuf_new()) == NULL) - fatal_f("sshbuf_new failed"); - if ((r = sshbuf_get_cstring(inc, &item->selector, NULL)) != 0 || - (r = sshbuf_get_cstring(inc, &item->filename, NULL)) != 0 || - (r = sshbuf_get_stringb(inc, item->contents)) != 0) - fatal_fr(r, "parse includes"); - TAILQ_INSERT_TAIL(includes, item, entry); - } - - free(cp); sshbuf_free(m); - sshbuf_free(inc); + sshbuf_free(config); debug3_f("done"); } diff --git a/monitor_wrap.h b/monitor_wrap.h index c2f7f97d977a..f43759b21d5c 100644 --- a/monitor_wrap.h +++ b/monitor_wrap.h @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor_wrap.h,v 1.54 2026/03/02 02:40:15 djm Exp $ */ +/* $OpenBSD: monitor_wrap.h,v 1.55 2026/05/31 11:30:50 djm Exp $ */ /* * Copyright 2002 Niels Provos @@ -96,8 +96,8 @@ void mm_session_pty_cleanup2(struct Session *); void mm_send_keystate(struct ssh *, struct monitor*); /* state */ -struct include_list; -void mm_get_state(struct ssh *, struct include_list *, struct sshbuf *, +struct ServerOptions; +void mm_get_state(struct ssh *, struct ServerOptions *, struct sshbuf **, uint64_t *, struct sshbuf **, struct sshbuf **, u_char **, struct sshbuf **, struct sshbuf **); diff --git a/servconf.c b/servconf.c index 668259a2074b..b378a8aee719 100644 --- a/servconf.c +++ b/servconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: servconf.c,v 1.446 2026/04/02 07:38:14 djm Exp $ */ +/* $OpenBSD: servconf.c,v 1.447 2026/05/31 11:30:50 djm Exp $ */ /* * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland * All rights reserved @@ -63,6 +63,8 @@ #include "digest.h" #include "version.h" +#define SSHD_CONFIG_BLOB_VERSION 1 + #if !defined(SSHD_PAM_SERVICE) # define SSHD_PAM_SERVICE "sshd" #endif @@ -83,136 +85,107 @@ void initialize_server_options(ServerOptions *options) { memset(options, 0, sizeof(*options)); - - /* Portable-specific options */ - options->use_pam = -1; - options->pam_service_name = NULL; - - /* Standard Options */ - options->num_ports = 0; - options->ports_from_cmdline = 0; - options->queued_listen_addrs = NULL; - options->num_queued_listens = 0; - options->listen_addrs = NULL; +#define SSHCONF_INT(var, conf, flags, ms, def, cp) options->var = -1; +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) options->var = -1; +#define SSHCONF_STRING(var, conf, flags, cp) options->var = NULL; +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) \ + options->nvar = 0; \ + options->var = NULL; +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) \ + init_##funcsuffix(options) +#define SSHCONF_NONCONF(funcsuffix) \ + init_##funcsuffix(options) +#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) /* empty */ +#define SSHCONF_ALIAS(old, conf, flags) /* empty */ + + /* Using macros for these is a bit overkill but forces consistency */ +#define init_hostkeyfile(options) \ + options->host_key_files = 0; \ + options->num_host_key_files = 0; \ + options->host_key_file_userprovided = NULL; +#define init_ipqos(options) \ + options->ip_qos_interactive = -1; \ + options->ip_qos_bulk = -1; +#define init_listenaddress(options) \ + options->queued_listen_addrs = NULL; \ + options->num_queued_listens = 0; \ + options->listen_addrs = NULL; \ options->num_listen_addrs = 0; - options->address_family = -1; - options->routing_domain = NULL; - options->num_host_key_files = 0; - options->num_host_cert_files = 0; - options->host_key_agent = NULL; - options->pid_file = NULL; - options->login_grace_time = -1; - options->permit_root_login = PERMIT_NOT_SET; - options->ignore_rhosts = -1; - options->ignore_user_known_hosts = -1; - options->print_motd = -1; - options->print_lastlog = -1; - options->x11_forwarding = -1; - options->x11_display_offset = -1; - options->x11_use_localhost = -1; - options->permit_tty = -1; - options->permit_user_rc = -1; - options->xauth_location = NULL; - options->strict_modes = -1; - options->tcp_keep_alive = -1; +#define init_logfacility(options) \ options->log_facility = SYSLOG_FACILITY_NOT_SET; +#define init_loglevel(options) \ options->log_level = SYSLOG_LEVEL_NOT_SET; - options->num_log_verbose = 0; - options->log_verbose = NULL; - options->hostbased_authentication = -1; - options->hostbased_uses_name_from_packet_only = -1; - options->hostbased_accepted_algos = NULL; - options->hostkeyalgorithms = NULL; - options->pubkey_authentication = -1; - options->pubkey_auth_options = -1; - options->pubkey_accepted_algos = NULL; - options->kerberos_authentication = -1; - options->kerberos_or_local_passwd = -1; - options->kerberos_ticket_cleanup = -1; - options->kerberos_get_afs_token = -1; - options->gss_authentication=-1; - options->gss_cleanup_creds = -1; - options->gss_deleg_creds = -1; - options->gss_strict_acceptor = -1; - options->password_authentication = -1; - options->kbd_interactive_authentication = -1; - options->permit_empty_passwd = -1; - options->permit_user_env = -1; - options->permit_user_env_allowlist = NULL; - options->compression = -1; - options->rekey_limit = -1; - options->rekey_interval = -1; - options->allow_tcp_forwarding = -1; - options->allow_streamlocal_forwarding = -1; - options->allow_agent_forwarding = -1; - options->num_allow_users = 0; - options->num_deny_users = 0; - options->num_allow_groups = 0; - options->num_deny_groups = 0; - options->ciphers = NULL; - options->macs = NULL; - options->kex_algorithms = NULL; - options->ca_sign_algorithms = NULL; +#define init_port(options) \ + options->num_ports = 0; \ + options->ports_from_cmdline = 0; +#define init_gatewayports(options) \ options->fwd_opts.gateway_ports = -1; +#define init_streamlocalbindmask(options) \ options->fwd_opts.streamlocal_bind_mask = (mode_t)-1; +#define init_streamlocalbindunlink(options) \ options->fwd_opts.streamlocal_bind_unlink = -1; - options->num_subsystems = 0; - options->max_startups_begin = -1; - options->max_startups_rate = -1; +#define init_maxstartups(options) \ + options->max_startups_begin = -1; \ + options->max_startups_rate = -1; \ options->max_startups = -1; - options->per_source_max_startups = -1; - options->per_source_masklen_ipv4 = -1; +#define init_permituserenv(options) \ + options->permit_user_env = -1; \ + options->permit_user_env_allowlist = NULL; +#define init_persourcenetblocksize(options) \ + options->per_source_masklen_ipv4 = -1; \ options->per_source_masklen_ipv6 = -1; - options->per_source_penalty_exempt = NULL; - options->per_source_penalty.enabled = -1; - options->per_source_penalty.max_sources4 = -1; - options->per_source_penalty.max_sources6 = -1; - options->per_source_penalty.overflow_mode = -1; - options->per_source_penalty.overflow_mode6 = -1; - options->per_source_penalty.penalty_crash = -1.0; - options->per_source_penalty.penalty_authfail = -1.0; - options->per_source_penalty.penalty_invaliduser = -1.0; - options->per_source_penalty.penalty_noauth = -1.0; - options->per_source_penalty.penalty_grace = -1.0; - options->per_source_penalty.penalty_refuseconnection = -1.0; - options->per_source_penalty.penalty_max = -1.0; +#define init_persourcepenalties(options) \ + options->per_source_penalty_exempt = NULL; \ + options->per_source_penalty.enabled = -1; \ + options->per_source_penalty.max_sources4 = -1; \ + options->per_source_penalty.max_sources6 = -1; \ + options->per_source_penalty.overflow_mode = -1; \ + options->per_source_penalty.overflow_mode6 = -1; \ + options->per_source_penalty.penalty_crash = -1.0; \ + options->per_source_penalty.penalty_authfail = -1.0; \ + options->per_source_penalty.penalty_invaliduser = -1.0; \ + options->per_source_penalty.penalty_noauth = -1.0; \ + options->per_source_penalty.penalty_grace = -1.0; \ + options->per_source_penalty.penalty_refuseconnection = -1.0; \ + options->per_source_penalty.penalty_max = -1.0; \ options->per_source_penalty.penalty_min = -1.0; - options->max_authtries = -1; - options->max_sessions = -1; - options->banner = NULL; - options->use_dns = -1; - options->client_alive_interval = -1; - options->client_alive_count_max = -1; - options->num_authkeys_files = 0; - options->num_accept_env = 0; - options->num_setenv = 0; - options->permit_tun = -1; - options->permitted_opens = NULL; - options->permitted_listens = NULL; - options->adm_forced_command = NULL; - options->chroot_directory = NULL; - options->authorized_keys_command = NULL; - options->authorized_keys_command_user = NULL; - options->revoked_keys_files = NULL; - options->num_revoked_keys_files = 0; - options->sk_provider = NULL; - options->trusted_user_ca_keys = NULL; - options->authorized_principals_file = NULL; - options->authorized_principals_command = NULL; - options->authorized_principals_command_user = NULL; - options->ip_qos_interactive = -1; - options->ip_qos_bulk = -1; - options->version_addendum = NULL; - options->fingerprint_hash = -1; - options->disable_forwarding = -1; - options->expose_userauth_info = -1; - options->required_rsa_size = -1; - options->channel_timeouts = NULL; - options->num_channel_timeouts = 0; - options->unused_connection_timeout = -1; - options->sshd_session_path = NULL; - options->sshd_auth_path = NULL; - options->refuse_connection = -1; +#define init_rekeylimit(options) \ + options->rekey_limit = -1; \ + options->rekey_interval = -1; +#define init_subsystem(options) \ + options->num_subsystems = 0; \ + options->subsystem_name = NULL; \ + options->subsystem_command = NULL; \ + options->subsystem_args = NULL; +#define init_timingsecret(options) \ + options->timing_secret = 0; + + SSHD_CONFIG_ENTRIES + +#undef init_hostkeyfile +#undef init_ipqos +#undef init_listenaddress +#undef init_logfacility +#undef init_loglevel +#undef init_port +#undef init_gatewayports +#undef init_streamlocalbindmask +#undef init_streamlocalbindunlink +#undef init_maxstartups +#undef init_permituserenv +#undef init_persourcenetblocksize +#undef init_persourcepenalties +#undef init_rekeylimit +#undef init_subsystem +#undef init_timingsecret +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_NOSUPPORT +#undef SSHCONF_ALIAS } /* Returns 1 if a string option is unset or set to "none" or 0 otherwise. */ @@ -293,15 +266,34 @@ fill_default_server_options(ServerOptions *options) { u_int i; - /* Portable-specific options */ - if (options->use_pam == -1) - options->use_pam = 0; - if (options->pam_service_name == NULL) - options->pam_service_name = xstrdup(SSHD_PAM_SERVICE); +#define SSHCONF_INT(var, conf, flags, ms, def, cp) \ + if (options->var == -1) \ + options->var = def; +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) \ + if (options->var == -1) \ + options->var = def; +#define SSHCONF_STRING(var, conf, flags, cp) /* done manually */ +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) /* done manually */ +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) /* done manually */ +#define SSHCONF_NONCONF(funcsuffix) /* done manually */ +#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) /* empty */ +#define SSHCONF_ALIAS(old, conf, flags) /* empty */ + + /* XXX maybe use macros here too to force consistency? */ + + SSHD_CONFIG_ENTRIES + +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_NOSUPPORT +#undef SSHCONF_ALIAS - /* Standard Options */ if (options->num_host_key_files == 0) { - /* fill default hostkeys for protocols */ + /* fill default hostkeys */ servconf_add_hostkey("[default]", 0, options, _PATH_HOST_RSA_KEY_FILE, 0); #ifdef OPENSSL_HAS_ECC @@ -314,97 +306,26 @@ fill_default_server_options(ServerOptions *options) /* No certificates by default */ if (options->num_ports == 0) options->ports[options->num_ports++] = SSH_DEFAULT_PORT; - if (options->address_family == -1) - options->address_family = AF_UNSPEC; if (options->listen_addrs == NULL) add_listen_addr(options, NULL, NULL, 0); if (options->pid_file == NULL) options->pid_file = xstrdup(_PATH_SSH_DAEMON_PID_FILE); if (options->moduli_file == NULL) options->moduli_file = xstrdup(_PATH_DH_MODULI); - if (options->login_grace_time == -1) - options->login_grace_time = 120; - if (options->permit_root_login == PERMIT_NOT_SET) - options->permit_root_login = PERMIT_NO_PASSWD; - if (options->ignore_rhosts == -1) - options->ignore_rhosts = 1; - if (options->ignore_user_known_hosts == -1) - options->ignore_user_known_hosts = 0; - if (options->print_motd == -1) - options->print_motd = 1; - if (options->print_lastlog == -1) - options->print_lastlog = 1; - if (options->x11_forwarding == -1) - options->x11_forwarding = 0; - if (options->x11_display_offset == -1) - options->x11_display_offset = 10; - if (options->x11_use_localhost == -1) - options->x11_use_localhost = 1; if (options->xauth_location == NULL) options->xauth_location = xstrdup(_PATH_XAUTH); - if (options->permit_tty == -1) - options->permit_tty = 1; - if (options->permit_user_rc == -1) - options->permit_user_rc = 1; - if (options->strict_modes == -1) - options->strict_modes = 1; - if (options->tcp_keep_alive == -1) - options->tcp_keep_alive = 1; if (options->log_facility == SYSLOG_FACILITY_NOT_SET) options->log_facility = SYSLOG_FACILITY_AUTH; if (options->log_level == SYSLOG_LEVEL_NOT_SET) options->log_level = SYSLOG_LEVEL_INFO; - if (options->hostbased_authentication == -1) - options->hostbased_authentication = 0; - if (options->hostbased_uses_name_from_packet_only == -1) - options->hostbased_uses_name_from_packet_only = 0; - if (options->pubkey_authentication == -1) - options->pubkey_authentication = 1; - if (options->pubkey_auth_options == -1) - options->pubkey_auth_options = 0; - if (options->kerberos_authentication == -1) - options->kerberos_authentication = 0; - if (options->kerberos_or_local_passwd == -1) - options->kerberos_or_local_passwd = 1; - if (options->kerberos_ticket_cleanup == -1) - options->kerberos_ticket_cleanup = 1; - if (options->kerberos_get_afs_token == -1) - options->kerberos_get_afs_token = 0; - if (options->gss_authentication == -1) - options->gss_authentication = 0; - if (options->gss_cleanup_creds == -1) - options->gss_cleanup_creds = 1; - if (options->gss_deleg_creds == -1) - options->gss_deleg_creds = 1; - if (options->gss_strict_acceptor == -1) - options->gss_strict_acceptor = 1; - if (options->password_authentication == -1) - options->password_authentication = 1; - if (options->kbd_interactive_authentication == -1) - options->kbd_interactive_authentication = 1; - if (options->permit_empty_passwd == -1) - options->permit_empty_passwd = 0; if (options->permit_user_env == -1) { options->permit_user_env = 0; options->permit_user_env_allowlist = NULL; } - if (options->compression == -1) -#ifdef WITH_ZLIB - options->compression = COMP_DELAYED; -#else - options->compression = COMP_NONE; -#endif - if (options->rekey_limit == -1) options->rekey_limit = 0; if (options->rekey_interval == -1) options->rekey_interval = 0; - if (options->allow_tcp_forwarding == -1) - options->allow_tcp_forwarding = FORWARD_ALLOW; - if (options->allow_streamlocal_forwarding == -1) - options->allow_streamlocal_forwarding = FORWARD_ALLOW; - if (options->allow_agent_forwarding == -1) - options->allow_agent_forwarding = 1; if (options->fwd_opts.gateway_ports == -1) options->fwd_opts.gateway_ports = 0; if (options->max_startups == -1) @@ -413,8 +334,6 @@ fill_default_server_options(ServerOptions *options) options->max_startups_rate = 30; /* 30% */ if (options->max_startups_begin == -1) options->max_startups_begin = 10; - if (options->per_source_max_startups == -1) - options->per_source_max_startups = INT_MAX; if (options->per_source_masklen_ipv4 == -1) options->per_source_masklen_ipv4 = 32; if (options->per_source_masklen_ipv6 == -1) @@ -445,16 +364,6 @@ fill_default_server_options(ServerOptions *options) options->per_source_penalty.penalty_min = 15.0; if (options->per_source_penalty.penalty_max < 0.0) options->per_source_penalty.penalty_max = 600.0; - if (options->max_authtries == -1) - options->max_authtries = DEFAULT_AUTH_FAIL_MAX; - if (options->max_sessions == -1) - options->max_sessions = DEFAULT_SESSIONS_MAX; - if (options->use_dns == -1) - options->use_dns = 0; - if (options->client_alive_interval == -1) - options->client_alive_interval = 0; - if (options->client_alive_count_max == -1) - options->client_alive_count_max = 3; if (options->num_authkeys_files == 0) { opt_array_append("[default]", 0, "AuthorizedKeysFiles", &options->authorized_keys_files, @@ -465,8 +374,6 @@ fill_default_server_options(ServerOptions *options) &options->num_authkeys_files, _PATH_SSH_USER_PERMITTED_KEYS2); } - if (options->permit_tun == -1) - options->permit_tun = SSH_TUNMODE_NO; if (options->ip_qos_interactive == -1) options->ip_qos_interactive = IPTOS_DSCP_EF; if (options->ip_qos_bulk == -1) @@ -477,24 +384,12 @@ fill_default_server_options(ServerOptions *options) options->fwd_opts.streamlocal_bind_mask = 0177; if (options->fwd_opts.streamlocal_bind_unlink == -1) options->fwd_opts.streamlocal_bind_unlink = 0; - if (options->fingerprint_hash == -1) - options->fingerprint_hash = SSH_FP_HASH_DEFAULT; - if (options->disable_forwarding == -1) - options->disable_forwarding = 0; - if (options->expose_userauth_info == -1) - options->expose_userauth_info = 0; if (options->sk_provider == NULL) options->sk_provider = xstrdup("internal"); - if (options->required_rsa_size == -1) - options->required_rsa_size = SSH_RSA_MINIMUM_MODULUS_SIZE; - if (options->unused_connection_timeout == -1) - options->unused_connection_timeout = 0; if (options->sshd_session_path == NULL) options->sshd_session_path = xstrdup(_PATH_SSHD_SESSION); if (options->sshd_auth_path == NULL) options->sshd_auth_path = xstrdup(_PATH_SSHD_AUTH); - if (options->refuse_connection == -1) - options->refuse_connection = 0; assemble_algorithms(options); @@ -540,47 +435,31 @@ fill_default_server_options(ServerOptions *options) #undef CLEAR_ON_NONE_ARRAY } +/* Macros to declare ServerOpCodes enum values */ +#define SSHCONF_INT(var, conf, flags, ms, def, cp) s##conf, +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) s##conf, +#define SSHCONF_STRING(var, conf, flags, cp) s##conf, +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) s##conf, +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) s##conf, +#define SSHCONF_NONCONF(funcsuffix) /* empty */ +#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) /* empty */ +#define SSHCONF_ALIAS(old, conf, flags) /* empty */ + /* Keyword tokens. */ typedef enum { sBadOption, /* == unknown option */ - /* Portable-specific options */ - sUsePAM, sPAMServiceName, - /* Standard Options */ - sPort, sHostKeyFile, sLoginGraceTime, - sPermitRootLogin, sLogFacility, sLogLevel, sLogVerbose, - sKerberosAuthentication, sKerberosOrLocalPasswd, sKerberosTicketCleanup, - sKerberosGetAFSToken, sPasswordAuthentication, - sKbdInteractiveAuthentication, sListenAddress, sAddressFamily, - sPrintMotd, sPrintLastLog, sIgnoreRhosts, - sX11Forwarding, sX11DisplayOffset, sX11UseLocalhost, - sPermitTTY, sStrictModes, sEmptyPasswd, sTCPKeepAlive, - sPermitUserEnvironment, sAllowTcpForwarding, sCompression, - sRekeyLimit, sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups, - sIgnoreUserKnownHosts, sCiphers, sMacs, sPidFile, sModuliFile, - sGatewayPorts, sPubkeyAuthentication, sPubkeyAcceptedAlgorithms, - sXAuthLocation, sSubsystem, sMaxStartups, sMaxAuthTries, sMaxSessions, - sBanner, sUseDNS, sHostbasedAuthentication, - sHostbasedUsesNameFromPacketOnly, sHostbasedAcceptedAlgorithms, - sHostKeyAlgorithms, sPerSourceMaxStartups, sPerSourceNetBlockSize, - sPerSourcePenalties, sPerSourcePenaltyExemptList, - sClientAliveInterval, sClientAliveCountMax, sAuthorizedKeysFile, - sGssAuthentication, sGssCleanupCreds, sGssDelegateCreds, sGssStrictAcceptor, - sAcceptEnv, sSetEnv, sPermitTunnel, - sMatch, sPermitOpen, sPermitListen, sForceCommand, sChrootDirectory, - sUsePrivilegeSeparation, sAllowAgentForwarding, - sHostCertificate, sInclude, - sRevokedKeys, sTrustedUserCAKeys, sAuthorizedPrincipalsFile, - sAuthorizedPrincipalsCommand, sAuthorizedPrincipalsCommandUser, - sKexAlgorithms, sCASignatureAlgorithms, sIPQoS, sVersionAddendum, - sAuthorizedKeysCommand, sAuthorizedKeysCommandUser, - sAuthenticationMethods, sHostKeyAgent, sPermitUserRC, - sStreamLocalBindMask, sStreamLocalBindUnlink, - sAllowStreamLocalForwarding, sFingerprintHash, sDisableForwarding, - sExposeAuthInfo, sRDomain, sPubkeyAuthOptions, sSecurityKeyProvider, - sRequiredRSASize, sChannelTimeout, sUnusedConnectionTimeout, - sSshdSessionPath, sSshdAuthPath, sRefuseConnection, + SSHD_CONFIG_ENTRIES + sMatch, sInclude, sDeprecated, sIgnore, sUnsupported } ServerOpCodes; +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_NOSUPPORT +#undef SSHCONF_ALIAS #define SSHCFG_GLOBAL 0x01 /* allowed in main section of config */ #define SSHCFG_MATCH 0x02 /* allowed inside a Match section */ @@ -588,170 +467,44 @@ typedef enum { #define SSHCFG_NEVERMATCH 0x04 /* Match never matches; internal only */ #define SSHCFG_MATCH_ONLY 0x08 /* Match only in conditional blocks; internal only */ +/* Macros to define keywords[] entries */ +#define SSHCONF_KW(conf, flags) { #conf, s##conf, flags }, +#define SSHCONF_INT(var, conf, flags, ms, def, cp) SSHCONF_KW(conf, flags) +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) SSHCONF_KW(conf, flags) +#define SSHCONF_STRING(var, conf, flags, cp) SSHCONF_KW(conf, flags) +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) SSHCONF_KW(conf, flags) +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) SSHCONF_KW(conf, flags) +#define SSHCONF_NONCONF(funcsuffix) /* empty */ +#define SSHCONF_DEPRECATED sDeprecated +#define SSHCONF_IGNORE sIgnore +#define SSHCONF_UNSUPPORTED sUnsupported +#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) \ + { #conf, opcode, flags }, +#define SSHCONF_ALIAS(old, conf, flags) \ + { #old, s##conf, flags }, + /* Textual representation of the tokens. */ static struct { const char *name; ServerOpCodes opcode; u_int flags; } keywords[] = { - /* Portable-specific options */ -#ifdef USE_PAM - { "usepam", sUsePAM, SSHCFG_GLOBAL }, - { "pamservicename", sPAMServiceName, SSHCFG_ALL }, -#else - { "usepam", sUnsupported, SSHCFG_GLOBAL }, - { "pamservicename", sUnsupported, SSHCFG_ALL }, -#endif - { "pamauthenticationviakbdint", sDeprecated, SSHCFG_GLOBAL }, - /* Standard Options */ - { "port", sPort, SSHCFG_GLOBAL }, - { "hostkey", sHostKeyFile, SSHCFG_GLOBAL }, - { "hostdsakey", sHostKeyFile, SSHCFG_GLOBAL }, /* alias */ - { "hostkeyagent", sHostKeyAgent, SSHCFG_GLOBAL }, - { "pidfile", sPidFile, SSHCFG_GLOBAL }, - { "modulifile", sModuliFile, SSHCFG_GLOBAL }, - { "serverkeybits", sDeprecated, SSHCFG_GLOBAL }, - { "logingracetime", sLoginGraceTime, SSHCFG_GLOBAL }, - { "keyregenerationinterval", sDeprecated, SSHCFG_GLOBAL }, - { "permitrootlogin", sPermitRootLogin, SSHCFG_ALL }, - { "syslogfacility", sLogFacility, SSHCFG_GLOBAL }, - { "loglevel", sLogLevel, SSHCFG_ALL }, - { "logverbose", sLogVerbose, SSHCFG_ALL }, - { "rhostsauthentication", sDeprecated, SSHCFG_GLOBAL }, - { "rhostsrsaauthentication", sDeprecated, SSHCFG_ALL }, - { "hostbasedauthentication", sHostbasedAuthentication, SSHCFG_ALL }, - { "hostbasedusesnamefrompacketonly", sHostbasedUsesNameFromPacketOnly, SSHCFG_ALL }, - { "hostbasedacceptedalgorithms", sHostbasedAcceptedAlgorithms, SSHCFG_ALL }, - { "hostbasedacceptedkeytypes", sHostbasedAcceptedAlgorithms, SSHCFG_ALL }, /* obsolete */ - { "hostkeyalgorithms", sHostKeyAlgorithms, SSHCFG_GLOBAL }, - { "rsaauthentication", sDeprecated, SSHCFG_ALL }, - { "pubkeyauthentication", sPubkeyAuthentication, SSHCFG_ALL }, - { "pubkeyacceptedalgorithms", sPubkeyAcceptedAlgorithms, SSHCFG_ALL }, - { "pubkeyacceptedkeytypes", sPubkeyAcceptedAlgorithms, SSHCFG_ALL }, /* obsolete */ - { "pubkeyauthoptions", sPubkeyAuthOptions, SSHCFG_ALL }, - { "dsaauthentication", sPubkeyAuthentication, SSHCFG_GLOBAL }, /* alias */ -#ifdef KRB5 - { "kerberosauthentication", sKerberosAuthentication, SSHCFG_ALL }, - { "kerberosorlocalpasswd", sKerberosOrLocalPasswd, SSHCFG_GLOBAL }, - { "kerberosticketcleanup", sKerberosTicketCleanup, SSHCFG_GLOBAL }, -#ifdef USE_AFS - { "kerberosgetafstoken", sKerberosGetAFSToken, SSHCFG_GLOBAL }, -#else - { "kerberosgetafstoken", sUnsupported, SSHCFG_GLOBAL }, -#endif -#else - { "kerberosauthentication", sUnsupported, SSHCFG_ALL }, - { "kerberosorlocalpasswd", sUnsupported, SSHCFG_GLOBAL }, - { "kerberosticketcleanup", sUnsupported, SSHCFG_GLOBAL }, - { "kerberosgetafstoken", sUnsupported, SSHCFG_GLOBAL }, -#endif - { "kerberostgtpassing", sUnsupported, SSHCFG_GLOBAL }, - { "afstokenpassing", sUnsupported, SSHCFG_GLOBAL }, -#ifdef GSSAPI - { "gssapiauthentication", sGssAuthentication, SSHCFG_ALL }, - { "gssapicleanupcredentials", sGssCleanupCreds, SSHCFG_GLOBAL }, - { "gssapidelegatecredentials", sGssDelegateCreds, SSHCFG_GLOBAL }, - { "gssapistrictacceptorcheck", sGssStrictAcceptor, SSHCFG_GLOBAL }, -#else - { "gssapiauthentication", sUnsupported, SSHCFG_ALL }, - { "gssapicleanupcredentials", sUnsupported, SSHCFG_GLOBAL }, - { "gssapidelegatecredentials", sUnsupported, SSHCFG_GLOBAL }, - { "gssapistrictacceptorcheck", sUnsupported, SSHCFG_GLOBAL }, -#endif - { "passwordauthentication", sPasswordAuthentication, SSHCFG_ALL }, - { "kbdinteractiveauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL }, - { "challengeresponseauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL }, /* alias */ - { "skeyauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL }, /* alias */ - { "checkmail", sDeprecated, SSHCFG_GLOBAL }, - { "listenaddress", sListenAddress, SSHCFG_GLOBAL }, - { "addressfamily", sAddressFamily, SSHCFG_GLOBAL }, - { "printmotd", sPrintMotd, SSHCFG_GLOBAL }, -#ifdef DISABLE_LASTLOG - { "printlastlog", sUnsupported, SSHCFG_GLOBAL }, -#else - { "printlastlog", sPrintLastLog, SSHCFG_GLOBAL }, -#endif - { "ignorerhosts", sIgnoreRhosts, SSHCFG_ALL }, - { "ignoreuserknownhosts", sIgnoreUserKnownHosts, SSHCFG_GLOBAL }, - { "x11forwarding", sX11Forwarding, SSHCFG_ALL }, - { "x11displayoffset", sX11DisplayOffset, SSHCFG_ALL }, - { "x11uselocalhost", sX11UseLocalhost, SSHCFG_ALL }, - { "xauthlocation", sXAuthLocation, SSHCFG_GLOBAL }, - { "strictmodes", sStrictModes, SSHCFG_GLOBAL }, - { "permitemptypasswords", sEmptyPasswd, SSHCFG_ALL }, - { "permituserenvironment", sPermitUserEnvironment, SSHCFG_GLOBAL }, - { "uselogin", sDeprecated, SSHCFG_GLOBAL }, - { "compression", sCompression, SSHCFG_GLOBAL }, - { "rekeylimit", sRekeyLimit, SSHCFG_ALL }, - { "tcpkeepalive", sTCPKeepAlive, SSHCFG_GLOBAL }, - { "keepalive", sTCPKeepAlive, SSHCFG_GLOBAL }, /* obsolete alias */ - { "allowtcpforwarding", sAllowTcpForwarding, SSHCFG_ALL }, - { "allowagentforwarding", sAllowAgentForwarding, SSHCFG_ALL }, - { "allowusers", sAllowUsers, SSHCFG_ALL }, - { "denyusers", sDenyUsers, SSHCFG_ALL }, - { "allowgroups", sAllowGroups, SSHCFG_ALL }, - { "denygroups", sDenyGroups, SSHCFG_ALL }, - { "ciphers", sCiphers, SSHCFG_GLOBAL }, - { "macs", sMacs, SSHCFG_GLOBAL }, - { "protocol", sIgnore, SSHCFG_GLOBAL }, - { "gatewayports", sGatewayPorts, SSHCFG_ALL }, - { "subsystem", sSubsystem, SSHCFG_ALL }, - { "maxstartups", sMaxStartups, SSHCFG_GLOBAL }, - { "persourcemaxstartups", sPerSourceMaxStartups, SSHCFG_GLOBAL }, - { "persourcenetblocksize", sPerSourceNetBlockSize, SSHCFG_GLOBAL }, - { "persourcepenalties", sPerSourcePenalties, SSHCFG_GLOBAL }, - { "persourcepenaltyexemptlist", sPerSourcePenaltyExemptList, SSHCFG_GLOBAL }, - { "maxauthtries", sMaxAuthTries, SSHCFG_ALL }, - { "maxsessions", sMaxSessions, SSHCFG_ALL }, - { "banner", sBanner, SSHCFG_ALL }, - { "usedns", sUseDNS, SSHCFG_GLOBAL }, - { "verifyreversemapping", sDeprecated, SSHCFG_GLOBAL }, - { "reversemappingcheck", sDeprecated, SSHCFG_GLOBAL }, - { "clientaliveinterval", sClientAliveInterval, SSHCFG_ALL }, - { "clientalivecountmax", sClientAliveCountMax, SSHCFG_ALL }, - { "authorizedkeysfile", sAuthorizedKeysFile, SSHCFG_ALL }, - { "authorizedkeysfile2", sDeprecated, SSHCFG_ALL }, - { "useprivilegeseparation", sDeprecated, SSHCFG_GLOBAL}, - { "acceptenv", sAcceptEnv, SSHCFG_ALL }, - { "setenv", sSetEnv, SSHCFG_ALL }, - { "permittunnel", sPermitTunnel, SSHCFG_ALL }, - { "permittty", sPermitTTY, SSHCFG_ALL }, - { "permituserrc", sPermitUserRC, SSHCFG_ALL }, + SSHD_CONFIG_ENTRIES { "match", sMatch, SSHCFG_ALL }, - { "permitopen", sPermitOpen, SSHCFG_ALL }, - { "permitlisten", sPermitListen, SSHCFG_ALL }, - { "forcecommand", sForceCommand, SSHCFG_ALL }, - { "chrootdirectory", sChrootDirectory, SSHCFG_ALL }, - { "hostcertificate", sHostCertificate, SSHCFG_GLOBAL }, - { "revokedkeys", sRevokedKeys, SSHCFG_ALL }, - { "trustedusercakeys", sTrustedUserCAKeys, SSHCFG_ALL }, - { "authorizedprincipalsfile", sAuthorizedPrincipalsFile, SSHCFG_ALL }, - { "kexalgorithms", sKexAlgorithms, SSHCFG_GLOBAL }, { "include", sInclude, SSHCFG_ALL }, - { "ipqos", sIPQoS, SSHCFG_ALL }, - { "authorizedkeyscommand", sAuthorizedKeysCommand, SSHCFG_ALL }, - { "authorizedkeyscommanduser", sAuthorizedKeysCommandUser, SSHCFG_ALL }, - { "authorizedprincipalscommand", sAuthorizedPrincipalsCommand, SSHCFG_ALL }, - { "authorizedprincipalscommanduser", sAuthorizedPrincipalsCommandUser, SSHCFG_ALL }, - { "versionaddendum", sVersionAddendum, SSHCFG_GLOBAL }, - { "authenticationmethods", sAuthenticationMethods, SSHCFG_ALL }, - { "streamlocalbindmask", sStreamLocalBindMask, SSHCFG_ALL }, - { "streamlocalbindunlink", sStreamLocalBindUnlink, SSHCFG_ALL }, - { "allowstreamlocalforwarding", sAllowStreamLocalForwarding, SSHCFG_ALL }, - { "fingerprinthash", sFingerprintHash, SSHCFG_GLOBAL }, - { "disableforwarding", sDisableForwarding, SSHCFG_ALL }, - { "exposeauthinfo", sExposeAuthInfo, SSHCFG_ALL }, - { "rdomain", sRDomain, SSHCFG_ALL }, - { "casignaturealgorithms", sCASignatureAlgorithms, SSHCFG_ALL }, - { "securitykeyprovider", sSecurityKeyProvider, SSHCFG_GLOBAL }, - { "requiredrsasize", sRequiredRSASize, SSHCFG_ALL }, - { "channeltimeout", sChannelTimeout, SSHCFG_ALL }, - { "unusedconnectiontimeout", sUnusedConnectionTimeout, SSHCFG_ALL }, - { "sshdsessionpath", sSshdSessionPath, SSHCFG_GLOBAL }, - { "sshdauthpath", sSshdAuthPath, SSHCFG_GLOBAL }, - { "refuseconnection", sRefuseConnection, SSHCFG_ALL }, { NULL, sBadOption, 0 } }; +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_DEPRECATED +#undef SSHCONF_IGNORE +#undef SSHCONF_UNSUPPORTED +#undef SSHCONF_NOSUPPORT +#undef SSHCONF_ALIAS static struct { int val; @@ -1044,12 +797,13 @@ match_cfg_line(const char *full_line, int *acp, char ***avp, full_line, line); } else { debug3("checking match for '%s' user %s%s host %s addr %s " - "laddr %s lport %d on line %d", full_line, + "laddr %s lport %d rdomain %s on line %d", full_line, ci->user ? ci->user : "(null)", ci->user_invalid ? " (invalid)" : "", ci->host ? ci->host : "(null)", ci->address ? ci->address : "(null)", - ci->laddress ? ci->laddress : "(null)", ci->lport, line); + ci->laddress ? ci->laddress : "(null)", ci->lport, + ci->rdomain ? ci->rdomain : "(null)", line); } while ((oattrib = argv_next(acp, avp)) != NULL) { @@ -1389,6 +1143,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, switch (opcode) { /* Portable-specific options */ +#ifdef WITH_PAM case sUsePAM: intptr = &options->use_pam; goto parse_flag; @@ -1402,6 +1157,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, if (*activep && *charptr == NULL) *charptr = xstrdup(arg); break; +#endif /* Standard Options */ case sBadOption: @@ -1499,7 +1255,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, *intptr = value; break; - case sHostKeyFile: + case sHostKey: arg = argv_next(&ac, &av); if (!arg || *arg == '\0') fatal("%s line %d: missing file name.", @@ -1630,6 +1386,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, *intptr = value; break; +#ifdef KRB5 case sKerberosAuthentication: intptr = &options->kerberos_authentication; goto parse_flag; @@ -1641,11 +1398,14 @@ process_server_config_line_depth(ServerOptions *options, char *line, case sKerberosTicketCleanup: intptr = &options->kerberos_ticket_cleanup; goto parse_flag; - +#ifdef USE_AFS case sKerberosGetAFSToken: intptr = &options->kerberos_get_afs_token; goto parse_flag; +#endif /* USE_AFS */ +#endif /* KRB5 */ +#ifdef GSSAPI case sGssAuthentication: intptr = &options->gss_authentication; goto parse_flag; @@ -1661,6 +1421,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, case sGssStrictAcceptor: intptr = &options->gss_strict_acceptor; goto parse_flag; +#endif /* GSSAPI */ case sPasswordAuthentication: intptr = &options->password_authentication; @@ -1674,9 +1435,11 @@ process_server_config_line_depth(ServerOptions *options, char *line, intptr = &options->print_motd; goto parse_flag; +#ifndef DISABLE_LASTLOG case sPrintLastLog: intptr = &options->print_lastlog; goto parse_flag; +#endif case sX11Forwarding: intptr = &options->x11_forwarding; @@ -1717,7 +1480,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, intptr = &options->tcp_keep_alive; goto parse_flag; - case sEmptyPasswd: + case sPermitEmptyPasswords: intptr = &options->permit_empty_passwd; goto parse_flag; @@ -1789,7 +1552,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, intptr = &options->use_dns; goto parse_flag; - case sLogFacility: + case sSyslogFacility: log_facility_ptr = &options->log_facility; arg = argv_next(&ac, &av); value = log_facility_number(arg); @@ -2854,6 +2617,7 @@ parse_server_match_config(ServerOptions *options, parse_server_config(&mo, "reprocess config", cfg, includes, connectinfo, 0); copy_set_server_options(options, &mo, 0); + free_server_options(&mo); } int @@ -2932,122 +2696,1230 @@ servconf_merge_subsystems(ServerOptions *dst, ServerOptions *src) } } -/* - * Copy any supported values that are set. - * - * If the preauth flag is set, we do not bother copying the string or - * array values that are not used pre-authentication, because any that we - * do use must be explicitly sent in mm_getpwnamallow(). - */ -void -copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth) +static int +serialise_s32(struct sshbuf *buf, int v) +{ + uint32_t uv; + int r; + + uv = v < 0 ? (uint32_t)(-(v + 1)) + 1 : (uint32_t)v; + if ((r = sshbuf_put_u8(buf, v < 0)) != 0 || + (r = sshbuf_put_u32(buf, uv)) != 0) + return r; + return 0; +} + +static int +serialise_s64(struct sshbuf *buf, int64_t v) +{ + uint64_t uv; + int r; + + uv = v < 0 ? (uint64_t)(-(v + 1)) + 1 : (uint64_t)v; + if ((r = sshbuf_put_u8(buf, v < 0)) != 0 || + (r = sshbuf_put_u64(buf, uv)) != 0) + return r; + return 0; +} + +static int +serialise_mode(struct sshbuf *buf, mode_t v) { -#define M_CP_INTOPT(n) do {\ - if (src->n != -1) \ - dst->n = src->n; \ -} while (0) - - M_CP_INTOPT(password_authentication); - M_CP_INTOPT(gss_authentication); - M_CP_INTOPT(pubkey_authentication); - M_CP_INTOPT(pubkey_auth_options); - M_CP_INTOPT(kerberos_authentication); - M_CP_INTOPT(hostbased_authentication); - M_CP_INTOPT(hostbased_uses_name_from_packet_only); - M_CP_INTOPT(kbd_interactive_authentication); - M_CP_INTOPT(permit_root_login); - M_CP_INTOPT(permit_empty_passwd); - M_CP_INTOPT(ignore_rhosts); - - M_CP_INTOPT(allow_tcp_forwarding); - M_CP_INTOPT(allow_streamlocal_forwarding); - M_CP_INTOPT(allow_agent_forwarding); - M_CP_INTOPT(disable_forwarding); - M_CP_INTOPT(expose_userauth_info); - M_CP_INTOPT(permit_tun); - M_CP_INTOPT(fwd_opts.gateway_ports); - M_CP_INTOPT(fwd_opts.streamlocal_bind_unlink); - M_CP_INTOPT(x11_display_offset); - M_CP_INTOPT(x11_forwarding); - M_CP_INTOPT(x11_use_localhost); - M_CP_INTOPT(permit_tty); - M_CP_INTOPT(permit_user_rc); - M_CP_INTOPT(max_sessions); - M_CP_INTOPT(max_authtries); - M_CP_INTOPT(client_alive_count_max); - M_CP_INTOPT(client_alive_interval); - M_CP_INTOPT(ip_qos_interactive); - M_CP_INTOPT(ip_qos_bulk); - M_CP_INTOPT(rekey_limit); - M_CP_INTOPT(rekey_interval); - M_CP_INTOPT(log_level); - M_CP_INTOPT(required_rsa_size); - M_CP_INTOPT(unused_connection_timeout); - M_CP_INTOPT(refuse_connection); + u_int uv; + + if (v == (mode_t)-1) + return serialise_s32(buf, -1); + uv = (u_int)v; + if ((mode_t)uv != v || uv > 0777) + return SSH_ERR_INVALID_FORMAT; + return serialise_s32(buf, (int)uv); +} +static int +serialise_double(struct sshbuf *buf, double v) +{ /* - * The bind_mask is a mode_t that may be unsigned, so we can't use - * M_CP_INTOPT - it does a signed comparison that causes compiler - * warnings. + * XXX this is no good for a wire encoding. + * It's fine for passing configurations via RPC, but it would + * be nicer to have an exact binary encoding here. */ - if (src->fwd_opts.streamlocal_bind_mask != (mode_t)-1) { - dst->fwd_opts.streamlocal_bind_mask = - src->fwd_opts.streamlocal_bind_mask; + return sshbuf_put(buf, &v, sizeof(v)); +} + +static int +serialise_nullable_string(struct sshbuf *buf, const char *s) +{ + int r; + + if ((r = sshbuf_put_u8(buf, s != NULL)) != 0) + return r; + if (s == NULL) + return 0; + return sshbuf_put_cstring(buf, s); +} + +static int +serialise_nullable_string_array(struct sshbuf *buf, char **a, u_int n) +{ + int r; + u_int i; + + if ((r = sshbuf_put_u32(buf, n)) != 0) + return r; + for (i = 0; i < n; i++) { + if ((r = serialise_nullable_string(buf, a[i])) != 0) + return r; } + return 0; +} - /* M_CP_STROPT and M_CP_STRARRAYOPT should not appear before here */ -#define M_CP_STROPT(n) do {\ - if (src->n != NULL && dst->n != src->n) { \ - free(dst->n); \ - dst->n = xstrdup(src->n); \ - } \ -} while(0) -#define M_CP_STRARRAYOPT(s, num_s, clobber) do {\ - u_int i; \ - if (src->num_s != 0) { \ - for (i = 0; i < dst->num_s; i++) \ - free(dst->s[i]); \ - free(dst->s); \ - dst->s = xcalloc(src->num_s, sizeof(*dst->s)); \ - for (i = 0; i < src->num_s; i++) \ - dst->s[i] = xstrdup(src->s[i]); \ - if (clobber) \ - dst->num_s = src->num_s; \ - } \ -} while(0) - - /* See comment in servconf.h */ - COPY_MATCH_STRING_OPTS(); +static int +serialise_hostkeyfile(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + u_int i; - /* Arguments that accept '+...' need to be expanded */ - assemble_algorithms(dst); + if ((r = sshbuf_put_u32(buf, options->num_host_key_files)) != 0) { + error_fr(r, "serialise length"); + return r; + } + for (i = 0; i < options->num_host_key_files; i++) { + if ((r = serialise_s32(buf, + options->host_key_file_userprovided[i])) != 0 || + (r = serialise_nullable_string(buf, + options->host_key_files[i])) != 0) { + error_fr(r, "serialise member"); + return r; + } + } + return 0; +} - /* - * The only things that should be below this point are string options - * which are only used after authentication. - */ - if (preauth) - return; +static int +serialise_ipqos(const ServerOptions *options, struct sshbuf *buf) +{ + int r; - /* These options may be "none" to clear a global setting */ - M_CP_STROPT(adm_forced_command); - if (option_clear_or_none(dst->adm_forced_command)) { - free(dst->adm_forced_command); - dst->adm_forced_command = NULL; + if ((r = serialise_s32(buf, options->ip_qos_interactive)) != 0 || + (r = serialise_s32(buf, options->ip_qos_bulk)) != 0) { + error_fr(r, "serialise"); + return r; } - M_CP_STROPT(chroot_directory); - if (option_clear_or_none(dst->chroot_directory)) { - free(dst->chroot_directory); - dst->chroot_directory = NULL; + + return 0; +} + +static int +serialise_listenaddress(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + u_int i; + + /* Note: only serialises queued listen addresses */ + if ((r = sshbuf_put_u32(buf, options->num_queued_listens)) != 0) { + error_fr(r, "serialise length"); + return r; + } + for (i = 0; i < options->num_queued_listens; i++) { + const struct queued_listenaddr *qla = + options->queued_listen_addrs + i; + + if ((r = sshbuf_put_cstring(buf, qla->addr)) != 0 || + (r = serialise_s32(buf, qla->port)) != 0 || + (r = serialise_nullable_string(buf, qla->rdomain)) != 0) { + error_fr(r, "serialise member"); + return r; + } + } + return 0; +} + +static int +serialise_logfacility(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_s32(buf, (int)options->log_facility)) != 0) { + error_fr(r, "serialise"); + return r; } - /* Subsystems require merging. */ - servconf_merge_subsystems(dst, src); + return 0; +} + +static int +serialise_loglevel(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_s32(buf, (int)options->log_level)) != 0) { + error_fr(r, "serialise"); + return r; + } + + return 0; +} + +static int +serialise_port(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + u_int i; + + if ((r = sshbuf_put_u32(buf, options->num_ports)) != 0) { + error_fr(r, "serialise length"); + return r; + } + for (i = 0; i < options->num_ports; i++) { + if ((r = serialise_s32(buf, options->ports[i])) != 0) { + error_fr(r, "serialise port"); + return r; + } + } + return 0; +} + +static int +serialise_gatewayports(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_s32(buf, options->fwd_opts.gateway_ports)) != 0) { + error_fr(r, "serialise"); + return r; + } + return 0; +} + +static int +serialise_streamlocalbindmask(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_mode(buf, + options->fwd_opts.streamlocal_bind_mask)) != 0) { + error_fr(r, "serialise"); + return r; + } + return 0; +} + +static int +serialise_streamlocalbindunlink(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = sshbuf_put_u8(buf, + (options->fwd_opts.streamlocal_bind_unlink != 0))) != 0) { + error_fr(r, "serialise"); + return r; + } + return 0; +} + +static int +serialise_maxstartups(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_s32(buf, options->max_startups_begin)) != 0 || + (r = serialise_s32(buf, options->max_startups_rate)) != 0 || + (r = serialise_s32(buf, options->max_startups)) != 0) { + error_fr(r, "serialise"); + return r; + } + + return 0; +} + +static int +serialise_permituserenv(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_s32(buf, options->permit_user_env)) != 0 || + (r = serialise_nullable_string(buf, + options->permit_user_env_allowlist)) != 0) { + error_fr(r, "serialise"); + return r; + } + + return 0; +} + +static int +serialise_persourcenetblocksize(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_s32(buf, options->per_source_masklen_ipv4)) != 0 || + (r = serialise_s32(buf, options->per_source_masklen_ipv6)) != 0) { + error_fr(r, "serialise"); + return r; + } + + return 0; +} + +static int +serialise_persourcepenalties(const ServerOptions *options, struct sshbuf *buf) +{ + const struct per_source_penalty *psp = &options->per_source_penalty; + int r; + + if ((r = serialise_s32(buf, psp->enabled)) != 0 || + (r = serialise_s32(buf, psp->max_sources4)) != 0 || + (r = serialise_s32(buf, psp->max_sources6)) != 0 || + (r = serialise_s32(buf, psp->overflow_mode)) != 0 || + (r = serialise_s32(buf, psp->overflow_mode6)) != 0 || + (r = serialise_double(buf, psp->penalty_crash)) != 0 || + (r = serialise_double(buf, psp->penalty_grace)) != 0 || + (r = serialise_double(buf, psp->penalty_authfail)) != 0 || + (r = serialise_double(buf, psp->penalty_invaliduser)) != 0 || + (r = serialise_double(buf, psp->penalty_noauth)) != 0 || + (r = serialise_double(buf, psp->penalty_refuseconnection)) != 0 || + (r = serialise_double(buf, psp->penalty_max)) != 0 || + (r = serialise_double(buf, psp->penalty_min)) != 0) { + error_fr(r, "serialise"); + return r; + } + + return 0; +} + +static int +serialise_rekeylimit(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = serialise_s64(buf, options->rekey_limit)) != 0 || + (r = serialise_s32(buf, options->rekey_interval)) != 0) { + error_fr(r, "serialise"); + return r; + } + + return 0; +} + +static int +serialise_subsystem(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + u_int i; + + if ((r = sshbuf_put_u32(buf, options->num_subsystems)) != 0) { + error_fr(r, "serialise length"); + return r; + } + for (i = 0; i < options->num_subsystems; i++) { + if ((r = sshbuf_put_cstring(buf, + options->subsystem_name[i])) != 0 || + (r = sshbuf_put_cstring(buf, + options->subsystem_command[i])) != 0 || + (r = sshbuf_put_cstring(buf, + options->subsystem_args[i])) != 0) { + error_fr(r, "serialise member"); + return r; + } + } + return 0; +} + +static int +serialise_timingsecret(const ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = sshbuf_put_u64(buf, options->timing_secret)) != 0) { + error_fr(r, "serialise"); + return r; + } + return 0; } -#undef M_CP_INTOPT -#undef M_CP_STROPT -#undef M_CP_STRARRAYOPT + +int +serialise_server_options(const ServerOptions *options, struct sshbuf **bufp) +{ + struct sshbuf *buf = NULL; + int r = SSH_ERR_INTERNAL_ERROR; + + *bufp = NULL; + + if ((buf = sshbuf_new()) == NULL) + return SSH_ERR_ALLOC_FAIL; + if ((r = sshbuf_put_u32(buf, SSHD_CONFIG_BLOB_VERSION)) != 0) { + error_fr(r, "serialise version"); + goto out; + } + +#define SSHCONF_INT(var, conf, flags, ms, def, cp) \ + if ((r = serialise_s32(buf, options->var)) != 0) { \ + error_fr(r, "serialise %s", #var); \ + goto out; \ + } +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) \ + if ((r = serialise_s32(buf, options->var)) != 0) { \ + error_fr(r, "serialise %s", #var); \ + goto out; \ + } +#define SSHCONF_STRING(var, conf, flags, cp) \ + if ((r = serialise_nullable_string(buf, options->var)) != 0) { \ + error_fr(r, "serialise %s", #var); \ + goto out; \ + } +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) \ + if ((r = serialise_nullable_string_array(buf, options->var, \ + options->nvar)) != 0) { \ + error_fr(r, "serialise %s", #var); \ + goto out; \ + } +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) \ + if ((r = serialise_##funcsuffix(options, buf)) != 0) \ + goto out; +#define SSHCONF_NONCONF(funcsuffix) \ + if ((r = serialise_##funcsuffix(options, buf)) != 0) \ + goto out; +#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) /* empty */ +#define SSHCONF_ALIAS(old, conf, flags) /* empty */ + + SSHD_CONFIG_ENTRIES + +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_NOSUPPORT +#undef SSHCONF_ALIAS + + /* success */ + r = 0; + *bufp = buf; + buf = NULL; /* transferred */ + out: + sshbuf_free(buf); + return r; +} + +static int +deserialise_s32(struct sshbuf *buf, int *v) +{ + uint32_t tmp; + int r; + u_char was_signed; + + if ((r = sshbuf_get_u8(buf, &was_signed)) != 0 || + (r = sshbuf_get_u32(buf, &tmp)) != 0) + return r; + if (was_signed > 1) + return SSH_ERR_INVALID_FORMAT; + if (was_signed) { + if (tmp > (uint32_t)INT_MAX + 1) + return SSH_ERR_INVALID_FORMAT; + *v = tmp == (uint32_t)INT_MAX + 1 ? INT_MIN : -(int)tmp; + } else { + if (tmp > INT_MAX) + return SSH_ERR_INVALID_FORMAT; + *v = (int)tmp; + } + return 0; +} + +static int +deserialise_s64(struct sshbuf *buf, int64_t *v) +{ + uint64_t tmp; + int r; + u_char was_signed; + + if ((r = sshbuf_get_u8(buf, &was_signed)) != 0 || + (r = sshbuf_get_u64(buf, &tmp)) != 0) + return r; + if (was_signed > 1) + return SSH_ERR_INVALID_FORMAT; + if (was_signed) { + if (tmp > (uint64_t)INT64_MAX + 1) + return SSH_ERR_INVALID_FORMAT; + *v = tmp == (uint64_t)INT64_MAX + 1 ? + INT64_MIN : -(int64_t)tmp; + } else { + if (tmp > INT64_MAX) + return SSH_ERR_INVALID_FORMAT; + *v = (int64_t)tmp; + } + return 0; +} + +static int +deserialise_mode(struct sshbuf *buf, mode_t *v) +{ + int r, tmp; + + if ((r = deserialise_s32(buf, &tmp)) != 0) + return r; + if (tmp == -1) { + *v = (mode_t)-1; + return 0; + } + if (tmp < 0 || tmp > 0777) + return SSH_ERR_INVALID_FORMAT; + *v = (mode_t)tmp; + return 0; +} + +static int +deserialise_double(struct sshbuf *buf, double *v) +{ + return sshbuf_get(buf, v, sizeof(*v)); +} + +static int +deserialise_nullable_string(struct sshbuf *buf, char **sp) +{ + int r; + u_char present; + + if ((r = sshbuf_get_u8(buf, &present)) != 0) + return r; + if (present == 0) { + *sp = NULL; + return 0; + } + if (present != 1) + return SSH_ERR_INVALID_FORMAT; + return sshbuf_get_cstring(buf, sp, NULL); +} + +static void +free_string_array(char **a, u_int n) +{ + u_int i; + + if (a == NULL) + return; + for (i = 0; i < n; i++) + free(a[i]); + free(a); +} + +static int +deserialise_count(struct sshbuf *buf, u_int *np, const char *what) +{ + int r; + uint32_t n; + + if ((r = sshbuf_get_u32(buf, &n)) != 0) { + error_fr(r, "deserialise %s length", what); + return r; + } + if (n > UINT_MAX) { + error_f("bad number of %s", what); + return SSH_ERR_INVALID_FORMAT; + } + if (n > sshbuf_len(buf)) { + error_f("bad number of %s", what); + return SSH_ERR_INVALID_FORMAT; + } + *np = n; + return 0; +} + +static int +deserialise_nullable_string_array(struct sshbuf *buf, char ***arrayp, + u_int *np) +{ + char **a = NULL; + int r; + u_int i, n; + + *arrayp = NULL; + *np = 0; + if ((r = deserialise_count(buf, &n, "strings")) != 0) + return r; + if (n > 0) + a = xcalloc(n, sizeof(*a)); + for (i = 0; i < n; i++) { + if ((r = deserialise_nullable_string(buf, a + i)) != 0) { + free_string_array(a, i + 1); + return r; + } + } + *arrayp = a; + *np = n; + return 0; +} + +static void +free_queued_listen_addrs(struct queued_listenaddr *qla, u_int n) +{ + u_int i; + + if (qla == NULL) + return; + for (i = 0; i < n; i++) { + free(qla[i].addr); + free(qla[i].rdomain); + } + free(qla); +} + +static int +deserialise_hostkeyfile(ServerOptions *options, struct sshbuf *buf) +{ + int r, *userprovided = NULL; + u_int i, n; + char **files = NULL; + + if ((r = deserialise_count(buf, &n, "host key files")) != 0) + return r; + if (n > 0) { + userprovided = xcalloc(n, sizeof(*userprovided)); + files = xcalloc(n, sizeof(*files)); + } + for (i = 0; i < n; i++) { + if ((r = deserialise_s32(buf, userprovided + i)) != 0 || + (r = deserialise_nullable_string(buf, files + i)) != 0) { + error_fr(r, "deserialise member"); + free_string_array(files, i + 1); + free(userprovided); + return r; + } + } + options->num_host_key_files = n; + options->host_key_file_userprovided = userprovided; + options->host_key_files = files; + return 0; +} + +static int +deserialise_ipqos(ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = deserialise_s32(buf, &options->ip_qos_interactive)) != 0 || + (r = deserialise_s32(buf, &options->ip_qos_bulk)) != 0) { + error_fr(r, "deserialise"); + return r; + } + + return 0; +} + +static int +deserialise_listenaddress(ServerOptions *options, struct sshbuf *buf) +{ + int r; + u_int i, n; + struct queued_listenaddr *qla = NULL; + + if ((r = deserialise_count(buf, &n, "listen addresses")) != 0) + return r; + if (n > 0) + qla = xcalloc(n, sizeof(*qla)); + for (i = 0; i < n; i++) { + if ((r = sshbuf_get_cstring(buf, &qla[i].addr, NULL)) != 0 || + (r = deserialise_s32(buf, &qla[i].port)) != 0 || + (r = deserialise_nullable_string(buf, + &qla[i].rdomain)) != 0) { + error_fr(r, "deserialise member"); + free_queued_listen_addrs(qla, i + 1); + return r; + } + } + options->num_queued_listens = n; + options->queued_listen_addrs = qla; + return 0; +} + +static int +deserialise_logfacility(ServerOptions *options, struct sshbuf *buf) +{ + int r, tmp; + + if ((r = deserialise_s32(buf, &tmp)) != 0) { + error_fr(r, "deserialise"); + return r; + } + if (tmp != SYSLOG_FACILITY_NOT_SET && + log_facility_name((SyslogFacility)tmp) == NULL) { + error_f("bad syslog facility"); + return SSH_ERR_INVALID_FORMAT; + } + options->log_facility = (SyslogFacility)tmp; + + return 0; +} + +static int +deserialise_loglevel(ServerOptions *options, struct sshbuf *buf) +{ + int r, tmp; + + if ((r = deserialise_s32(buf, &tmp)) != 0) { + error_fr(r, "deserialise"); + return r; + } + if (tmp != SYSLOG_LEVEL_NOT_SET && + log_level_name((LogLevel)tmp) == NULL) { + error_f("bad log level"); + return SSH_ERR_INVALID_FORMAT; + } + options->log_level = (LogLevel)tmp; + + return 0; +} + +static int +deserialise_port(ServerOptions *options, struct sshbuf *buf) +{ + int r; + u_int i, n; + + if ((r = deserialise_count(buf, &n, "ports")) != 0) + return r; + if (n > MAX_PORTS) { + error_f("bad number of ports"); + return SSH_ERR_INVALID_FORMAT; + } + options->num_ports = n; + memset(options->ports, 0, sizeof(options->ports)); + for (i = 0; i < options->num_ports; i++) { + if ((r = deserialise_s32(buf, options->ports + i)) != 0) { + error_fr(r, "deserialise port"); + return r; + } + } + return 0; +} + +static int +deserialise_gatewayports(ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = deserialise_s32(buf, &options->fwd_opts.gateway_ports)) != 0) { + error_fr(r, "deserialise"); + return r; + } + return 0; +} + +static int +deserialise_streamlocalbindmask(ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = deserialise_mode(buf, + &options->fwd_opts.streamlocal_bind_mask)) != 0) { + error_fr(r, "deserialise"); + return r; + } + return 0; +} + +static int +deserialise_streamlocalbindunlink(ServerOptions *options, struct sshbuf *buf) +{ + int r; + u_char tmp; + + if ((r = sshbuf_get_u8(buf, &tmp)) != 0) { + error_fr(r, "deserialise"); + return r; + } + if (tmp > 1) { + error_f("bad boolean"); + return SSH_ERR_INVALID_FORMAT; + } + options->fwd_opts.streamlocal_bind_unlink = tmp; + return 0; +} + +static int +deserialise_maxstartups(ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = deserialise_s32(buf, &options->max_startups_begin)) != 0 || + (r = deserialise_s32(buf, &options->max_startups_rate)) != 0 || + (r = deserialise_s32(buf, &options->max_startups)) != 0) { + error_fr(r, "deserialise"); + return r; + } + + return 0; +} + +static int +deserialise_permituserenv(ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = deserialise_s32(buf, &options->permit_user_env)) != 0 || + (r = deserialise_nullable_string(buf, + &options->permit_user_env_allowlist)) != 0) { + error_fr(r, "deserialise"); + return r; + } + return 0; +} + +static int +deserialise_persourcenetblocksize(ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = deserialise_s32(buf, + &options->per_source_masklen_ipv4)) != 0 || + (r = deserialise_s32(buf, + &options->per_source_masklen_ipv6)) != 0) { + error_fr(r, "deserialise"); + return r; + } + + return 0; +} + +static int +deserialise_persourcepenalties(ServerOptions *options, struct sshbuf *buf) +{ + struct per_source_penalty *psp = &options->per_source_penalty; + int r; + + if ((r = deserialise_s32(buf, &psp->enabled)) != 0 || + (r = deserialise_s32(buf, &psp->max_sources4)) != 0 || + (r = deserialise_s32(buf, &psp->max_sources6)) != 0 || + (r = deserialise_s32(buf, &psp->overflow_mode)) != 0 || + (r = deserialise_s32(buf, &psp->overflow_mode6)) != 0 || + (r = deserialise_double(buf, &psp->penalty_crash)) != 0 || + (r = deserialise_double(buf, &psp->penalty_grace)) != 0 || + (r = deserialise_double(buf, &psp->penalty_authfail)) != 0 || + (r = deserialise_double(buf, &psp->penalty_invaliduser)) != 0 || + (r = deserialise_double(buf, &psp->penalty_noauth)) != 0 || + (r = deserialise_double(buf, + &psp->penalty_refuseconnection)) != 0 || + (r = deserialise_double(buf, &psp->penalty_max)) != 0 || + (r = deserialise_double(buf, &psp->penalty_min)) != 0) { + error_fr(r, "deserialise"); + return r; + } + + return 0; +} + +static int +deserialise_rekeylimit(ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = deserialise_s64(buf, &options->rekey_limit)) != 0 || + (r = deserialise_s32(buf, &options->rekey_interval)) != 0) { + error_fr(r, "deserialise"); + return r; + } + + return 0; +} + +static int +deserialise_subsystem(ServerOptions *options, struct sshbuf *buf) +{ + int r; + u_int i, n; + char **names = NULL, **commands = NULL, **args = NULL; + + if ((r = deserialise_count(buf, &n, "subsystems")) != 0) + return r; + if (n > 0) { + names = xcalloc(n, sizeof(*names)); + commands = xcalloc(n, sizeof(*names)); + args = xcalloc(n, sizeof(*args)); + } + for (i = 0; i < n; i++) { + if ((r = sshbuf_get_cstring(buf, names + i, NULL)) != 0 || + (r = sshbuf_get_cstring(buf, commands + i, NULL)) != 0 || + (r = sshbuf_get_cstring(buf, args + i, NULL)) != 0) { + error_fr(r, "deserialise member"); + free_string_array(names, i + 1); + free_string_array(commands, i + 1); + free_string_array(args, i + 1); + return r; + } + } + options->num_subsystems = n; + options->subsystem_name = names; + options->subsystem_command = commands; + options->subsystem_args = args; + return 0; +} + +static int +deserialise_timingsecret(ServerOptions *options, struct sshbuf *buf) +{ + int r; + + if ((r = sshbuf_get_u64(buf, &options->timing_secret)) != 0) { + error_fr(r, "deserialise"); + return r; + } + return 0; +} + +int +deserialise_server_options(struct sshbuf *buf, ServerOptions *options) +{ + int r = SSH_ERR_INTERNAL_ERROR; + uint32_t version; + ServerOptions new_options; + + initialize_server_options(&new_options); + if ((r = sshbuf_get_u32(buf, &version)) != 0) { + error_fr(r, "deserialise version"); + goto out; + } + if (version != SSHD_CONFIG_BLOB_VERSION) { + error_f("unsupported config blob version %u", version); + r = SSH_ERR_INVALID_FORMAT; + goto out; + } +#define SSHCONF_INT(var, conf, flags, ms, def, cp) \ + if ((r = deserialise_s32(buf, &new_options.var)) != 0) { \ + error_fr(r, "deserialise %s", #var); \ + goto out; \ + } +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) \ + if ((r = deserialise_s32(buf, &new_options.var)) != 0) { \ + error_fr(r, "deserialise %s", #var); \ + goto out; \ + } +#define SSHCONF_STRING(var, conf, flags, cp) \ + if ((r = deserialise_nullable_string(buf, &new_options.var)) != 0) { \ + error_fr(r, "deserialise %s", #var); \ + goto out; \ + } +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) \ + if ((r = deserialise_nullable_string_array(buf, &new_options.var, \ + &new_options.nvar)) != 0) { \ + error_fr(r, "deserialise %s", #var); \ + goto out; \ + } +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) \ + if ((r = deserialise_##funcsuffix(&new_options, buf)) != 0) \ + goto out; +#define SSHCONF_NONCONF(funcsuffix) \ + if ((r = deserialise_##funcsuffix(&new_options, buf)) != 0) \ + goto out; +#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) /* empty */ +#define SSHCONF_ALIAS(old, conf, flags) /* empty */ + + SSHD_CONFIG_ENTRIES + + if (sshbuf_len(buf) != 0) { + error_f("trailing data in config blob"); + r = SSH_ERR_INVALID_FORMAT; + goto out; + } + +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_NOSUPPORT +#undef SSHCONF_ALIAS + + /* success */ + r = 0; + free_server_options(options); + *options = new_options; + memset(&new_options, 0, sizeof(new_options)); + out: + free_server_options(&new_options); + return r; +} + +static void +free_hostkeyfile(ServerOptions *options) +{ + u_int i; + + for (i = 0; i < options->num_host_key_files; i++) + free(options->host_key_files[i]); + free(options->host_key_files); + free(options->host_key_file_userprovided); +} + +static void +free_listenaddress(ServerOptions *options) +{ + u_int i; + + free_queued_listen_addrs(options->queued_listen_addrs, + options->num_queued_listens); + + for (i = 0; i < options->num_listen_addrs; i++) { + free(options->listen_addrs[i].rdomain); + if (options->listen_addrs[i].addrs != NULL) + freeaddrinfo(options->listen_addrs[i].addrs); + } + free(options->listen_addrs); +} + +static void +free_permituserenv(ServerOptions *options) +{ + free(options->permit_user_env_allowlist); +} + +static void +free_subsystem(ServerOptions *options) +{ + u_int i; + + for (i = 0; i < options->num_subsystems; i++) { + free(options->subsystem_name[i]); + free(options->subsystem_command[i]); + free(options->subsystem_args[i]); + } + free(options->subsystem_name); + free(options->subsystem_command); + free(options->subsystem_args); +} + +void +free_server_options(ServerOptions *options) +{ +#define SSHCONF_INT(var, conf, flags, ms, def, cp) /* empty */ +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) /* empty */ +#define SSHCONF_STRING(var, conf, flags, cp) free(options->var); +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) \ + free_string_array(options->var, options->nvar); +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) \ + free_##funcsuffix(options); +#define SSHCONF_NONCONF(funcsuffix) \ + free_##funcsuffix(options); +#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) /* empty */ +#define SSHCONF_ALIAS(old, conf, flags) /* empty */ + +#define free_ipqos(options) +#define free_logfacility(options) +#define free_loglevel(options) +#define free_port(options) +#define free_gatewayports(options) +#define free_streamlocalbindmask(options) +#define free_streamlocalbindunlink(options) +#define free_maxstartups(options) +#define free_persourcenetblocksize(options) +#define free_persourcepenalties(options) +#define free_rekeylimit(options) +#define free_timingsecret(options) + + SSHD_CONFIG_ENTRIES + +#undef free_ipqos +#undef free_logfacility +#undef free_loglevel +#undef free_port +#undef free_gatewayports +#undef free_streamlocalbindmask +#undef free_streamlocalbindunlink +#undef free_maxstartups +#undef free_persourcenetblocksize +#undef free_persourcepenalties +#undef free_rekeylimit +#undef free_timingsecret + +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_NOSUPPORT +#undef SSHCONF_ALIAS + + initialize_server_options(options); +} + +static void +copy_server_option_int(int *dst, int src) +{ + if (src != -1) + *dst = src; +} + +static void +copy_server_option_int64(int64_t *dst, int64_t src) +{ + if (src != -1) + *dst = src; +} + +static void +copy_server_option_string(char **dst, const char *src) +{ + if (src != NULL && *dst != src) { + free(*dst); + *dst = xstrdup(src); + } +} + +static void +copy_server_option_strarray_values(char ***dst, u_int ndst, + char * const *src, u_int nsrc) +{ + u_int i; + + if (nsrc == 0) + return; + for (i = 0; i < ndst; i++) + free((*dst)[i]); + free(*dst); + *dst = xcalloc(nsrc, sizeof(**dst)); + for (i = 0; i < nsrc; i++) + (*dst)[i] = src[i] == NULL ? NULL : xstrdup(src[i]); +} + +static void +copy_server_option_strarray(char ***dst, u_int *ndst, + char * const *src, u_int nsrc) +{ + if (nsrc == 0) + return; + copy_server_option_strarray_values(dst, *ndst, src, nsrc); + *ndst = nsrc; +} + +static void +copy_ipqos(ServerOptions *dst, const ServerOptions *src) +{ + copy_server_option_int(&dst->ip_qos_interactive, + src->ip_qos_interactive); + copy_server_option_int(&dst->ip_qos_bulk, src->ip_qos_bulk); +} + +static void +copy_gatewayports(ServerOptions *dst, const ServerOptions *src) +{ + copy_server_option_int(&dst->fwd_opts.gateway_ports, + src->fwd_opts.gateway_ports); +} + +static void +copy_streamlocalbindunlink(ServerOptions *dst, const ServerOptions *src) +{ + copy_server_option_int(&dst->fwd_opts.streamlocal_bind_unlink, + src->fwd_opts.streamlocal_bind_unlink); +} + +static void +copy_loglevel(ServerOptions *dst, const ServerOptions *src) +{ + if (src->log_level != -1) + dst->log_level = src->log_level; +} + +static void +copy_rekeylimit(ServerOptions *dst, const ServerOptions *src) +{ + copy_server_option_int64(&dst->rekey_limit, src->rekey_limit); + copy_server_option_int(&dst->rekey_interval, src->rekey_interval); +} + +static void +copy_subsystem(ServerOptions *dst, const ServerOptions *src) +{ + u_int old_num_subsystems = dst->num_subsystems; + + if (src->num_subsystems == 0) + return; + copy_server_option_strarray_values(&dst->subsystem_name, + old_num_subsystems, src->subsystem_name, src->num_subsystems); + copy_server_option_strarray_values(&dst->subsystem_command, + old_num_subsystems, src->subsystem_command, src->num_subsystems); + copy_server_option_strarray_values(&dst->subsystem_args, + old_num_subsystems, src->subsystem_args, src->num_subsystems); + dst->num_subsystems = src->num_subsystems; +} + +/* + * Copy any supported values that are set. + * + * If the preauth flag is set, skip the post-authentication-only manual + * string cleanup and subsystem merge below. + */ +void +copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth) +{ + if (dst == src) + return; + +#define SSHCONF_INT(var, conf, flags, ms, def, cp) \ + cp(copy_server_option_int(&dst->var, src->var);) +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) \ + cp(copy_server_option_int(&dst->var, src->var);) +#define SSHCONF_STRING(var, conf, flags, cp) \ + cp(copy_server_option_string(&dst->var, src->var);) +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) \ + cp(copy_server_option_strarray(&dst->var, &dst->nvar, \ + src->var, src->nvar);) +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) \ + cp(copy_##funcsuffix(dst, src);) +#define SSHCONF_NONCONF(funcsuffix) /* empty */ +#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) /* empty */ +#define SSHCONF_ALIAS(old, conf, flags) /* empty */ + + SSHD_CONFIG_ENTRIES + +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_NOSUPPORT +#undef SSHCONF_ALIAS + + /* + * The bind_mask is a mode_t that may be unsigned, so we can't use + * copy_server_option_int - it does a signed comparison that causes + * compiler warnings. + */ + if (src->fwd_opts.streamlocal_bind_mask != (mode_t)-1) { + dst->fwd_opts.streamlocal_bind_mask = + src->fwd_opts.streamlocal_bind_mask; + } + + /* Arguments that accept '+...' need to be expanded */ + assemble_algorithms(dst); + + /* + * The only things that should be below this point are string options + * which are only used after authentication. + */ + if (preauth) + return; + + /* These options may be "none" to clear a global setting */ + copy_server_option_string(&dst->adm_forced_command, + src->adm_forced_command); + if (option_clear_or_none(dst->adm_forced_command)) { + free(dst->adm_forced_command); + dst->adm_forced_command = NULL; + } + copy_server_option_string(&dst->chroot_directory, + src->chroot_directory); + if (option_clear_or_none(dst->chroot_directory)) { + free(dst->chroot_directory); + dst->chroot_directory = NULL; + } + + /* Subsystems require merging. */ + servconf_merge_subsystems(dst, src); +} #define SERVCONF_MAX_DEPTH 16 static void @@ -3306,7 +4178,7 @@ dump_config(ServerOptions *o) dump_cfg_fmtint(sPermitUserRC, o->permit_user_rc); dump_cfg_fmtint(sStrictModes, o->strict_modes); dump_cfg_fmtint(sTCPKeepAlive, o->tcp_keep_alive); - dump_cfg_fmtint(sEmptyPasswd, o->permit_empty_passwd); + dump_cfg_fmtint(sPermitEmptyPasswords, o->permit_empty_passwd); dump_cfg_fmtint(sCompression, o->compression); dump_cfg_fmtint(sGatewayPorts, o->fwd_opts.gateway_ports); dump_cfg_fmtint(sUseDNS, o->use_dns); @@ -3353,15 +4225,14 @@ dump_config(ServerOptions *o) /* string arguments requiring a lookup */ dump_cfg_string(sLogLevel, log_level_name(o->log_level)); - dump_cfg_string(sLogFacility, log_facility_name(o->log_facility)); + dump_cfg_string(sSyslogFacility, log_facility_name(o->log_facility)); /* string array arguments */ dump_cfg_strarray_oneline(sAuthorizedKeysFile, o->num_authkeys_files, o->authorized_keys_files); dump_cfg_strarray_oneline(sRevokedKeys, o->num_revoked_keys_files, o->revoked_keys_files); - dump_cfg_strarray(sHostKeyFile, o->num_host_key_files, - o->host_key_files); + dump_cfg_strarray(sHostKey, o->num_host_key_files, o->host_key_files); dump_cfg_strarray(sHostCertificate, o->num_host_cert_files, o->host_cert_files); dump_cfg_strarray(sAllowUsers, o->num_allow_users, o->allow_users); diff --git a/servconf.h b/servconf.h index b06db09e1090..a78450343eb3 100644 --- a/servconf.h +++ b/servconf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: servconf.h,v 1.176 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: servconf.h,v 1.177 2026/05/31 11:30:50 djm Exp $ */ /* * Author: Tatu Ylonen @@ -18,6 +18,8 @@ #include +struct sshbuf; + #define MAX_PORTS 256 /* Max # ports. */ /* permit_root_login */ @@ -46,6 +48,15 @@ #define PUBKEYAUTH_TOUCH_REQUIRED (1) #define PUBKEYAUTH_VERIFY_REQUIRED (1<<1) +/* Various defaults */ +#define SSHD_DEFAULT_LOGIN_GRACE_TIME 120 +#define SSHD_DEFAULT_X11_DISPLAY_OFFSET 10 +#ifdef WITH_ZLIB +#define SSHD_DEFAULT_COMPRESSION COMP_DELAYED +#else +#define SSHD_DEFAULT_COMPRESSION COMP_NONE +#endif + struct ssh; /* @@ -83,179 +94,306 @@ struct per_source_penalty { double penalty_min; }; -typedef struct { +/* Options for whether config entries are copied after Match processing */ +#define SSHCFG_COPY_NONE(action) +#define SSHCFG_COPY_MATCH(action) action +#define SSHCFG_COPY_MANUAL(action) + +/* + * This macro is used to generate most of ServerOptions and some of the + * parsing and de/serialisation code in servconf.c. Every variable in + * ServerOptions *must* be represented here. + * + * Variables and configuration options that need special handling (e.g. + * those that represent a struct or use a single option to populate multiple + * values) use the SSHCONF_CUSTOM macro and get manual variable entries in + * ServerOptions below. + * + * Variables that exist in ServerOptions but aren't populated by a keyword + * use the SSHCONF_NONCONF macro and also get manual entries in ServerOptions. + * + * Everything else uses one of the SSHCONF_INT, SSHCONF_INTFLAG, + * SSHCONF_STRING, or SSHCONF_STRARRAY macros. These automatically populate + * their corresponding variable definitions in ServerOptions. The integer + * options also include defaults for initialisation. + * + * Unsupported, deprecated and ignored options use SSHCONF_NOSUPPORT and + * don't populate ServerOptions. Deprecated aliases that still work use + * SSHCONF_ALIAS. + * + * Why go to all this trouble? It ensures a level of consistency between + * the configuration structure and the parsing code and helps us write + * serialisation/deserialisation functions that we can be pretty sure will + * capture every value in the configuration file. + * + * Entry formats: + * SSHCONF_INT(field, keyword, scope, multistate, default, copy) + * SSHCONF_INTFLAG(field, keyword, scope, default, copy) + * SSHCONF_STRING(field, keyword, scope, copy) + * SSHCONF_STRARRAY(field, nfield, keyword, scope, copy) + * SSHCONF_CUSTOM(keyword, suffix, scope, copy) + * SSHCONF_NONCONF(suffix) + * SSHCONF_NOSUPPORT(field, keyword, token, scope) + * SSHCONF_ALIAS(old_keyword, keyword, scope) + */ +#define SSHD_CONFIG_ENTRIES_CUSTOM \ +SSHCONF_CUSTOM(Port, port, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_CUSTOM(ListenAddress, listenaddress, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_CUSTOM(HostKey, hostkeyfile, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_CUSTOM(IPQoS, ipqos, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_CUSTOM(GatewayPorts, gatewayports, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_CUSTOM(StreamLocalBindMask, streamlocalbindmask, SSHCFG_ALL, SSHCFG_COPY_MANUAL) \ +SSHCONF_CUSTOM(StreamLocalBindUnlink, streamlocalbindunlink, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_CUSTOM(SyslogFacility, logfacility, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_CUSTOM(LogLevel, loglevel, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_CUSTOM(PermitUserEnvironment, permituserenv, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_CUSTOM(Subsystem, subsystem, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_CUSTOM(MaxStartups, maxstartups, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_CUSTOM(PerSourceNetBlockSize, persourcenetblocksize, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_CUSTOM(PerSourcePenalties, persourcepenalties, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_CUSTOM(RekeyLimit, rekeylimit, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_NONCONF(timingsecret) + +#define SSHD_CONFIG_ENTRIES_MAIN \ +SSHCONF_INT(address_family, AddressFamily, SSHCFG_GLOBAL, multistate_addressfamily, AF_UNSPEC, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(routing_domain, RDomain, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(host_cert_files, num_host_cert_files, HostCertificate, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(host_key_agent, HostKeyAgent, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(pid_file, PidFile, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(moduli_file, ModuliFile, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_INT(login_grace_time, LoginGraceTime, SSHCFG_GLOBAL, NULL, SSHD_DEFAULT_LOGIN_GRACE_TIME, SSHCFG_COPY_NONE) \ +SSHCONF_INT(permit_root_login, PermitRootLogin, SSHCFG_ALL, multistate_permitrootlogin, PERMIT_NO_PASSWD, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(ignore_rhosts, IgnoreRhosts, SSHCFG_ALL, multistate_ignore_rhosts, 1, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(ignore_user_known_hosts, IgnoreUserKnownHosts, SSHCFG_GLOBAL, 0, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(print_motd, PrintMotd, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(x11_forwarding, X11Forwarding, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(x11_display_offset, X11DisplayOffset, SSHCFG_ALL, NULL, SSHD_DEFAULT_X11_DISPLAY_OFFSET, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(x11_use_localhost, X11UseLocalhost, SSHCFG_ALL, 1, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(xauth_location, XAuthLocation, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(permit_tty, PermitTTY, SSHCFG_ALL, 1, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(permit_user_rc, PermitUserRC, SSHCFG_ALL, 1, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(strict_modes, StrictModes, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(tcp_keep_alive, TCPKeepAlive, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(ciphers, Ciphers, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(macs, Macs, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(kex_algorithms, KexAlgorithms, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRARRAY(log_verbose, num_log_verbose, LogVerbose, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(hostbased_authentication, HostbasedAuthentication, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(hostbased_uses_name_from_packet_only, HostbasedUsesNameFromPacketOnly, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(hostbased_accepted_algos, HostbasedAcceptedAlgorithms, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(hostkeyalgorithms, HostKeyAlgorithms, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(ca_sign_algorithms, CASignatureAlgorithms, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(pubkey_auth_options, PubkeyAuthOptions, SSHCFG_ALL, NULL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(pubkey_authentication, PubkeyAuthentication, SSHCFG_ALL, 1, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(pubkey_accepted_algos, PubkeyAcceptedAlgorithms, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(password_authentication, PasswordAuthentication, SSHCFG_ALL, 1, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(kbd_interactive_authentication, KbdInteractiveAuthentication, SSHCFG_ALL, 1, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(permit_empty_passwd, PermitEmptyPasswords, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(compression, Compression, SSHCFG_GLOBAL, multistate_compression, SSHD_DEFAULT_COMPRESSION, SSHCFG_COPY_NONE) \ +SSHCONF_INT(allow_tcp_forwarding, AllowTcpForwarding, SSHCFG_ALL, multistate_tcpfwd, FORWARD_ALLOW, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(allow_streamlocal_forwarding, AllowStreamLocalForwarding, SSHCFG_ALL, multistate_tcpfwd, FORWARD_ALLOW, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(allow_agent_forwarding, AllowAgentForwarding, SSHCFG_ALL, 1, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(disable_forwarding, DisableForwarding, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(allow_users, num_allow_users, AllowUsers, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(deny_users, num_deny_users, DenyUsers, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(allow_groups, num_allow_groups, AllowGroups, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(deny_groups, num_deny_groups, DenyGroups, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(accept_env, num_accept_env, AcceptEnv, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(setenv, num_setenv, SetEnv, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(per_source_max_startups, PerSourceMaxStartups, SSHCFG_GLOBAL, NULL, INT_MAX, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(per_source_penalty_exempt, PerSourcePenaltyExemptList, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_INT(max_authtries, MaxAuthTries, SSHCFG_ALL, NULL, DEFAULT_AUTH_FAIL_MAX, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(max_sessions, MaxSessions, SSHCFG_ALL, NULL, DEFAULT_SESSIONS_MAX, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(banner, Banner, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(use_dns, UseDNS, SSHCFG_GLOBAL, 0, SSHCFG_COPY_NONE) \ +SSHCONF_INT(client_alive_interval, ClientAliveInterval, SSHCFG_ALL, NULL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(client_alive_count_max, ClientAliveCountMax, SSHCFG_ALL, NULL, 3, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(authorized_keys_files, num_authkeys_files, AuthorizedKeysFile, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(adm_forced_command, ForceCommand, SSHCFG_ALL, SSHCFG_COPY_MANUAL) \ +SSHCONF_INTFLAG(permit_tun, PermitTunnel, SSHCFG_ALL, SSH_TUNMODE_NO, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(permitted_opens, num_permitted_opens, PermitOpen, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(permitted_listens, num_permitted_listens, PermitListen, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(chroot_directory, ChrootDirectory, SSHCFG_ALL, SSHCFG_COPY_MANUAL) \ +SSHCONF_STRARRAY(revoked_keys_files, num_revoked_keys_files, RevokedKeys, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(trusted_user_ca_keys, TrustedUserCAKeys, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(authorized_keys_command, AuthorizedKeysCommand, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(authorized_keys_command_user, AuthorizedKeysCommandUser, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(authorized_principals_file, AuthorizedPrincipalsFile, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(authorized_principals_command, AuthorizedPrincipalsCommand, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(authorized_principals_command_user, AuthorizedPrincipalsCommandUser, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(version_addendum, VersionAddendum, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRARRAY(auth_methods, num_auth_methods, AuthenticationMethods, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(fingerprint_hash, FingerprintHash, SSHCFG_GLOBAL, NULL, SSH_FP_HASH_DEFAULT, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(expose_userauth_info, ExposeAuthInfo, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(sk_provider, SecurityKeyProvider, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_INT(required_rsa_size, RequiredRSASize, SSHCFG_ALL, NULL, SSH_RSA_MINIMUM_MODULUS_SIZE, SSHCFG_COPY_MATCH) \ +SSHCONF_STRARRAY(channel_timeouts, num_channel_timeouts, ChannelTimeout, SSHCFG_ALL, SSHCFG_COPY_MATCH) \ +SSHCONF_INT(unused_connection_timeout, UnusedConnectionTimeout, SSHCFG_ALL, NULL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_STRING(sshd_session_path, SshdSessionPath, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(sshd_auth_path, SshdAuthPath, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(refuse_connection, RefuseConnection, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) + +#define SSHD_CONFIG_ENTRIES_LEGACY \ +SSHCONF_NOSUPPORT(server_key_bits, ServerKeyBits, SSHCONF_DEPRECATED, SSHCFG_GLOBAL) \ +SSHCONF_NOSUPPORT(key_regeneration_interval, KeyRegenerationInterval, SSHCONF_DEPRECATED, SSHCFG_GLOBAL) \ +SSHCONF_NOSUPPORT(rhosts_authentication, RHostsAuthentication, SSHCONF_DEPRECATED, SSHCFG_GLOBAL) \ +SSHCONF_NOSUPPORT(rhosts_rsa_authentication, RhostsRSAAuthentication, SSHCONF_DEPRECATED, SSHCFG_ALL) \ +SSHCONF_NOSUPPORT(rsa_authentication, RSAAuthentication, SSHCONF_DEPRECATED, SSHCFG_ALL) \ +SSHCONF_NOSUPPORT(check_mail, CheckMail, SSHCONF_DEPRECATED, SSHCFG_GLOBAL) \ +SSHCONF_NOSUPPORT(use_login, UseLogin, SSHCONF_DEPRECATED, SSHCFG_GLOBAL) \ +SSHCONF_NOSUPPORT(verify_reverse_mapping, VerifyReverseMapping, SSHCONF_DEPRECATED, SSHCFG_GLOBAL) \ +SSHCONF_NOSUPPORT(reverse_mapping_check, ReverseMappingCheck, SSHCONF_DEPRECATED, SSHCFG_GLOBAL) \ +SSHCONF_NOSUPPORT(authorized_keys_file2, AuthorizedKeysFile2, SSHCONF_DEPRECATED, SSHCFG_ALL) \ +SSHCONF_NOSUPPORT(use_privilege_separation, UsePrivilegeSeparation, SSHCONF_DEPRECATED, SSHCFG_GLOBAL) \ +SSHCONF_NOSUPPORT(protocol, Protocol, SSHCONF_IGNORE, SSHCFG_GLOBAL) + +#define SSHD_CONFIG_ENTRIES_ALIASES \ +SSHCONF_ALIAS(HostDSAKey, HostKey, SSHCFG_GLOBAL) \ +SSHCONF_ALIAS(HostBasedAcceptedKeyTypes, HostbasedAcceptedAlgorithms, SSHCFG_ALL) \ +SSHCONF_ALIAS(PubkeyAcceptedKeyTypes, PubkeyAcceptedAlgorithms, SSHCFG_ALL) \ +SSHCONF_ALIAS(DSAAuthentication, PubkeyAuthentication, SSHCFG_GLOBAL) \ +SSHCONF_ALIAS(ChallengeResponseAuthentication, KbdInteractiveAuthentication, SSHCFG_ALL) \ +SSHCONF_ALIAS(SKeyAuthentication, KbdInteractiveAuthentication, SSHCFG_ALL) \ +SSHCONF_ALIAS(KeepAlive, TCPKeepAlive, SSHCFG_GLOBAL) + +#define SSHD_CONFIG_ENTRIES_BASE \ + SSHD_CONFIG_ENTRIES_CUSTOM \ + SSHD_CONFIG_ENTRIES_MAIN \ + SSHD_CONFIG_ENTRIES_LEGACY \ + SSHD_CONFIG_ENTRIES_ALIASES \ + SSHD_CONFIG_ENTRIES_LASTLOG + +#ifdef DISABLE_LASTLOG +#define SSHD_CONFIG_ENTRIES_LASTLOG \ +SSHCONF_NOSUPPORT(print_lastlog, PrintLastLog, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) +#else +#define SSHD_CONFIG_ENTRIES_LASTLOG \ +SSHCONF_INTFLAG(print_lastlog, PrintLastLog, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) +#endif + +/* Compile-time enabled options */ +#ifdef KRB5 + +#ifdef USE_AFS +#define SSHD_CONFIG_KRB5_AFS \ +SSHCONF_INTFLAG(kerberos_get_afs_token, KerberosGetAFSToken, SSHCFG_GLOBAL, 0, SSHCFG_COPY_NONE) +#else /* USE_AFS */ +#define SSHD_CONFIG_KRB5_AFS \ +SSHCONF_NOSUPPORT(kerberos_get_afs_token, KerberosGetAFSToken, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) +#endif /* USE_AFS */ + +#define SSHD_CONFIG_ENTRIES_KRB5 \ +SSHCONF_INTFLAG(kerberos_authentication, KerberosAuthentication, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(kerberos_or_local_passwd, KerberosOrLocalPasswd, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(kerberos_ticket_cleanup, KerberosTicketCleanup, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHD_CONFIG_KRB5_AFS +#else /* KRB5 */ +#define SSHD_CONFIG_ENTRIES_KRB5 \ +SSHCONF_NOSUPPORT(kerberos_authentication, KerberosAuthentication, SSHCONF_UNSUPPORTED, SSHCFG_ALL) \ +SSHCONF_NOSUPPORT(kerberos_or_local_passwd, KerberosOrLocalPasswd, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) \ +SSHCONF_NOSUPPORT(kerberos_ticket_cleanup, KerberosTicketCleanup, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) \ +SSHCONF_NOSUPPORT(kerberos_get_afs_token, KerberosGetAFSToken, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) \ +SSHCONF_NOSUPPORT(kerberos_tgt_passing, KerberosTgtPassing, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) \ +SSHCONF_NOSUPPORT(afs_token_passing, AFSTokenPassing, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) +#endif /* KRB5 */ + +#ifdef GSSAPI +#define SSHD_CONFIG_ENTRIES_GSS \ +SSHCONF_INTFLAG(gss_authentication, GssAuthentication, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(gss_cleanup_creds, GssCleanupCreds, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(gss_deleg_creds, GssDelegateCreds, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(gss_strict_acceptor, GssStrictAcceptor, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) +#else /* GSSAPI */ +#define SSHD_CONFIG_ENTRIES_GSS \ +SSHCONF_NOSUPPORT(gss_authentication, GssAuthentication, SSHCONF_UNSUPPORTED, SSHCFG_ALL) \ +SSHCONF_NOSUPPORT(gss_cleanup_creds, GssCleanupCreds, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) \ +SSHCONF_NOSUPPORT(gss_deleg_creds, GssDelegateCreds, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) \ +SSHCONF_NOSUPPORT(gss_strict_acceptor, GssStrictAcceptor, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) +#endif /* GSSAPI */ + +#define SSHD_CONFIG_ENTRIES \ + SSHD_CONFIG_ENTRIES_BASE \ + SSHD_CONFIG_ENTRIES_KRB5 \ + SSHD_CONFIG_ENTRIES_GSS \ + +/* Macros to declare ServerOptions member variables */ +#define SSHCONF_INT(var, conf, flags, ms, def, cp) int var; +#define SSHCONF_INTFLAG(var, conf, flags, def, cp) int var; +#define SSHCONF_STRING(var, conf, flags, cp) char *var; +#define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) \ + char **var; \ + u_int nvar; +#define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) /* empty */ +#define SSHCONF_NONCONF(funcsuffix) /* empty */ +#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) /* empty */ +#define SSHCONF_ALIAS(old, conf, flags) /* empty */ + +typedef struct ServerOptions { + SSHD_CONFIG_ENTRIES + /* Ports */ u_int num_ports; u_int ports_from_cmdline; int ports[MAX_PORTS]; /* Port number to listen on. */ + /* ListenAddress */ struct queued_listenaddr *queued_listen_addrs; u_int num_queued_listens; struct listenaddr *listen_addrs; u_int num_listen_addrs; - int address_family; /* Address family used by the server. */ - - char *routing_domain; /* Bind session to routing domain */ - + /* HostKey */ char **host_key_files; /* Files containing host keys. */ int *host_key_file_userprovided; /* Key was specified by user. */ u_int num_host_key_files; /* Number of files for host keys. */ - char **host_cert_files; /* Files containing host certs. */ - u_int num_host_cert_files; /* Number of files for host certs. */ - - char *host_key_agent; /* ssh-agent socket for host keys. */ - char *pid_file; /* Where to put our pid */ - char *moduli_file; /* moduli file for DH-GEX */ - int login_grace_time; /* Disconnect if no auth in this time - * (sec). */ - int permit_root_login; /* PERMIT_*, see above */ - int ignore_rhosts; /* Ignore .rhosts and .shosts. */ - int ignore_user_known_hosts; /* Ignore ~/.ssh/known_hosts - * for RhostsRsaAuth */ - int print_motd; /* If true, print /etc/motd. */ - int print_lastlog; /* If true, print lastlog */ - int x11_forwarding; /* If true, permit inet (spoofing) X11 fwd. */ - int x11_display_offset; /* What DISPLAY number to start - * searching at */ - int x11_use_localhost; /* If true, use localhost for fake X11 server. */ - char *xauth_location; /* Location of xauth program */ - int permit_tty; /* If false, deny pty allocation */ - int permit_user_rc; /* If false, deny ~/.ssh/rc execution */ - int strict_modes; /* If true, require string home dir modes. */ - int tcp_keep_alive; /* If true, set SO_KEEPALIVE. */ + /* IPQoS */ int ip_qos_interactive; /* IP ToS/DSCP/class for interactive */ int ip_qos_bulk; /* IP ToS/DSCP/class for bulk traffic */ - char *ciphers; /* Supported SSH2 ciphers. */ - char *macs; /* Supported SSH2 macs. */ - char *kex_algorithms; /* SSH2 kex methods in order of preference. */ + /* GatewayPorts, StreamLocalBindMask, StreamLocalBindUnlink */ struct ForwardOptions fwd_opts; /* forwarding options */ + /* LogFacility */ SyslogFacility log_facility; /* Facility for system logging. */ + /* LogLevel */ LogLevel log_level; /* Level for system logging. */ - u_int num_log_verbose; /* Verbose log overrides */ - char **log_verbose; - int hostbased_authentication; /* If true, permit ssh2 hostbased auth */ - int hostbased_uses_name_from_packet_only; /* experimental */ - char *hostbased_accepted_algos; /* Algos allowed for hostbased */ - char *hostkeyalgorithms; /* SSH2 server key types */ - char *ca_sign_algorithms; /* Allowed CA signature algorithms */ - int pubkey_authentication; /* If true, permit ssh2 pubkey authentication. */ - char *pubkey_accepted_algos; /* Signature algos allowed for pubkey */ - int pubkey_auth_options; /* -1 or mask of PUBKEYAUTH_* flags */ - int kerberos_authentication; /* If true, permit Kerberos - * authentication. */ - int kerberos_or_local_passwd; /* If true, permit kerberos - * and any other password - * authentication mechanism, - * such as SecurID or - * /etc/passwd */ - int kerberos_ticket_cleanup; /* If true, destroy ticket - * file on logout. */ - int kerberos_get_afs_token; /* If true, try to get AFS token if - * authenticated with Kerberos. */ - int gss_authentication; /* If true, permit GSSAPI authentication */ - int gss_cleanup_creds; /* If true, destroy cred cache on logout */ - int gss_deleg_creds; /* If true, accept delegated GSS credentials */ - int gss_strict_acceptor; /* If true, restrict the GSSAPI acceptor name */ - int password_authentication; /* If true, permit password - * authentication. */ - int kbd_interactive_authentication; /* If true, permit */ - int permit_empty_passwd; /* If false, do not permit empty - * passwords. */ + /* PermitUserEnvironment */ int permit_user_env; /* If true, read ~/.ssh/environment */ char *permit_user_env_allowlist; /* pattern-list of allowed env names */ - int compression; /* If true, compression is allowed */ - int allow_tcp_forwarding; /* One of FORWARD_* */ - int allow_streamlocal_forwarding; /* One of FORWARD_* */ - int allow_agent_forwarding; - int disable_forwarding; - u_int num_allow_users; - char **allow_users; - u_int num_deny_users; - char **deny_users; - u_int num_allow_groups; - char **allow_groups; - u_int num_deny_groups; - char **deny_groups; - + /* Subsystem */ u_int num_subsystems; char **subsystem_name; char **subsystem_command; char **subsystem_args; - - u_int num_accept_env; - char **accept_env; - u_int num_setenv; - char **setenv; - + /* MaxStartups */ int max_startups_begin; int max_startups_rate; int max_startups; - int per_source_max_startups; + /* PerSourceNetBlockSize */ int per_source_masklen_ipv4; int per_source_masklen_ipv6; - char *per_source_penalty_exempt; + /* PerSourcePenalties */ struct per_source_penalty per_source_penalty; - int max_authtries; - int max_sessions; - char *banner; /* SSH-2 banner message */ - int use_dns; - int client_alive_interval; /* - * poke the client this often to - * see if it's still there - */ - int client_alive_count_max; /* - * If the client is unresponsive - * for this many intervals above, - * disconnect the session - */ - - u_int num_authkeys_files; /* Files containing public keys */ - char **authorized_keys_files; - - char *adm_forced_command; - - int use_pam; /* Enable auth via PAM */ - char *pam_service_name; - - int permit_tun; - - char **permitted_opens; /* May also be one of PERMITOPEN_* */ - u_int num_permitted_opens; - char **permitted_listens; /* May also be one of PERMITOPEN_* */ - u_int num_permitted_listens; - - char *chroot_directory; - uint num_revoked_keys_files; - char **revoked_keys_files; - char *trusted_user_ca_keys; - char *authorized_keys_command; - char *authorized_keys_command_user; - char *authorized_principals_file; - char *authorized_principals_command; - char *authorized_principals_command_user; - + /* RekeyLimit */ int64_t rekey_limit; int rekey_interval; - - char *version_addendum; /* Appended to SSH banner */ - - u_int num_auth_methods; - char **auth_methods; - - int fingerprint_hash; - int expose_userauth_info; + /* Passed by config but not keyword for this */ uint64_t timing_secret; - char *sk_provider; - int required_rsa_size; /* minimum size of RSA keys */ - - char **channel_timeouts; /* inactivity timeout by channel type */ - u_int num_channel_timeouts; - - int unused_connection_timeout; - - char *sshd_session_path; - char *sshd_auth_path; - - int refuse_connection; + /* Placeholders for compile-time disabled things */ + /* XXX djm redo macros to remove these */ +#ifndef WITH_PAM + int use_pam; +#endif +#ifdef DISABLE_LASTLOG + int print_lastlog; +#endif +#ifndef KRB5 + int kerberos_authentication; +#endif } ServerOptions; +#undef SSHCONF_INT +#undef SSHCONF_INTFLAG +#undef SSHCONF_STRING +#undef SSHCONF_STRARRAY +#undef SSHCONF_CUSTOM +#undef SSHCONF_NONCONF +#undef SSHCONF_NOSUPPORT +#undef SSHCONF_ALIAS /* Information about the incoming connection as used by Match */ struct connection_info { @@ -280,49 +418,6 @@ struct include_item { TAILQ_HEAD(include_list, include_item); -/* - * These are string config options that must be copied between the - * Match sub-config and the main config, and must be sent from the - * privsep child to the privsep master. We use a macro to ensure all - * the options are copied and the copies are done in the correct order. - * - * NB. an option must appear in servconf.c:copy_set_server_options() or - * COPY_MATCH_STRING_OPTS here but never both. - */ -#define COPY_MATCH_STRING_OPTS() do { \ - M_CP_STROPT(banner); \ - M_CP_STROPT(trusted_user_ca_keys); \ - M_CP_STROPT(authorized_keys_command); \ - M_CP_STROPT(authorized_keys_command_user); \ - M_CP_STROPT(authorized_principals_file); \ - M_CP_STROPT(authorized_principals_command); \ - M_CP_STROPT(authorized_principals_command_user); \ - M_CP_STROPT(hostbased_accepted_algos); \ - M_CP_STROPT(pubkey_accepted_algos); \ - M_CP_STROPT(ca_sign_algorithms); \ - M_CP_STROPT(routing_domain); \ - M_CP_STROPT(permit_user_env_allowlist); \ - M_CP_STROPT(pam_service_name); \ - M_CP_STRARRAYOPT(authorized_keys_files, num_authkeys_files, 1);\ - M_CP_STRARRAYOPT(revoked_keys_files, \ - num_revoked_keys_files, 1); \ - M_CP_STRARRAYOPT(allow_users, num_allow_users, 1); \ - M_CP_STRARRAYOPT(deny_users, num_deny_users, 1); \ - M_CP_STRARRAYOPT(allow_groups, num_allow_groups, 1); \ - M_CP_STRARRAYOPT(deny_groups, num_deny_groups, 1); \ - M_CP_STRARRAYOPT(accept_env, num_accept_env, 1); \ - M_CP_STRARRAYOPT(setenv, num_setenv, 1); \ - M_CP_STRARRAYOPT(auth_methods, num_auth_methods, 1); \ - M_CP_STRARRAYOPT(permitted_opens, num_permitted_opens, 1); \ - M_CP_STRARRAYOPT(permitted_listens, num_permitted_listens, 1); \ - M_CP_STRARRAYOPT(channel_timeouts, num_channel_timeouts, 1); \ - M_CP_STRARRAYOPT(log_verbose, num_log_verbose, 1); \ - /* Note: don't clobber num_subsystems until all copied */ \ - M_CP_STRARRAYOPT(subsystem_name, num_subsystems, 0); \ - M_CP_STRARRAYOPT(subsystem_command, num_subsystems, 0); \ - M_CP_STRARRAYOPT(subsystem_args, num_subsystems, 1); \ - } while (0) - void initialize_server_options(ServerOptions *); void fill_default_server_options(ServerOptions *); int process_server_config_line(ServerOptions *, char *, const char *, int, @@ -342,4 +437,8 @@ void servconf_add_hostkey(const char *, const int, void servconf_add_hostcert(const char *, const int, ServerOptions *, const char *path); +int serialise_server_options(const ServerOptions *, struct sshbuf **); +int deserialise_server_options(struct sshbuf *, ServerOptions *); +void free_server_options(ServerOptions *); + #endif /* SERVCONF_H */ diff --git a/sshd-auth.c b/sshd-auth.c index 76350a2a3501..ad02aa48cdd4 100644 --- a/sshd-auth.c +++ b/sshd-auth.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd-auth.c,v 1.14 2026/03/11 09:10:59 dtucker Exp $ */ +/* $OpenBSD: sshd-auth.c,v 1.15 2026/05/31 11:30:50 djm Exp $ */ /* * SSH2 implementation: * Privilege Separation: @@ -412,14 +412,13 @@ parse_hostkeys(struct sshbuf *hostkeys) } static void -recv_privsep_state(struct ssh *ssh, struct sshbuf *conf, - uint64_t *timing_secretp) +recv_privsep_state(struct ssh *ssh, ServerOptions *o, uint64_t *timing_secretp) { struct sshbuf *hostkeys; debug3_f("begin"); - mm_get_state(ssh, &includes, conf, NULL, timing_secretp, + mm_get_state(ssh, o, NULL, timing_secretp, &hostkeys, NULL, NULL, NULL, NULL); parse_hostkeys(hostkeys); @@ -439,11 +438,9 @@ main(int ac, char **av) extern int optind; int r, opt, have_key = 0; int sock_in = -1, sock_out = -1, rexeced_flag = 0; - char *line; u_int i; mode_t new_umask; Authctxt *authctxt; - struct connection_info *connection_info = NULL; sigset_t sigmask; uint64_t timing_secret = 0; @@ -482,17 +479,16 @@ main(int ac, char **av) "C:E:b:c:f:g:h:k:o:p:u:46DGQRTdeiqrtV")) != -1) { switch (opt) { case '4': - options.address_family = AF_INET; + /* ignore */ break; case '6': - options.address_family = AF_INET6; + /* ignore */ break; case 'f': - config_file_name = optarg; + /* ignore */ break; case 'c': - servconf_add_hostcert("[command-line]", 0, - &options, optarg); + /* ignore */ break; case 'd': if (debug_flag == 0) { @@ -519,46 +515,28 @@ main(int ac, char **av) /* ignored */ break; case 'q': - options.log_level = SYSLOG_LEVEL_QUIET; + /* ignored */ break; case 'b': /* protocol 1, ignored */ break; case 'p': - options.ports_from_cmdline = 1; - if (options.num_ports >= MAX_PORTS) { - fprintf(stderr, "too many ports.\n"); - exit(1); - } - options.ports[options.num_ports++] = a2port(optarg); - if (options.ports[options.num_ports-1] <= 0) { - fprintf(stderr, "Bad port number.\n"); - exit(1); - } + /* ignored */ break; case 'g': - if ((options.login_grace_time = convtime(optarg)) == -1) { - fprintf(stderr, "Invalid login grace time.\n"); - exit(1); - } + /* ignored */ break; case 'k': /* protocol 1, ignored */ break; case 'h': - servconf_add_hostkey("[command-line]", 0, - &options, optarg, 1); + /* ignored */ break; case 't': case 'T': case 'G': - fatal("test/dump modes not supported"); - break; case 'C': - connection_info = server_get_connection_info(ssh, 0, 0); - if (parse_server_match_testspec(connection_info, - optarg) == -1) - exit(1); + fatal("test/dump modes not supported"); break; case 'u': utmp_len = (u_int)strtonum(optarg, 0, HOST_NAME_MAX+1+1, NULL); @@ -568,11 +546,7 @@ main(int ac, char **av) } break; case 'o': - line = xstrdup(optarg); - if (process_server_config_line(&options, line, - "command-line", 0, NULL, NULL, &includes) != 0) - exit(1); - free(line); + /* ignored */ break; case 'V': fprintf(stderr, "%s, %s\n", @@ -637,10 +611,7 @@ main(int ac, char **av) if ((cfg = sshbuf_new()) == NULL) fatal("sshbuf_new config buf failed"); setproctitle("%s", "[session-auth early]"); - recv_privsep_state(ssh, cfg, &timing_secret); - parse_server_config(&options, "rexec", cfg, &includes, NULL, 1); - /* Fill in default values for those options not explicitly set. */ - fill_default_server_options(&options); + recv_privsep_state(ssh, &options, &timing_secret); options.timing_secret = timing_secret; /* XXX eliminate from unpriv */ ssh_packet_set_qos(ssh, options.ip_qos_interactive, options.ip_qos_bulk); From 633a4c1a24605e48c46fe76afc0814d20593fc00 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 31 May 2026 04:20:58 +0000 Subject: [PATCH 075/196] upstream: flesh out match_pattern() tests, including a new comparison test of the new NFA-based implementation against the original one for all possible combinations of short inputs and patterns constructed from a small dictionary of possibilities. OpenBSD-Regress-ID: a18e86c95afb6243ac270468f5dd0ab4a78c8074 --- regress/unittests/match/tests.c | 202 +++++++++++++++++++++++++++++++- 1 file changed, 200 insertions(+), 2 deletions(-) diff --git a/regress/unittests/match/tests.c b/regress/unittests/match/tests.c index 163a3a25569d..58d4ee7c8704 100644 --- a/regress/unittests/match/tests.c +++ b/regress/unittests/match/tests.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tests.c,v 1.9 2025/04/15 04:00:42 djm Exp $ */ +/* $OpenBSD: tests.c,v 1.10 2026/05/31 04:20:58 djm Exp $ */ /* * Regress test for matching functions * @@ -17,6 +17,142 @@ #include "match.h" +/* Original match_pattern() implementation; has bad worst-case behaviour */ +static int +match_pattern_original(const char *s, const char *pattern) +{ + for (;;) { + /* If at end of pattern, accept if also at end of string. */ + if (!*pattern) + return !*s; + + if (*pattern == '*') { + /* Skip this and any consecutive asterisks. */ + while (*pattern == '*') + pattern++; + + /* If at end of pattern, accept immediately. */ + if (!*pattern) + return 1; + + /* If next character in pattern is known, optimize. */ + if (*pattern != '?' && *pattern != '*') { + /* + * Look instances of the next character in + * pattern, and try to match starting from + * those. + */ + for (; *s; s++) + if (*s == *pattern && + match_pattern_original(s + 1, + pattern + 1)) + return 1; + /* Failed. */ + return 0; + } + /* + * Move ahead one character at a time and try to + * match at each position. + */ + for (; *s; s++) + if (match_pattern_original(s, pattern)) + return 1; + /* Failed. */ + return 0; + } + /* + * There must be at least one more character in the string. + * If we are at the end, fail. + */ + if (!*s) + return 0; + + /* Check if the next character of the string is acceptable. */ + if (*pattern != '?' && *pattern != *s) + return 0; + + /* Move to the next character, both in string and in pattern. */ + s++; + pattern++; + } + /* NOTREACHED */ +} + +/* n^x for size_t */ +static size_t +pow_size(size_t base, size_t exp) +{ + size_t r = 1; + + ASSERT_SIZE_T_NE(base, 0); + while (exp-- != 0) { + ASSERT_SIZE_T_LE(r, SIZE_MAX / base); + r *= base; + } + return r; +} + +static void +make_word(size_t v, const char *alphabet, size_t alphabet_len, + char *word, size_t wordlen) +{ + size_t i; + + for (i = 0; i < wordlen; i++) { + word[i] = alphabet[v % alphabet_len]; + v /= alphabet_len; + } + word[wordlen] = '\0'; +} + +#define PATTERN_LEN 8 +#define INPUT_LEN 7 + +static void +match_pattern_check_one_input(const char *input, const char *pattern_alphabet) +{ + char pattern[PATTERN_LEN]; + size_t len, i, npatterns; + int actual, expected; + + for (len = 0; len < sizeof(pattern); len++) { + /* Check with all patterns of this size using alphabet */ + npatterns = pow_size(strlen(pattern_alphabet), len); + for (i = 0; i < npatterns; i++) { + make_word(i, pattern_alphabet, + strlen(pattern_alphabet), pattern, len); + actual = match_pattern(input, pattern); + expected = match_pattern_original(input, pattern); + test_subtest_info("input=\"%s\" pattern=\"%s\"", + input, pattern); + ASSERT_INT_EQ(actual, expected); + } + } +} + +/* + * Check current match_pattern against original one with an exhaustive + * combination of patterns and inputs. + */ +static void +match_pattern_exhaustive_original(void) +{ + const char *pattern_alphabet = "abx?*"; + const char *input_alphabet = "abc"; + char input[INPUT_LEN]; + size_t len, i, ninputs; + + for (len = 0; len < sizeof(input); len++) { + /* Check every possible input from alphabet of this size */ + ninputs = pow_size(strlen(input_alphabet), len); + for (i = 0; i < ninputs; i++) { + make_word(i, input_alphabet, + strlen(input_alphabet), input, len); + match_pattern_check_one_input(input, pattern_alphabet); + } + } +} + void tests(void) { @@ -26,22 +162,84 @@ tests(void) ASSERT_INT_EQ(match_pattern("aaa", ""), 0); ASSERT_INT_EQ(match_pattern("aaa", "aaaa"), 0); ASSERT_INT_EQ(match_pattern("aaaa", "aaa"), 0); + ASSERT_INT_EQ(match_pattern("abc", "abc"), 1); + ASSERT_INT_EQ(match_pattern("abc", "abd"), 0); + ASSERT_INT_EQ(match_pattern("abc", "abcd"), 0); + ASSERT_INT_EQ(match_pattern("abcd", "abc"), 0); TEST_DONE(); TEST_START("match_pattern wildcard"); ASSERT_INT_EQ(match_pattern("", "*"), 1); + ASSERT_INT_EQ(match_pattern("", "**"), 1); + ASSERT_INT_EQ(match_pattern("", "***"), 1); + ASSERT_INT_EQ(match_pattern("", "?"), 0); + ASSERT_INT_EQ(match_pattern("", "*?"), 0); + ASSERT_INT_EQ(match_pattern("", "?*"), 0); + ASSERT_INT_EQ(match_pattern("", "**a*"), 0); ASSERT_INT_EQ(match_pattern("a", "?"), 1); ASSERT_INT_EQ(match_pattern("aa", "a?"), 1); ASSERT_INT_EQ(match_pattern("a", "*"), 1); ASSERT_INT_EQ(match_pattern("aa", "a*"), 1); ASSERT_INT_EQ(match_pattern("aa", "?*"), 1); - ASSERT_INT_EQ(match_pattern("aa", "**"), 1); ASSERT_INT_EQ(match_pattern("aa", "?a"), 1); ASSERT_INT_EQ(match_pattern("aa", "*a"), 1); ASSERT_INT_EQ(match_pattern("ba", "a?"), 0); ASSERT_INT_EQ(match_pattern("ba", "a*"), 0); ASSERT_INT_EQ(match_pattern("ab", "?a"), 0); ASSERT_INT_EQ(match_pattern("ab", "*a"), 0); + ASSERT_INT_EQ(match_pattern("aa", "**"), 1); + ASSERT_INT_EQ(match_pattern("ab", "a***b"), 1); + ASSERT_INT_EQ(match_pattern("axb", "a***b"), 1); + ASSERT_INT_EQ(match_pattern("axxb", "a***b"), 1); + ASSERT_INT_EQ(match_pattern("ax", "a***b"), 0); + ASSERT_INT_EQ(match_pattern("abbb", "a*b*b"), 1); + ASSERT_INT_EQ(match_pattern("abbb", "a*b*c"), 0); + ASSERT_INT_EQ(match_pattern("aaaaaaaaac", "a*a*a*a*b"), 0); + ASSERT_INT_EQ(match_pattern("aaaaaaaaab", "a*a*a*a*b"), 1); + ASSERT_INT_EQ(match_pattern("ab", "*b"), 1); + ASSERT_INT_EQ(match_pattern("ab", "*a*"), 1); + ASSERT_INT_EQ(match_pattern("ab", "*a*b"), 1); + ASSERT_INT_EQ(match_pattern("ab", "*a*c"), 0); + ASSERT_INT_EQ(match_pattern("abc", "a?c"), 1); + ASSERT_INT_EQ(match_pattern("abc", "??c"), 1); + ASSERT_INT_EQ(match_pattern("abc", "???"), 1); + ASSERT_INT_EQ(match_pattern("abc", "a?d"), 0); + ASSERT_INT_EQ(match_pattern("ab", "???"), 0); + ASSERT_INT_EQ(match_pattern("abc", "ab*"), 1); + ASSERT_INT_EQ(match_pattern("ab", "ab*"), 1); + ASSERT_INT_EQ(match_pattern("a", "ab*"), 0); + ASSERT_INT_EQ(match_pattern("abc", "ab?"), 1); + ASSERT_INT_EQ(match_pattern("ab", "ab?"), 0); + ASSERT_INT_EQ(match_pattern("abcd", "ab?"), 0); + ASSERT_INT_EQ(match_pattern("abc", "?bc"), 1); + ASSERT_INT_EQ(match_pattern("abc", "?b*"), 1); + ASSERT_INT_EQ(match_pattern("abc", "?c"), 0); + ASSERT_INT_EQ(match_pattern("abc", "a*?c"), 1); + ASSERT_INT_EQ(match_pattern("ac", "a*?c"), 0); + ASSERT_INT_EQ(match_pattern("abbc", "a*?c"), 1); + ASSERT_INT_EQ(match_pattern("abc", "a?*c"), 1); + ASSERT_INT_EQ(match_pattern("ac", "a?*c"), 0); + ASSERT_INT_EQ(match_pattern("abbc", "a?*c"), 1); + ASSERT_INT_EQ(match_pattern("abc", "a*?*c"), 1); + ASSERT_INT_EQ(match_pattern("ac", "a*?*c"), 0); + ASSERT_INT_EQ(match_pattern("abc", "?*c"), 1); + ASSERT_INT_EQ(match_pattern("ac", "?*c"), 1); + ASSERT_INT_EQ(match_pattern("c", "?*c"), 0); + ASSERT_INT_EQ(match_pattern("abc", "*?c"), 1); + ASSERT_INT_EQ(match_pattern("ac", "*?c"), 1); + ASSERT_INT_EQ(match_pattern("c", "*?c"), 0); + ASSERT_INT_EQ(match_pattern("abc", "a?*"), 1); + ASSERT_INT_EQ(match_pattern("ab", "a?*"), 1); + ASSERT_INT_EQ(match_pattern("a", "a?*"), 0); + ASSERT_INT_EQ(match_pattern("abc", "a*?"), 1); + ASSERT_INT_EQ(match_pattern("ab", "a*?"), 1); + ASSERT_INT_EQ(match_pattern("a", "a*?"), 0); + ASSERT_INT_EQ(match_pattern("abb", "a*b"), 1); + ASSERT_INT_EQ(match_pattern("abbc", "a*b"), 0); + TEST_DONE(); + + TEST_START("match_pattern exhaustive original"); + match_pattern_exhaustive_original(); TEST_DONE(); TEST_START("match_pattern_list"); From f2b815e42d9fd654cb457cd7e7d1cb751f1a5a33 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 31 May 2026 11:31:57 +0000 Subject: [PATCH 076/196] upstream: the new configuration dump code emits configuration directives with capitalisation (previously they were all lowercase), so make the tests that consume them insensitive to case OpenBSD-Regress-ID: 9a81d8501b8b8fc1c1a0d268d4cc91cbb19668f5 --- regress/addrmatch.sh | 4 ++-- regress/cfgmatch.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/regress/addrmatch.sh b/regress/addrmatch.sh index 26e0c9910c47..b743c7d558ef 100644 --- a/regress/addrmatch.sh +++ b/regress/addrmatch.sh @@ -1,4 +1,4 @@ -# $OpenBSD: addrmatch.sh,v 1.6 2020/08/28 03:17:13 dtucker Exp $ +# $OpenBSD: addrmatch.sh,v 1.7 2026/05/31 11:31:57 djm Exp $ # Placed in the Public Domain. tid="address match" @@ -13,7 +13,7 @@ run_trial() verbose "test $descr for $user $addr $host" result=`${SSHD} -f $OBJ/sshd_proxy -T \ -C user=${user},addr=${addr},host=${host},laddr=${laddr},lport=${lport} | \ - awk '/^forcecommand/ {print $2}'` + awk 'tolower($1) ~ /^forcecommand/ {print $2}'` if [ "$result" != "$expected" ]; then fail "failed '$descr' expected $expected got $result" fi diff --git a/regress/cfgmatch.sh b/regress/cfgmatch.sh index d627c37a3fa7..bdd4e7a43e03 100644 --- a/regress/cfgmatch.sh +++ b/regress/cfgmatch.sh @@ -1,4 +1,4 @@ -# $OpenBSD: cfgmatch.sh,v 1.17 2025/12/19 00:57:42 djm Exp $ +# $OpenBSD: cfgmatch.sh,v 1.18 2026/05/31 11:31:57 djm Exp $ # Placed in the Public Domain. tid="sshd_config match" @@ -155,7 +155,7 @@ EOD done trace "test spec $spec" result=`${SUDO} ${SSHD} -f $OBJ/sshd_config -T -C "$spec" | \ - awk '$1=="banner"{print $2}'` + awk 'tolower($1)=="banner"{print $2}'` if [ "$result" != "$expected" ]; then fail "match $config expected $expected got $result" fi From 3bc4ac43943852b214a3d85e3424d9304c8a736d Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 31 May 2026 11:39:44 +0000 Subject: [PATCH 077/196] upstream: unit test for new servconf.[ch] code, including a basic fuzz test for deserialisation OpenBSD-Regress-ID: f182c21485dc37a41a125f067b59bee48adbfe6c --- Makefile.in | 19 ++ regress/Makefile | 1 + regress/unittests/Makefile | 4 +- regress/unittests/servconf/Makefile | 25 ++ regress/unittests/servconf/tests.c | 362 ++++++++++++++++++++++++++++ 5 files changed, 409 insertions(+), 2 deletions(-) create mode 100644 regress/unittests/servconf/Makefile create mode 100644 regress/unittests/servconf/tests.c diff --git a/Makefile.in b/Makefile.in index 2aac879c1eaf..4a676f3258b3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -317,6 +317,8 @@ clean: regressclean rm -f regress/unittests/match/test_match$(EXEEXT) rm -f regress/unittests/misc/*.o rm -f regress/unittests/misc/test_misc$(EXEEXT) + rm -f regress/unittests/servconf/*.o + rm -f regress/unittests/servconf/test_servconf$(EXEEXT) rm -f regress/unittests/sshbuf/*.o rm -f regress/unittests/sshbuf/test_sshbuf$(EXEEXT) rm -f regress/unittests/sshkey/*.o @@ -356,6 +358,8 @@ distclean: regressclean rm -f regress/unittests/match/test_match rm -f regress/unittests/misc/*.o rm -f regress/unittests/misc/test_misc + rm -f regress/unittests/servconf/*.o + rm -f regress/unittests/servconf/test_servconf rm -f regress/unittests/sshbuf/*.o rm -f regress/unittests/sshbuf/test_sshbuf rm -f regress/unittests/sshkey/*.o @@ -539,6 +543,7 @@ regress-prep: $(MKDIR_P) `pwd`/regress/unittests/kex $(MKDIR_P) `pwd`/regress/unittests/match $(MKDIR_P) `pwd`/regress/unittests/misc + $(MKDIR_P) `pwd`/regress/unittests/servconf $(MKDIR_P) `pwd`/regress/unittests/sshbuf $(MKDIR_P) `pwd`/regress/unittests/sshkey $(MKDIR_P) `pwd`/regress/unittests/sshsig @@ -708,6 +713,19 @@ regress/unittests/misc/test_misc$(EXEEXT): \ regress/unittests/test_helper/libtest_helper.a \ -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) +UNITTESTS_TEST_SERVCONF_OBJS=\ + regress/unittests/servconf/tests.o \ + servconf.o \ + groupaccess.o \ + $(P11OBJS) $(SKOBJS) + +regress/unittests/servconf/test_servconf$(EXEEXT): \ + ${UNITTESTS_TEST_SERVCONF_OBJS} \ + regress/unittests/test_helper/libtest_helper.a libssh.a + $(LD) -o $@ $(LDFLAGS) $(UNITTESTS_TEST_SERVCONF_OBJS) \ + regress/unittests/test_helper/libtest_helper.a \ + -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) + UNITTESTS_TEST_UTF8_OBJS=\ regress/unittests/utf8/tests.o @@ -760,6 +778,7 @@ regress-unit-binaries: regress-prep $(REGRESSLIBS) \ regress/unittests/kex/test_kex$(EXEEXT) \ regress/unittests/match/test_match$(EXEEXT) \ regress/unittests/misc/test_misc$(EXEEXT) \ + regress/unittests/servconf/test_servconf$(EXEEXT) \ regress/unittests/sshbuf/test_sshbuf$(EXEEXT) \ regress/unittests/sshkey/test_sshkey$(EXEEXT) \ regress/unittests/sshsig/test_sshsig$(EXEEXT) \ diff --git a/regress/Makefile b/regress/Makefile index ae45bd463fe4..9120f1758ecf 100644 --- a/regress/Makefile +++ b/regress/Makefile @@ -308,6 +308,7 @@ unit unit-bench: -d ${.CURDIR}/unittests/hostkeys/testdata $${ARGS}; \ $$V ${.OBJDIR}/unittests/match/test_match $${ARGS}; \ $$V ${.OBJDIR}/unittests/misc/test_misc $${ARGS}; \ + $$V ${.OBJDIR}/unittests/servconf/test_servconf $${ARGS}; \ if test "x${TEST_SSH_UTF8}" = "xyes" ; then \ $$V ${.OBJDIR}/unittests/utf8/test_utf8 $${ARGS}; \ fi \ diff --git a/regress/unittests/Makefile b/regress/unittests/Makefile index e370900e4de6..8d7a6b1e3d8e 100644 --- a/regress/unittests/Makefile +++ b/regress/unittests/Makefile @@ -1,6 +1,6 @@ -# $OpenBSD: Makefile,v 1.13 2023/09/24 08:14:13 claudio Exp $ +# $OpenBSD: Makefile,v 1.14 2026/05/31 11:39:44 djm Exp $ SUBDIR= test_helper sshbuf sshkey bitmap kex hostkeys utf8 match conversion -SUBDIR+=authopt misc sshsig +SUBDIR+=authopt misc sshsig servconf .include diff --git a/regress/unittests/servconf/Makefile b/regress/unittests/servconf/Makefile new file mode 100644 index 000000000000..277c08e02440 --- /dev/null +++ b/regress/unittests/servconf/Makefile @@ -0,0 +1,25 @@ +# $OpenBSD: Makefile,v 1.1 2026/05/31 11:39:44 djm Exp $ + +PROG=test_servconf +SRCS=tests.c + +SRCS+=servconf.c groupaccess.c + +# From usr.bin/ssh +SRCS+=sshbuf-getput-basic.c sshbuf-getput-crypto.c sshbuf-misc.c sshbuf.c +SRCS+=sshbuf-io.c atomicio.c sshkey.c authfile.c cipher.c log.c ssh-rsa.c +SRCS+=ssh-ecdsa.c ssh-ed25519.c mac.c umac.c umac128.c hmac.c misc.c +SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c +SRCS+=addr.c addrmatch.c bitmap.c +SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c +SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c +SRCS+=utf8.c ssherr-libcrypto.c +SRCS+=kex.c kex-names.c packet.c dispatch.c compat.c canohost.c +SRCS+=digest-openssl.c ed25519-openssl.c + +REGRESS_TARGETS=run-regress-${PROG} + +run-regress-${PROG}: ${PROG} + env ${TEST_ENV} ./${PROG} ${UNITTEST_ARGS} + +.include diff --git a/regress/unittests/servconf/tests.c b/regress/unittests/servconf/tests.c new file mode 100644 index 000000000000..3272d668089c --- /dev/null +++ b/regress/unittests/servconf/tests.c @@ -0,0 +1,362 @@ +/* $OpenBSD: tests.c,v 1.1 2026/05/31 11:39:44 djm Exp $ */ +/* + * Regress tests for servconf.h server configuration API + * + * Placed in the public domain + */ + +#include +#include +#include +#include +#include +#include + +#include "../test_helper/test_helper.h" + +#include "log.h" +#include "misc.h" +#include "servconf.h" +#include "sshbuf.h" +#include "ssherr.h" +#include "xmalloc.h" + +struct sshbuf *cfg; + +/* stub */ +int auth2_methods_valid(const char *methods, int need_enable); +int +auth2_methods_valid(const char *methods, int need_enable) +{ + return 1; +} + +static void +onerror(void *fuzz) +{ + fprintf(stderr, "Failed during fuzz:\n"); + fuzz_dump((struct fuzz *)fuzz); +} + +static void +set_string(char **dst, const char *s) +{ + *dst = s == NULL ? NULL : xstrdup(s); +} + +static char ** +new_string_array(u_int n) +{ + return xcalloc(n, sizeof(char *)); +} + +static void +set_test_options(ServerOptions *o) +{ + initialize_server_options(o); + + o->num_ports = 2; + o->ports[0] = 22; + o->ports[1] = 2022; + o->ip_qos_interactive = 0x10; + o->ip_qos_bulk = 0x08; + o->log_facility = SYSLOG_FACILITY_AUTH; + o->log_level = SYSLOG_LEVEL_DEBUG3; + o->fwd_opts.gateway_ports = 1; + o->fwd_opts.streamlocal_bind_mask = 0177; + o->fwd_opts.streamlocal_bind_unlink = 1; + o->permit_user_env = 1; + set_string(&o->permit_user_env_allowlist, ""); + o->rekey_limit = 123456789; + o->rekey_interval = 600; + o->timing_secret = 0x0102030405060708ULL; + + set_string(&o->routing_domain, ""); + set_string(&o->banner, NULL); + set_string(&o->adm_forced_command, "internal-sftp"); + set_string(&o->chroot_directory, ""); + set_string(&o->host_key_agent, NULL); + set_string(&o->authorized_keys_command, "/bin/echo"); + set_string(&o->authorized_keys_command_user, ""); + set_string(&o->authorized_principals_file, NULL); + + o->num_authkeys_files = 3; + o->authorized_keys_files = new_string_array(o->num_authkeys_files); + set_string(&o->authorized_keys_files[0], NULL); + set_string(&o->authorized_keys_files[1], ""); + set_string(&o->authorized_keys_files[2], ".ssh/authorized_keys"); + + o->num_log_verbose = 2; + o->log_verbose = new_string_array(o->num_log_verbose); + set_string(&o->log_verbose[0], NULL); + set_string(&o->log_verbose[1], "kex.c:*"); + + o->num_host_key_files = 3; + o->host_key_file_userprovided = + xcalloc(o->num_host_key_files, + sizeof(*o->host_key_file_userprovided)); + o->host_key_files = new_string_array(o->num_host_key_files); + o->host_key_file_userprovided[0] = 0; + o->host_key_file_userprovided[1] = 1; + o->host_key_file_userprovided[2] = -1; + set_string(&o->host_key_files[0], NULL); + set_string(&o->host_key_files[1], ""); + set_string(&o->host_key_files[2], "/tmp/ssh_host_ed25519_key"); + + o->num_queued_listens = 2; + o->queued_listen_addrs = xcalloc(o->num_queued_listens, + sizeof(*o->queued_listen_addrs)); + set_string(&o->queued_listen_addrs[0].addr, "127.0.0.1"); + o->queued_listen_addrs[0].port = 2222; + set_string(&o->queued_listen_addrs[0].rdomain, NULL); + set_string(&o->queued_listen_addrs[1].addr, "::1"); + o->queued_listen_addrs[1].port = -1; + set_string(&o->queued_listen_addrs[1].rdomain, ""); + + o->num_subsystems = 2; + o->subsystem_name = new_string_array(o->num_subsystems); + o->subsystem_command = new_string_array(o->num_subsystems); + o->subsystem_args = new_string_array(o->num_subsystems); + set_string(&o->subsystem_name[0], "sftp"); + set_string(&o->subsystem_command[0], "internal-sftp"); + set_string(&o->subsystem_args[0], "internal-sftp -f AUTH"); + set_string(&o->subsystem_name[1], "echo"); + set_string(&o->subsystem_command[1], "/bin/echo"); + set_string(&o->subsystem_args[1], "/bin/echo hello"); +} + +static void +check_roundtrip(const ServerOptions *o) +{ + struct sshbuf *buf = NULL; + ServerOptions out; + + initialize_server_options(&out); + ASSERT_INT_EQ(serialise_server_options(o, &buf), 0); + ASSERT_PTR_NE(buf, NULL); + ASSERT_INT_EQ(deserialise_server_options(buf, &out), 0); + ASSERT_SIZE_T_EQ(sshbuf_len(buf), 0); + + ASSERT_U_INT_EQ(out.num_ports, 2); + ASSERT_INT_EQ(out.ports[0], 22); + ASSERT_INT_EQ(out.ports[1], 2022); + ASSERT_INT_EQ(out.ip_qos_interactive, 0x10); + ASSERT_INT_EQ(out.ip_qos_bulk, 0x08); + ASSERT_INT_EQ(out.log_facility, SYSLOG_FACILITY_AUTH); + ASSERT_INT_EQ(out.log_level, SYSLOG_LEVEL_DEBUG3); + ASSERT_INT_EQ(out.fwd_opts.gateway_ports, 1); + ASSERT_INT_EQ(out.fwd_opts.streamlocal_bind_mask, 0177); + ASSERT_INT_EQ(out.fwd_opts.streamlocal_bind_unlink, 1); + ASSERT_INT_EQ(out.permit_user_env, 1); + ASSERT_STRING_EQ(out.permit_user_env_allowlist, ""); + ASSERT_LONG_LONG_EQ(out.rekey_limit, 123456789); + ASSERT_INT_EQ(out.rekey_interval, 600); + ASSERT_U64_EQ(out.timing_secret, 0x0102030405060708ULL); + + ASSERT_STRING_EQ(out.routing_domain, ""); + ASSERT_PTR_EQ(out.banner, NULL); + ASSERT_STRING_EQ(out.adm_forced_command, "internal-sftp"); + ASSERT_STRING_EQ(out.chroot_directory, ""); + ASSERT_PTR_EQ(out.host_key_agent, NULL); + ASSERT_STRING_EQ(out.authorized_keys_command, "/bin/echo"); + ASSERT_STRING_EQ(out.authorized_keys_command_user, ""); + ASSERT_PTR_EQ(out.authorized_principals_file, NULL); + + ASSERT_U_INT_EQ(out.num_authkeys_files, 3); + ASSERT_PTR_EQ(out.authorized_keys_files[0], NULL); + ASSERT_STRING_EQ(out.authorized_keys_files[1], ""); + ASSERT_STRING_EQ(out.authorized_keys_files[2], ".ssh/authorized_keys"); + + ASSERT_U_INT_EQ(out.num_log_verbose, 2); + ASSERT_PTR_EQ(out.log_verbose[0], NULL); + ASSERT_STRING_EQ(out.log_verbose[1], "kex.c:*"); + + ASSERT_U_INT_EQ(out.num_host_key_files, 3); + ASSERT_INT_EQ(out.host_key_file_userprovided[0], 0); + ASSERT_INT_EQ(out.host_key_file_userprovided[1], 1); + ASSERT_INT_EQ(out.host_key_file_userprovided[2], -1); + ASSERT_PTR_EQ(out.host_key_files[0], NULL); + ASSERT_STRING_EQ(out.host_key_files[1], ""); + ASSERT_STRING_EQ(out.host_key_files[2], "/tmp/ssh_host_ed25519_key"); + + ASSERT_U_INT_EQ(out.num_queued_listens, 2); + ASSERT_STRING_EQ(out.queued_listen_addrs[0].addr, "127.0.0.1"); + ASSERT_INT_EQ(out.queued_listen_addrs[0].port, 2222); + ASSERT_PTR_EQ(out.queued_listen_addrs[0].rdomain, NULL); + ASSERT_STRING_EQ(out.queued_listen_addrs[1].addr, "::1"); + ASSERT_INT_EQ(out.queued_listen_addrs[1].port, -1); + ASSERT_STRING_EQ(out.queued_listen_addrs[1].rdomain, ""); + + ASSERT_U_INT_EQ(out.num_subsystems, 2); + ASSERT_STRING_EQ(out.subsystem_name[0], "sftp"); + ASSERT_STRING_EQ(out.subsystem_command[0], "internal-sftp"); + ASSERT_STRING_EQ(out.subsystem_args[0], "internal-sftp -f AUTH"); + ASSERT_STRING_EQ(out.subsystem_name[1], "echo"); + ASSERT_STRING_EQ(out.subsystem_command[1], "/bin/echo"); + ASSERT_STRING_EQ(out.subsystem_args[1], "/bin/echo hello"); + + free_server_options(&out); + sshbuf_free(buf); +} + +static void +check_rejects_trailing_data(const ServerOptions *o) +{ + struct sshbuf *buf = NULL; + ServerOptions out; + int r; + + initialize_server_options(&out); + ASSERT_INT_EQ(serialise_server_options(o, &buf), 0); + ASSERT_PTR_NE(buf, NULL); + ASSERT_INT_EQ(sshbuf_put_u8(buf, 0), 0); + r = deserialise_server_options(buf, &out); + ASSERT_INT_EQ(r, SSH_ERR_INVALID_FORMAT); + free_server_options(&out); + sshbuf_free(buf); +} + +static void +check_rejects_bad_version(const ServerOptions *o) +{ + struct sshbuf *buf = NULL; + ServerOptions out; + int r; + + initialize_server_options(&out); + ASSERT_INT_EQ(serialise_server_options(o, &buf), 0); + ASSERT_PTR_NE(buf, NULL); + ASSERT_PTR_NE(sshbuf_mutable_ptr(buf), NULL); + POKE_U32(sshbuf_mutable_ptr(buf), 2); + r = deserialise_server_options(buf, &out); + ASSERT_INT_EQ(r, SSH_ERR_INVALID_FORMAT); + free_server_options(&out); + sshbuf_free(buf); +} + +static void +check_rejects_bad_port_count(const ServerOptions *o) +{ + struct sshbuf *buf = NULL; + ServerOptions out; + int r; + + initialize_server_options(&out); + ASSERT_INT_EQ(serialise_server_options(o, &buf), 0); + ASSERT_PTR_NE(buf, NULL); + ASSERT_SIZE_T_GT(sshbuf_len(buf), 8); + ASSERT_PTR_NE(sshbuf_mutable_ptr(buf), NULL); + POKE_U32(sshbuf_mutable_ptr(buf) + 4, MAX_PORTS + 1); + r = deserialise_server_options(buf, &out); + ASSERT_INT_EQ(r, SSH_ERR_INVALID_FORMAT); + free_server_options(&out); + sshbuf_free(buf); +} + +static void +check_roundtrip_signed_limits(const ServerOptions *o) +{ + struct sshbuf *buf = NULL; + ServerOptions out, in; + + initialize_server_options(&out); + in = *o; + in.fwd_opts.streamlocal_bind_mask = (mode_t)-1; + in.ip_qos_bulk = INT_MIN; + in.rekey_limit = INT64_MIN; + ASSERT_INT_EQ(serialise_server_options(&in, &buf), 0); + ASSERT_PTR_NE(buf, NULL); + ASSERT_INT_EQ(deserialise_server_options(buf, &out), 0); + ASSERT_INT_EQ(out.fwd_opts.streamlocal_bind_mask == (mode_t)-1, 1); + ASSERT_INT_EQ(out.ip_qos_bulk, INT_MIN); + ASSERT_LONG_LONG_EQ(out.rekey_limit, INT64_MIN); + free_server_options(&out); + sshbuf_free(buf); +} + +static void +attempt_deserialise_blob(const u_char *p, size_t len) +{ + struct sshbuf *buf; + ServerOptions out; + + initialize_server_options(&out); + ASSERT_PTR_NE(buf = sshbuf_from(p, len), NULL); + (void)deserialise_server_options(buf, &out); + free_server_options(&out); + sshbuf_free(buf); +} + +static void +check_fuzz_deserialise(const ServerOptions *o) +{ + struct sshbuf *buf = NULL; + struct fuzz *fuzz; + u_int fuzzers = FUZZ_1_BIT_FLIP | FUZZ_1_BYTE_FLIP | + FUZZ_TRUNCATE_START | FUZZ_TRUNCATE_END; + + if (test_is_fast()) + fuzzers &= ~FUZZ_1_BIT_FLIP; + if (test_is_slow()) + fuzzers |= FUZZ_2_BYTE_FLIP; + + ASSERT_INT_EQ(serialise_server_options(o, &buf), 0); + ASSERT_PTR_NE(buf, NULL); + fuzz = fuzz_begin(fuzzers, sshbuf_ptr(buf), sshbuf_len(buf)); + TEST_ONERROR(onerror, fuzz); + for (; !fuzz_done(fuzz); fuzz_next(fuzz)) + attempt_deserialise_blob(fuzz_ptr(fuzz), fuzz_len(fuzz)); + TEST_ONERROR(NULL, NULL); + fuzz_cleanup(fuzz); + sshbuf_free(buf); +} + +void +tests(void) +{ + ServerOptions o; + + log_init("test_servconf", SYSLOG_LEVEL_QUIET, SYSLOG_FACILITY_AUTH, 1); + + TEST_START("server options round trip preserves nullable state"); + set_test_options(&o); + check_roundtrip(&o); + free_server_options(&o); + TEST_DONE(); + + TEST_START("server options reject trailing data"); + set_test_options(&o); + check_rejects_trailing_data(&o); + free_server_options(&o); + TEST_DONE(); + + TEST_START("server options reject unsupported version"); + set_test_options(&o); + check_rejects_bad_version(&o); + free_server_options(&o); + TEST_DONE(); + + TEST_START("server options reject bad port count"); + set_test_options(&o); + check_rejects_bad_port_count(&o); + free_server_options(&o); + TEST_DONE(); + + TEST_START("server options round trip signed limits"); + set_test_options(&o); + check_roundtrip_signed_limits(&o); + free_server_options(&o); + TEST_DONE(); + + TEST_START("server options deserialise fuzz"); + set_test_options(&o); + check_fuzz_deserialise(&o); + free_server_options(&o); + TEST_DONE(); +} + +void +benchmarks(void) +{ + printf("no benchmarks\n"); +} From ea91c7a1a9ccb22bacd8fcff824c84e3b8414af5 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Sun, 31 May 2026 22:03:56 +1000 Subject: [PATCH 078/196] depend --- .depend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.depend b/.depend index 134a986596a0..ecb33594981d 100644 --- a/.depend +++ b/.depend @@ -126,7 +126,7 @@ sk-usbhid.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-com sntrup761.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h srclimit.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h addr.h canohost.h log.h ssherr.h misc.h srclimit.h xmalloc.h servconf.h match.h ssh-add.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h log.h ssherr.h sshkey.h sshbuf.h authfd.h authfile.h pathnames.h misc.h digest.h ssh-sk.h sk-api.h hostfile.h -ssh-agent.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h ssh2.h sshbuf.h sshkey.h authfd.h log.h ssherr.h misc.h digest.h match.h msg.h pathnames.h ssh-pkcs11.h sk-api.h myproposal.h +ssh-agent.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h ssh2.h sshbuf.h sshkey.h authfd.h log.h ssherr.h misc.h digest.h match.h msg.h pathnames.h ssh-pkcs11.h sk-api.h myproposal.h version.h ssh-ecdsa-sk.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/openssl-compat.h sshbuf.h ssherr.h digest.h sshkey.h ssh-ecdsa.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh-ed25519-sk.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crypto_api.h log.h ssherr.h sshbuf.h sshkey.h digest.h From 58b9381e0b1dbc8e56190b26fb61bae4cfb240be Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 31 May 2026 13:12:07 +0000 Subject: [PATCH 079/196] upstream: handle compiled-time unsupported options in servconf.h better; leave a zero placeholder variable so we don't have #ifdef around their absence elsehwere in the tree OpenBSD-Commit-ID: 9601de2c67042aacb0ea12ca424e67c092fa7801 --- servconf.c | 91 ++++++++++++++++++++++++++++++++++++++++++------------ servconf.h | 88 ++++++++++++++++++++++++++++------------------------ 2 files changed, 120 insertions(+), 59 deletions(-) diff --git a/servconf.c b/servconf.c index b378a8aee719..006c216c78cd 100644 --- a/servconf.c +++ b/servconf.c @@ -95,7 +95,9 @@ initialize_server_options(ServerOptions *options) init_##funcsuffix(options) #define SSHCONF_NONCONF(funcsuffix) \ init_##funcsuffix(options) -#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) /* empty */ +#define SSHCONF_DEPRECATE(conf, flags, opcode) /* empty */ +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) options->var = 0; +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) options->var = NULL; #define SSHCONF_ALIAS(old, conf, flags) /* empty */ /* Using macros for these is a bit overkill but forces consistency */ @@ -184,7 +186,9 @@ initialize_server_options(ServerOptions *options) #undef SSHCONF_STRARRAY #undef SSHCONF_CUSTOM #undef SSHCONF_NONCONF -#undef SSHCONF_NOSUPPORT +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING #undef SSHCONF_ALIAS } @@ -276,7 +280,13 @@ fill_default_server_options(ServerOptions *options) #define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) /* done manually */ #define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) /* done manually */ #define SSHCONF_NONCONF(funcsuffix) /* done manually */ -#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) /* empty */ +#define SSHCONF_DEPRECATE(conf, flags, opcode) /* empty */ +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) options->var = 0; +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) \ + do { \ + free(options->var); \ + options->var = NULL; \ + } while (0); #define SSHCONF_ALIAS(old, conf, flags) /* empty */ /* XXX maybe use macros here too to force consistency? */ @@ -289,9 +299,16 @@ fill_default_server_options(ServerOptions *options) #undef SSHCONF_STRARRAY #undef SSHCONF_CUSTOM #undef SSHCONF_NONCONF -#undef SSHCONF_NOSUPPORT +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING #undef SSHCONF_ALIAS +#ifdef USE_PAM + if (options->pam_service_name == NULL) + options->pam_service_name = xstrdup(SSHD_PAM_SERVICE); +#endif + if (options->num_host_key_files == 0) { /* fill default hostkeys */ servconf_add_hostkey("[default]", 0, options, @@ -442,7 +459,9 @@ fill_default_server_options(ServerOptions *options) #define SSHCONF_STRARRAY(var, nvar, conf, flags, cp) s##conf, #define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) s##conf, #define SSHCONF_NONCONF(funcsuffix) /* empty */ -#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) /* empty */ +#define SSHCONF_DEPRECATE(conf, flags, opcode) /* empty */ +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) /* empty */ +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) /* empty */ #define SSHCONF_ALIAS(old, conf, flags) /* empty */ /* Keyword tokens. */ @@ -458,7 +477,9 @@ typedef enum { #undef SSHCONF_STRARRAY #undef SSHCONF_CUSTOM #undef SSHCONF_NONCONF -#undef SSHCONF_NOSUPPORT +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING #undef SSHCONF_ALIAS #define SSHCFG_GLOBAL 0x01 /* allowed in main section of config */ @@ -477,9 +498,12 @@ typedef enum { #define SSHCONF_NONCONF(funcsuffix) /* empty */ #define SSHCONF_DEPRECATED sDeprecated #define SSHCONF_IGNORE sIgnore -#define SSHCONF_UNSUPPORTED sUnsupported -#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) \ +#define SSHCONF_DEPRECATE(conf, flags, opcode) \ { #conf, opcode, flags }, +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) \ + { #conf, sUnsupported, flags }, +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) \ + { #conf, sUnsupported, flags }, #define SSHCONF_ALIAS(old, conf, flags) \ { #old, s##conf, flags }, @@ -502,8 +526,9 @@ static struct { #undef SSHCONF_NONCONF #undef SSHCONF_DEPRECATED #undef SSHCONF_IGNORE -#undef SSHCONF_UNSUPPORTED -#undef SSHCONF_NOSUPPORT +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING #undef SSHCONF_ALIAS static struct { @@ -1143,7 +1168,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, switch (opcode) { /* Portable-specific options */ -#ifdef WITH_PAM +#ifdef USE_PAM case sUsePAM: intptr = &options->use_pam; goto parse_flag; @@ -3080,7 +3105,9 @@ serialise_server_options(const ServerOptions *options, struct sshbuf **bufp) #define SSHCONF_NONCONF(funcsuffix) \ if ((r = serialise_##funcsuffix(options, buf)) != 0) \ goto out; -#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) /* empty */ +#define SSHCONF_DEPRECATE(conf, flags, opcode) /* empty */ +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) /* empty */ +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) /* empty */ #define SSHCONF_ALIAS(old, conf, flags) /* empty */ SSHD_CONFIG_ENTRIES @@ -3091,7 +3118,9 @@ serialise_server_options(const ServerOptions *options, struct sshbuf **bufp) #undef SSHCONF_STRARRAY #undef SSHCONF_CUSTOM #undef SSHCONF_NONCONF -#undef SSHCONF_NOSUPPORT +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING #undef SSHCONF_ALIAS /* success */ @@ -3611,7 +3640,13 @@ deserialise_server_options(struct sshbuf *buf, ServerOptions *options) #define SSHCONF_NONCONF(funcsuffix) \ if ((r = deserialise_##funcsuffix(&new_options, buf)) != 0) \ goto out; -#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) /* empty */ +#define SSHCONF_DEPRECATE(conf, flags, opcode) /* empty */ +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) new_options.var = 0; +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) \ + do { \ + free(new_options.var); \ + new_options.var = NULL; \ + } while (0); #define SSHCONF_ALIAS(old, conf, flags) /* empty */ SSHD_CONFIG_ENTRIES @@ -3628,7 +3663,9 @@ deserialise_server_options(struct sshbuf *buf, ServerOptions *options) #undef SSHCONF_STRARRAY #undef SSHCONF_CUSTOM #undef SSHCONF_NONCONF -#undef SSHCONF_NOSUPPORT +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING #undef SSHCONF_ALIAS /* success */ @@ -3701,7 +3738,13 @@ free_server_options(ServerOptions *options) free_##funcsuffix(options); #define SSHCONF_NONCONF(funcsuffix) \ free_##funcsuffix(options); -#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) /* empty */ +#define SSHCONF_DEPRECATE(conf, flags, opcode) /* empty */ +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) options->var = 0; +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) \ + do { \ + free(options->var); \ + options->var = NULL; \ + } while (0); #define SSHCONF_ALIAS(old, conf, flags) /* empty */ #define free_ipqos(options) @@ -3738,7 +3781,9 @@ free_server_options(ServerOptions *options) #undef SSHCONF_STRARRAY #undef SSHCONF_CUSTOM #undef SSHCONF_NONCONF -#undef SSHCONF_NOSUPPORT +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING #undef SSHCONF_ALIAS initialize_server_options(options); @@ -3869,7 +3914,13 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth) #define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) \ cp(copy_##funcsuffix(dst, src);) #define SSHCONF_NONCONF(funcsuffix) /* empty */ -#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) /* empty */ +#define SSHCONF_DEPRECATE(conf, flags, opcode) /* empty */ +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) dst->var = 0; +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) \ + do { \ + free(dst->var); \ + dst->var = NULL; \ + } while (0); #define SSHCONF_ALIAS(old, conf, flags) /* empty */ SSHD_CONFIG_ENTRIES @@ -3880,7 +3931,9 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth) #undef SSHCONF_STRARRAY #undef SSHCONF_CUSTOM #undef SSHCONF_NONCONF -#undef SSHCONF_NOSUPPORT +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING #undef SSHCONF_ALIAS /* diff --git a/servconf.h b/servconf.h index a78450343eb3..9e64e4673743 100644 --- a/servconf.h +++ b/servconf.h @@ -117,8 +117,10 @@ struct per_source_penalty { * their corresponding variable definitions in ServerOptions. The integer * options also include defaults for initialisation. * - * Unsupported, deprecated and ignored options use SSHCONF_NOSUPPORT and - * don't populate ServerOptions. Deprecated aliases that still work use + * Deprecated and ignored options use SSHCONF_DEPRECATE and don't populate + * ServerOptions. Unsupported options use SSHCONF_UNSUPPORTED_INT or + * SSHCONF_UNSUPPORTED_STRING to populate placeholders in ServerOptions that + * are not otherwise used. Deprecated aliases that still work use * SSHCONF_ALIAS. * * Why go to all this trouble? It ensures a level of consistency between @@ -133,7 +135,9 @@ struct per_source_penalty { * SSHCONF_STRARRAY(field, nfield, keyword, scope, copy) * SSHCONF_CUSTOM(keyword, suffix, scope, copy) * SSHCONF_NONCONF(suffix) - * SSHCONF_NOSUPPORT(field, keyword, token, scope) + * SSHCONF_DEPRECATE(keyword, scope, token) + * SSHCONF_UNSUPPORTED_INT(field, keyword, scope) + * SSHCONF_UNSUPPORTED_STRING(field, keyword, scope) * SSHCONF_ALIAS(old_keyword, keyword, scope) */ #define SSHD_CONFIG_ENTRIES_CUSTOM \ @@ -234,18 +238,20 @@ SSHCONF_STRING(sshd_auth_path, SshdAuthPath, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) \ SSHCONF_INTFLAG(refuse_connection, RefuseConnection, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) #define SSHD_CONFIG_ENTRIES_LEGACY \ -SSHCONF_NOSUPPORT(server_key_bits, ServerKeyBits, SSHCONF_DEPRECATED, SSHCFG_GLOBAL) \ -SSHCONF_NOSUPPORT(key_regeneration_interval, KeyRegenerationInterval, SSHCONF_DEPRECATED, SSHCFG_GLOBAL) \ -SSHCONF_NOSUPPORT(rhosts_authentication, RHostsAuthentication, SSHCONF_DEPRECATED, SSHCFG_GLOBAL) \ -SSHCONF_NOSUPPORT(rhosts_rsa_authentication, RhostsRSAAuthentication, SSHCONF_DEPRECATED, SSHCFG_ALL) \ -SSHCONF_NOSUPPORT(rsa_authentication, RSAAuthentication, SSHCONF_DEPRECATED, SSHCFG_ALL) \ -SSHCONF_NOSUPPORT(check_mail, CheckMail, SSHCONF_DEPRECATED, SSHCFG_GLOBAL) \ -SSHCONF_NOSUPPORT(use_login, UseLogin, SSHCONF_DEPRECATED, SSHCFG_GLOBAL) \ -SSHCONF_NOSUPPORT(verify_reverse_mapping, VerifyReverseMapping, SSHCONF_DEPRECATED, SSHCFG_GLOBAL) \ -SSHCONF_NOSUPPORT(reverse_mapping_check, ReverseMappingCheck, SSHCONF_DEPRECATED, SSHCFG_GLOBAL) \ -SSHCONF_NOSUPPORT(authorized_keys_file2, AuthorizedKeysFile2, SSHCONF_DEPRECATED, SSHCFG_ALL) \ -SSHCONF_NOSUPPORT(use_privilege_separation, UsePrivilegeSeparation, SSHCONF_DEPRECATED, SSHCFG_GLOBAL) \ -SSHCONF_NOSUPPORT(protocol, Protocol, SSHCONF_IGNORE, SSHCFG_GLOBAL) +SSHCONF_DEPRECATE(ServerKeyBits, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(KeyRegenerationInterval, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(RHostsAuthentication, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(RhostsRSAAuthentication, SSHCFG_ALL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(RSAAuthentication, SSHCFG_ALL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(CheckMail, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(UseLogin, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(VerifyReverseMapping, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(ReverseMappingCheck, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(AuthorizedKeysFile2, SSHCFG_ALL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(UsePrivilegeSeparation, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(KerberosTgtPassing, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(AFSTokenPassing, SSHCFG_GLOBAL, SSHCONF_DEPRECATED) \ +SSHCONF_DEPRECATE(Protocol, SSHCFG_GLOBAL, SSHCONF_IGNORE) #define SSHD_CONFIG_ENTRIES_ALIASES \ SSHCONF_ALIAS(HostDSAKey, HostKey, SSHCFG_GLOBAL) \ @@ -261,11 +267,22 @@ SSHCONF_ALIAS(KeepAlive, TCPKeepAlive, SSHCFG_GLOBAL) SSHD_CONFIG_ENTRIES_MAIN \ SSHD_CONFIG_ENTRIES_LEGACY \ SSHD_CONFIG_ENTRIES_ALIASES \ + SSHD_CONFIG_ENTRIES_PAM \ SSHD_CONFIG_ENTRIES_LASTLOG +#ifdef USE_PAM +#define SSHD_CONFIG_ENTRIES_PAM \ +SSHCONF_INTFLAG(use_pam, UsePAM, SSHCFG_GLOBAL, 0, SSHCFG_COPY_NONE) \ +SSHCONF_STRING(pam_service_name, PAMServiceName, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) +#else +#define SSHD_CONFIG_ENTRIES_PAM \ +SSHCONF_UNSUPPORTED_INT(use_pam, UsePAM, SSHCFG_GLOBAL) \ +SSHCONF_UNSUPPORTED_STRING(pam_service_name, PAMServiceName, SSHCFG_GLOBAL) +#endif + #ifdef DISABLE_LASTLOG #define SSHD_CONFIG_ENTRIES_LASTLOG \ -SSHCONF_NOSUPPORT(print_lastlog, PrintLastLog, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) +SSHCONF_UNSUPPORTED_INT(print_lastlog, PrintLastLog, SSHCFG_GLOBAL) #else #define SSHD_CONFIG_ENTRIES_LASTLOG \ SSHCONF_INTFLAG(print_lastlog, PrintLastLog, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) @@ -279,7 +296,7 @@ SSHCONF_INTFLAG(print_lastlog, PrintLastLog, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) SSHCONF_INTFLAG(kerberos_get_afs_token, KerberosGetAFSToken, SSHCFG_GLOBAL, 0, SSHCFG_COPY_NONE) #else /* USE_AFS */ #define SSHD_CONFIG_KRB5_AFS \ -SSHCONF_NOSUPPORT(kerberos_get_afs_token, KerberosGetAFSToken, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) +SSHCONF_UNSUPPORTED_INT(kerberos_get_afs_token, KerberosGetAFSToken, SSHCFG_GLOBAL) #endif /* USE_AFS */ #define SSHD_CONFIG_ENTRIES_KRB5 \ @@ -289,12 +306,10 @@ SSHCONF_INTFLAG(kerberos_ticket_cleanup, KerberosTicketCleanup, SSHCFG_GLOBAL, 1 SSHD_CONFIG_KRB5_AFS #else /* KRB5 */ #define SSHD_CONFIG_ENTRIES_KRB5 \ -SSHCONF_NOSUPPORT(kerberos_authentication, KerberosAuthentication, SSHCONF_UNSUPPORTED, SSHCFG_ALL) \ -SSHCONF_NOSUPPORT(kerberos_or_local_passwd, KerberosOrLocalPasswd, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) \ -SSHCONF_NOSUPPORT(kerberos_ticket_cleanup, KerberosTicketCleanup, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) \ -SSHCONF_NOSUPPORT(kerberos_get_afs_token, KerberosGetAFSToken, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) \ -SSHCONF_NOSUPPORT(kerberos_tgt_passing, KerberosTgtPassing, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) \ -SSHCONF_NOSUPPORT(afs_token_passing, AFSTokenPassing, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) +SSHCONF_UNSUPPORTED_INT(kerberos_authentication, KerberosAuthentication, SSHCFG_ALL) \ +SSHCONF_UNSUPPORTED_INT(kerberos_or_local_passwd, KerberosOrLocalPasswd, SSHCFG_GLOBAL) \ +SSHCONF_UNSUPPORTED_INT(kerberos_ticket_cleanup, KerberosTicketCleanup, SSHCFG_GLOBAL) \ +SSHCONF_UNSUPPORTED_INT(kerberos_get_afs_token, KerberosGetAFSToken, SSHCFG_GLOBAL) #endif /* KRB5 */ #ifdef GSSAPI @@ -305,10 +320,10 @@ SSHCONF_INTFLAG(gss_deleg_creds, GssDelegateCreds, SSHCFG_GLOBAL, 1, SSHCFG_COPY SSHCONF_INTFLAG(gss_strict_acceptor, GssStrictAcceptor, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) #else /* GSSAPI */ #define SSHD_CONFIG_ENTRIES_GSS \ -SSHCONF_NOSUPPORT(gss_authentication, GssAuthentication, SSHCONF_UNSUPPORTED, SSHCFG_ALL) \ -SSHCONF_NOSUPPORT(gss_cleanup_creds, GssCleanupCreds, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) \ -SSHCONF_NOSUPPORT(gss_deleg_creds, GssDelegateCreds, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) \ -SSHCONF_NOSUPPORT(gss_strict_acceptor, GssStrictAcceptor, SSHCONF_UNSUPPORTED, SSHCFG_GLOBAL) +SSHCONF_UNSUPPORTED_INT(gss_authentication, GssAuthentication, SSHCFG_ALL) \ +SSHCONF_UNSUPPORTED_INT(gss_cleanup_creds, GssCleanupCreds, SSHCFG_GLOBAL) \ +SSHCONF_UNSUPPORTED_INT(gss_deleg_creds, GssDelegateCreds, SSHCFG_GLOBAL) \ +SSHCONF_UNSUPPORTED_INT(gss_strict_acceptor, GssStrictAcceptor, SSHCFG_GLOBAL) #endif /* GSSAPI */ #define SSHD_CONFIG_ENTRIES \ @@ -325,7 +340,9 @@ SSHCONF_NOSUPPORT(gss_strict_acceptor, GssStrictAcceptor, SSHCONF_UNSUPPORTED, S u_int nvar; #define SSHCONF_CUSTOM(conf, funcsuffix, flags, cp) /* empty */ #define SSHCONF_NONCONF(funcsuffix) /* empty */ -#define SSHCONF_NOSUPPORT(var, conf, opcode, flags) /* empty */ +#define SSHCONF_DEPRECATE(conf, flags, opcode) /* empty */ +#define SSHCONF_UNSUPPORTED_INT(var, conf, flags) int var; +#define SSHCONF_UNSUPPORTED_STRING(var, conf, flags) char *var; #define SSHCONF_ALIAS(old, conf, flags) /* empty */ typedef struct ServerOptions { @@ -374,17 +391,6 @@ typedef struct ServerOptions { int rekey_interval; /* Passed by config but not keyword for this */ uint64_t timing_secret; - /* Placeholders for compile-time disabled things */ - /* XXX djm redo macros to remove these */ -#ifndef WITH_PAM - int use_pam; -#endif -#ifdef DISABLE_LASTLOG - int print_lastlog; -#endif -#ifndef KRB5 - int kerberos_authentication; -#endif } ServerOptions; #undef SSHCONF_INT #undef SSHCONF_INTFLAG @@ -392,7 +398,9 @@ typedef struct ServerOptions { #undef SSHCONF_STRARRAY #undef SSHCONF_CUSTOM #undef SSHCONF_NONCONF -#undef SSHCONF_NOSUPPORT +#undef SSHCONF_DEPRECATE +#undef SSHCONF_UNSUPPORTED_INT +#undef SSHCONF_UNSUPPORTED_STRING #undef SSHCONF_ALIAS /* Information about the incoming connection as used by Match */ From de24573efc60ca145e4f2d7e45787eccf8bd41a4 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 1 Jun 2026 05:40:13 +0000 Subject: [PATCH 080/196] upstream: Actually set pollfd.events correctly for socket type channels; previously we were throwing away the events we computed if the channel had a c->sock distinct from it's other read and write fds. Fortunately, it appears that this case happens rarely, if ever. Reported by Darafei Praliaskouski via GHPR660 OpenBSD-Commit-ID: d3f483b7919946c5649e8c697d5b927af35aac4b --- channels.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/channels.c b/channels.c index 949f5776530d..237ab56395d8 100644 --- a/channels.c +++ b/channels.c @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.460 2026/05/31 06:14:42 djm Exp $ */ +/* $OpenBSD: channels.c,v 1.461 2026/06/01 05:40:13 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -2863,7 +2863,7 @@ channel_prepare_pollfd(Channel *c, u_int *next_pollfd, if (ev != 0) { c->pfds[3] = p; pfd[p].fd = c->sock; - pfd[p].events = 0; + pfd[p].events = ev; dump_channel_poll(__func__, "sock", c, p, &pfd[p]); p++; } From 684d26a3c4d07e78027517fd6e98875ae5dff71d Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 1 Jun 2026 05:49:20 +0000 Subject: [PATCH 081/196] upstream: sk-usbhid: skip unsupported key types in read_rks() When enumerating resident keys, encountering a credential with an unsupported COSE key type (not ES256 or EdDSA) caused the entire enumeration to abort via goto out, discarding all valid keys. Move the key type check before the per-credential allocation so unsupported types can be skipped with continue instead. This preserves all valid resident keys on the token. Patch from Akhilesh Arora via GHPR657 OpenBSD-Commit-ID: b344a44ff97d26faf099b8e0cad72ad1e793ac0f --- sk-usbhid.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/sk-usbhid.c b/sk-usbhid.c index cd248811a51c..ce59c4e9317d 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sk-usbhid.c,v 1.48 2025/05/12 05:41:20 tb Exp $ */ +/* $OpenBSD: sk-usbhid.c,v 1.49 2026/06/01 05:49:20 djm Exp $ */ /* * Copyright (c) 2019 Markus Friedl * Copyright (c) 2020 Pedro Martelletto @@ -1262,6 +1262,7 @@ read_rks(struct sk_usbhid *sk, const char *pin, struct sk_resident_key ***rksp, size_t *nrksp) { int ret = SSH_SK_ERR_GENERAL, r = -1, internal_uv; + uint32_t alg; fido_credman_metadata_t *metadata = NULL; fido_credman_rp_t *rp = NULL; fido_credman_rk_t *rk = NULL; @@ -1358,6 +1359,20 @@ read_rks(struct sk_usbhid *sk, const char *pin, user_id_len, j, fido_cred_type(cred), fido_cred_flags(cred), fido_cred_prot(cred)); + /* Determine key algorithm */ + switch (fido_cred_type(cred)) { + case COSE_ES256: + alg = SSH_SK_ECDSA; + break; + case COSE_EDDSA: + alg = SSH_SK_ED25519; + break; + default: + skdebug(__func__, "unsupported key type %d", + fido_cred_type(cred)); + continue; + } + /* build response entry */ if ((srk = calloc(1, sizeof(*srk))) == NULL || (srk->key.key_handle = calloc(1, @@ -1369,6 +1384,7 @@ read_rks(struct sk_usbhid *sk, const char *pin, goto out; } + srk->alg = alg; srk->key.key_handle_len = fido_cred_id_len(cred); memcpy(srk->key.key_handle, fido_cred_id_ptr(cred), srk->key.key_handle_len); @@ -1376,19 +1392,6 @@ read_rks(struct sk_usbhid *sk, const char *pin, if (srk->user_id_len != 0) memcpy(srk->user_id, user_id, srk->user_id_len); - switch (fido_cred_type(cred)) { - case COSE_ES256: - srk->alg = SSH_SK_ECDSA; - break; - case COSE_EDDSA: - srk->alg = SSH_SK_ED25519; - break; - default: - skdebug(__func__, "unsupported key type %d", - fido_cred_type(cred)); - goto out; /* XXX free rk and continue */ - } - if (fido_cred_prot(cred) == FIDO_CRED_PROT_UV_REQUIRED && internal_uv == -1) srk->flags |= SSH_SK_USER_VERIFICATION_REQD; From 7b776066bc00a12ec3a7f9b04cf8a69a8d260c2c Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 1 Jun 2026 17:39:40 +1000 Subject: [PATCH 082/196] Update LibreSSL test 4.3.1->4.3.2. --- .github/workflows/c-cpp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 62509262f30b..64300b45bbf5 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -84,7 +84,7 @@ jobs: - { target: ubuntu-latest, config: libressl-4.0.1 } - { target: ubuntu-latest, config: libressl-4.1.1 } - { target: ubuntu-latest, config: libressl-4.2.0 } - - { target: ubuntu-latest, config: libressl-4.3.1 } + - { target: ubuntu-latest, config: libressl-4.3.2 } - { target: ubuntu-latest, config: openssl-master } - { target: ubuntu-latest, config: openssl-noec } - { target: ubuntu-latest, config: openssl-1.1.1 } From 2afcdf7b3e429428d9b6415e0c948001bf968477 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 1 Jun 2026 17:40:03 +1000 Subject: [PATCH 083/196] Pass awk detected by configure to regress tests. Some platforms' basic awk don't have toupper, but other awks like nawk or gawk do. Pass the one found by configure through to the regress tests, and make a wrapper for it so we don't need to modify any tests. --- Makefile.in | 1 + regress/test-exec.sh | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/Makefile.in b/Makefile.in index 4a676f3258b3..730e598d0577 100644 --- a/Makefile.in +++ b/Makefile.in @@ -806,6 +806,7 @@ TEST_SSH_SSHD="$(BUILDDIR)/sshd" interop-tests t-exec file-tests extra-tests: regress-prep regress-binaries $(TARGETS) cd $(srcdir)/regress || exit $$?; \ + AWK='@AWK@' \ EGREP='@EGREP@' \ OPENSSL_BIN='@OPENSSL_BIN@' \ $(MAKE) \ diff --git a/regress/test-exec.sh b/regress/test-exec.sh index 577bc01afa1c..cb9836c98398 100644 --- a/regress/test-exec.sh +++ b/regress/test-exec.sh @@ -79,6 +79,14 @@ if test "x${EGREP}" != "x"; then } fi +# Likewise with awk. +if test "x${AWK}" != "x"; then + awk () +{ + ${AWK} "$@" +} +fi + SRC=`dirname ${SCRIPT}` # defaults From 51db029b53488bc972deba13724034f8e35e6e38 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 1 Jun 2026 18:26:31 +1000 Subject: [PATCH 084/196] Don't install shim for AWK=awk. If configure finds an undadorned awk, don't install the shim to prevent recursive calls to it. --- regress/test-exec.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regress/test-exec.sh b/regress/test-exec.sh index cb9836c98398..30a2a28abf57 100644 --- a/regress/test-exec.sh +++ b/regress/test-exec.sh @@ -80,7 +80,7 @@ if test "x${EGREP}" != "x"; then fi # Likewise with awk. -if test "x${AWK}" != "x"; then +if test "x${AWK}" != "x" && test "x${AWK}" != "xawk"; then awk () { ${AWK} "$@" From de97e5a44c88179b834939b84cd555249382de0e Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 1 Jun 2026 08:27:28 +0000 Subject: [PATCH 085/196] upstream: differentiate between execution failures and subsystem not found when logging why a subsystem failed to start; GHPR#637 from cuiweixie OpenBSD-Commit-ID: 42bc40dd6272b7f6726b069a8c4e16025a354056 --- session.c | 51 +++++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/session.c b/session.c index 93de35d7c5e3..dee66598e4e4 100644 --- a/session.c +++ b/session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: session.c,v 1.348 2026/03/05 05:40:36 djm Exp $ */ +/* $OpenBSD: session.c,v 1.349 2026/06/01 08:27:28 djm Exp $ */ /* * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland * All rights reserved @@ -1907,7 +1907,7 @@ static int session_subsystem_req(struct ssh *ssh, Session *s) { struct stat st; - int r, success = 0; + int r, success = 0, found = 0; char *prog, *cmd, *type; u_int i; @@ -1918,31 +1918,34 @@ session_subsystem_req(struct ssh *ssh, Session *s) s->pw->pw_name); for (i = 0; i < options.num_subsystems; i++) { - if (strcmp(s->subsys, options.subsystem_name[i]) == 0) { - prog = options.subsystem_command[i]; - cmd = options.subsystem_args[i]; - if (strcmp(INTERNAL_SFTP_NAME, prog) == 0) { - s->is_subsystem = SUBSYSTEM_INT_SFTP; - debug("subsystem: %s", prog); - } else { - if (stat(prog, &st) == -1) - debug("subsystem: cannot stat %s: %s", - prog, strerror(errno)); - s->is_subsystem = SUBSYSTEM_EXT; - debug("subsystem: exec() %s", cmd); - } - xasprintf(&type, "session:subsystem:%s", - options.subsystem_name[i]); - channel_set_xtype(ssh, s->chanid, type); - free(type); - success = do_exec(ssh, s, cmd) == 0; - break; + if (strcmp(s->subsys, options.subsystem_name[i]) != 0) + continue; + found = 1; + prog = options.subsystem_command[i]; + cmd = options.subsystem_args[i]; + if (strcmp(INTERNAL_SFTP_NAME, prog) == 0) { + s->is_subsystem = SUBSYSTEM_INT_SFTP; + debug("subsystem: %s", prog); + } else { + if (stat(prog, &st) == -1) + debug("subsystem: cannot stat %s: %s", + prog, strerror(errno)); + s->is_subsystem = SUBSYSTEM_EXT; + debug("subsystem: exec() %s", cmd); } + xasprintf(&type, "session:subsystem:%s", + options.subsystem_name[i]); + channel_set_xtype(ssh, s->chanid, type); + free(type); + success = do_exec(ssh, s, cmd) == 0; + break; } - if (!success) - logit("subsystem request for %.100s by user %s failed, " - "subsystem not found", s->subsys, s->pw->pw_name); + if (!success) { + logit("subsystem request for %.100s by user %s failed, %s", + s->subsys, s->pw->pw_name, + found ? "execution failed" : "subsystem not found"); + } return success; } From e8c12cc085272894e7c14eb761e82ec7c0d8f599 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 1 Jun 2026 20:43:31 +1000 Subject: [PATCH 086/196] setup_ci.sh: add timeout and allow one retry --- .github/setup_ci.sh | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index fa5781813957..22f0a6668a08 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -2,14 +2,29 @@ config="$1" target="$2" +retry="$3" + +timeout=3600 + +fail () { trap '' 0; exit 1; } +success () { trap '' 0; exit 0; } + +if [ "${retry}" != "retry" ]; then + echo Set trap for single retry with timeout at $timeout seconds. + trap "exec $0 $1 $2 retry" HUP + (sleep $timeout; kill -HUP $$) & + trap "kill $!; sleep 120; exec $0 $1 $2 retry" 0 +else + echo "$0: retrying" +fi PACKAGES="tmux" echo Running as: id -echo Environment: -set +echo Environment saved to env.txt +set >env.txt . .github/configs ${config} @@ -69,7 +84,7 @@ if [ ! -z "$SUDO" ]; then fi if ! "$SUDO" -u nobody -S test -x ~ Date: Tue, 2 Jun 2026 17:44:12 +1000 Subject: [PATCH 087/196] Add includes.h for compat functions. Fixes build on at least old AIX. --- regress/unittests/servconf/tests.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/regress/unittests/servconf/tests.c b/regress/unittests/servconf/tests.c index 3272d668089c..52e1e9fdc77a 100644 --- a/regress/unittests/servconf/tests.c +++ b/regress/unittests/servconf/tests.c @@ -5,6 +5,8 @@ * Placed in the public domain */ +#include "includes.h" + #include #include #include From 41bb8c1823a337dca1b027a1e5c560f6a5fc4acc Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 2 Jun 2026 18:10:25 +1000 Subject: [PATCH 088/196] Add a single retry to VM package install steps. These are potentially flaky due to network issues, so hopefully this will reduce the number of manual retries needed. --- .github/workflows/vm.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index 667593a529e8..2aaab098060b 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -33,7 +33,7 @@ jobs: release: ${{ matrix.target }} usesh: true prepare: | - pkg install -y sudo + timeout 600 pkg install -y sudo || pkg install -y sudo pw useradd builder -m echo "builder ALL=(ALL:ALL) NOPASSWD: ALL" >>/usr/local/etc/sudoers mkdir -p /var/empty /usr/local/etc @@ -98,12 +98,13 @@ jobs: prepare: | case $(uname -r) in 12.*) - ftp ftp://ftp.sudo.ws/pub/sudo/sudo-1.8.32.tar.gz + timeout 600 ftp ftp://ftp.sudo.ws/pub/sudo/sudo-1.8.32.tar.gz || \ + ftp ftp://ftp.sudo.ws/pub/sudo/sudo-1.8.32.tar.gz tar xfz sudo-1.8.32.tar.gz (cd sudo-1.8.32 && ./configure --sysconfdir=/usr/local/etc && make && make install) ;; *) - pkg install -y sudo + timeout 600 pkg install -y sudo || pkg install -y sudo ;; esac openssl rand -base64 9 >$GITHUB_WORKSPACE/regress/password @@ -182,7 +183,7 @@ jobs: case "$(uname -r)" in 9.*) export PKG_PATH="ftp://ftp.NetBSD.org/pub/pkgsrc/packages/NetBSD/$(uname -p)/9.0_2026Q1/All" ;; esac - /usr/sbin/pkg_add sudo + timeout 600 /usr/sbin/pkg_add sudo || /usr/sbin/pkg_add sudo openssl rand -base64 9 >$GITHUB_WORKSPACE/regress/password pw=$(tr -d '\n' <$GITHUB_WORKSPACE/regress/password | pwhash) /usr/sbin/useradd -m -p "${pw}" builder @@ -254,8 +255,8 @@ jobs: prepare: | set -x if [ ! -x $(which gcc 2>/dev/null) ]; then - pfexec pkg refresh - pfexec pkg install build-essential + timeout 900 pfexec pkg refresh || pfexec pkg refresh + timeout 900 pfexec pkg install build-essential || pfexec pkg install build-essential fi useradd -m builder sed -e "s/^root.*ALL$/root ALL=(ALL) NOPASSWD: ALL/" /etc/sudoers >>/tmp/sudoers @@ -355,6 +356,7 @@ jobs: "20022": "22" usesh: true prepare: | + timeout 600 pkg_add git || pkg_add git useradd -g wobj -m builder echo "permit nopass keepenv root" >/etc/doas.conf echo "permit nopass keepenv builder" >>/etc/doas.conf @@ -362,7 +364,6 @@ jobs: chown root:wheel /etc/doas.conf chmod 644 /etc/doas.conf touch /etc/ssh/ssh_known_hosts - pkg_add git - name: fetch sysupgrade version run: | From 7e5590cf8ff732a946629b6f766c7a2c9b2ac425 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 2 Jun 2026 18:49:02 +1000 Subject: [PATCH 089/196] Replace shell-level timeout with dedicated command. It turns out the systems we run this workflow on all have timeout(1), --- .github/setup_ci.sh | 25 ++++--------------------- .github/workflows/c-cpp.yml | 4 +++- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index 22f0a6668a08..63c61f9a0f66 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -2,29 +2,14 @@ config="$1" target="$2" -retry="$3" - -timeout=3600 - -fail () { trap '' 0; exit 1; } -success () { trap '' 0; exit 0; } - -if [ "${retry}" != "retry" ]; then - echo Set trap for single retry with timeout at $timeout seconds. - trap "exec $0 $1 $2 retry" HUP - (sleep $timeout; kill -HUP $$) & - trap "kill $!; sleep 120; exec $0 $1 $2 retry" 0 -else - echo "$0: retrying" -fi PACKAGES="tmux" echo Running as: id -echo Environment saved to env.txt -set >env.txt +echo Saving environment to runner-env.txt +set >runner-env.txt . .github/configs ${config} @@ -84,7 +69,7 @@ if [ ! -z "$SUDO" ]; then fi if ! "$SUDO" -u nobody -S test -x ~ Date: Tue, 2 Jun 2026 22:20:44 +1000 Subject: [PATCH 090/196] Fix search for awk formatter. AC_PATH_PROG only takes a single binary to look for, AC_PATH_PROGS is what's needed for more than one. Looks like an error by me in 285546b. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index dcb4c327eff4..530c8e316fc7 100644 --- a/configure.ac +++ b/configure.ac @@ -60,7 +60,7 @@ AC_PATH_PROG([SH], [bash]) AC_PATH_PROG([SH], [ksh]) AC_PATH_PROG([SH], [sh]) AC_PATH_PROG([GROFF], [groff]) -AC_PATH_PROG([NROFF], [nroff awf]) +AC_PATH_PROGS([NROFF], [nroff awf]) AC_PATH_PROG([MANDOC], [mandoc]) AC_PATH_TOOL([PKGCONFIG], [pkg-config], [no]) AC_SUBST([TEST_SHELL], [sh]) From c9ebebb22fa50ca50bd036599028d7e09f841c3f Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 2 Jun 2026 21:57:42 +1000 Subject: [PATCH 091/196] Reformat setup_ci command line. This prevents setup_ci from running twice on Cygwin due to different parsing of the command line since on Windows it's run via Powershell. --- .github/workflows/c-cpp.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 1136f1e27c29..9d293d7bb0ea 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -140,8 +140,7 @@ jobs: - uses: actions/checkout@main - name: setup CI system run: | - timeout 1200 sh .github/setup_ci.sh ${{ matrix.config }} ${{ matrix.target }} || \ - sh .github/setup_ci.sh ${{ matrix.config }} ${{ matrix.target }} + sh -c "timeout 1200 .github/setup_ci.sh ${{ matrix.config }} ${{ matrix.target }} || .github/setup_ci.sh ${{ matrix.config }} ${{ matrix.target }}" env: CYGWIN_SETUP: ${{ steps.cygwin_install.outputs.setup }} - name: autoreconf From 65c6ac0a82f8bc3faf5a18fef36112fec1b54fc2 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Tue, 2 Jun 2026 06:18:27 +0000 Subject: [PATCH 092/196] upstream: refer to RFC9987 instead of I-D OpenBSD-Commit-ID: 6b273c50c2aa818b9144b8d9ab568c4239023297 --- PROTOCOL.agent | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PROTOCOL.agent b/PROTOCOL.agent index 2af749b30b7b..6dc75c05e47b 100644 --- a/PROTOCOL.agent +++ b/PROTOCOL.agent @@ -1,5 +1,5 @@ The SSH agent protocol is described in -https://datatracker.ietf.org/doc/draft-ietf-sshm-ssh-agent/ +https://datatracker.ietf.org/doc/html/rfc9987 This file documents OpenSSH's extensions to the agent protocol. @@ -104,4 +104,4 @@ A SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED will return SSH_AGENT_SUCCESS if any key (plain private or certificate) was successfully loaded, or SSH_AGENT_FAILURE if no key was loaded. -$OpenBSD: PROTOCOL.agent,v 1.25 2025/08/29 03:50:38 djm Exp $ +$OpenBSD: PROTOCOL.agent,v 1.26 2026/06/02 06:18:27 djm Exp $ From 7763a38bc2595be50baf1d72b19bf4720e41e8e3 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Thu, 4 Jun 2026 04:26:51 +0000 Subject: [PATCH 093/196] upstream: add signature malleability and pubkey validity checks to ed25519 verification (SSH doesn't depend on these properties) Pointed out by Soatok Dreamseeker Add an explicit-seed variant of the keygen function. feedback / "looks fine" tb@ OpenBSD-Commit-ID: 2a71926bfda24628cf34a88357f44a790e338d5d --- ed25519.c | 36 +++++++++++++++++++++++--- ed25519.sh | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 102 insertions(+), 8 deletions(-) diff --git a/ed25519.c b/ed25519.c index 2452dff0f62d..8f683a2c0f67 100644 --- a/ed25519.c +++ b/ed25519.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ed25519.c,v 1.4 2023/01/15 23:05:32 djm Exp $ */ +/* $OpenBSD: ed25519.c,v 1.5 2026/06/04 04:26:51 djm Exp $ */ /* * Public Domain, Authors: @@ -1912,13 +1912,13 @@ static void ge25519_scalarmult_base(ge25519_p3 *r, const sc25519 *s) } /* from supercop-20221122/crypto_sign/ed25519/ref/keypair.c */ -int crypto_sign_ed25519_keypair(unsigned char *pk,unsigned char *sk) +int crypto_sign_ed25519_keypair_from_seed(unsigned char *pk,unsigned char *sk, const unsigned char *seed) { unsigned char az[64]; sc25519 scsk; ge25519 gepk; - randombytes(sk,32); + memcpy(sk, seed, 32); crypto_hash_sha512(az,sk,32); az[0] &= 248; az[31] &= 127; @@ -1931,6 +1931,18 @@ int crypto_sign_ed25519_keypair(unsigned char *pk,unsigned char *sk) memmove(sk + 32,pk,32); return 0; } + +int +crypto_sign_ed25519_keypair(unsigned char *pk, unsigned char *sk) +{ + unsigned char seed[32]; + int r; + + randombytes(seed, 32); + r = crypto_sign_ed25519_keypair_from_seed(pk, sk, seed); + explicit_bzero(seed, sizeof(seed)); + return r; +} /* from supercop-20221122/crypto_sign/ed25519/ref/sign.c */ int crypto_sign_ed25519( @@ -1987,6 +1999,22 @@ int crypto_sign_ed25519( } /* from supercop-20221122/crypto_sign/ed25519/ref/open.c */ +/* + * Local OpenSSH addition: check that S < group order L + * Where L = 2^{252} + 27742317777372353535851937790883648493 + * This can be variable time as the signature is public. + */ +static inline int sc25519_inrange(const unsigned char *pk) +{ + int i; + + for (i = 0; i < 32; i++) { + if (pk[31 - i] > sc25519_m[31 - i]) return -1; + if (pk[31 - i] < sc25519_m[31 - i]) return 0; + } + return -1; +} + int crypto_sign_ed25519_open( unsigned char *m,unsigned long long *mlen, const unsigned char *sm,unsigned long long smlen, @@ -2002,7 +2030,9 @@ int crypto_sign_ed25519_open( if (smlen < 64) goto badsig; if (sm[63] & 224) goto badsig; + if (sc25519_inrange(sm+32)) goto badsig; if (ge25519_unpackneg_vartime(&get1,pk)) goto badsig; + if (ge25519_isneutral_vartime(&get1)) goto badsig; memmove(pkcopy,pk,32); memmove(rcopy,sm,32); diff --git a/ed25519.sh b/ed25519.sh index 9e6cbc9c312d..d24cdc0fcef4 100644 --- a/ed25519.sh +++ b/ed25519.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $OpenBSD: ed25519.sh,v 1.2 2024/05/17 02:39:11 jsg Exp $ +# $OpenBSD: ed25519.sh,v 1.3 2026/06/04 04:26:51 djm Exp $ # Placed in the Public Domain. # AUTHOR="supercop-20221122/crypto_sign/ed25519/ref/implementors" @@ -16,11 +16,12 @@ FILES=" supercop-20221122/crypto_sign/ed25519/ref/open.c " ### +PORTABLE=${PORTABLE:-0} DATA="supercop-20221122/crypto_sign/ed25519/ref/ge25519_base.data" set -e -cd $1 +test -z "$1" || cd $1 echo -n '/* $' echo 'OpenBSD: $ */' echo @@ -29,6 +30,12 @@ echo ' * Public Domain, Authors:' sed -e '/Alphabetical order:/d' -e 's/^/ * - /' < $AUTHOR echo ' */' echo +if [ "$PORTABLE" -ne 0 ]; then + echo '#include "includes.h"' + echo + echo '#ifndef OPENSSL_HAS_ED25519' + echo +fi echo '#include ' echo echo '#include "crypto_api.h"' @@ -42,6 +49,32 @@ done echo for i in $FILES; do echo "/* from $i */" + + case "$i" in + */crypto_sign/ed25519/ref/open.c) + # Include our malleability fix at the start if open.c + cat << _EOF + +/* + * Local OpenSSH addition: check that S < group order L + * Where L = 2^{252} + 27742317777372353535851937790883648493 + * This can be variable time as the signature is public. + */ +static inline int sc25519_inrange(const unsigned char *pk) +{ + int i; + + for (i = 0; i < 32; i++) { + if (pk[31 - i] > sc25519_m[31 - i]) return -1; + if (pk[31 - i] < sc25519_m[31 - i]) return 0; + } + return -1; +} +_EOF + ;; + esac + + nl=`echo` # Changes to all files: # - inline ge25519_base.data where it is included # - expand CRYPTO_NAMESPACE() namespacing define @@ -66,12 +99,17 @@ for i in $FILES; do sed -e "s/crypto_sign/crypto_sign_ed25519/g" ;; */crypto_sign/ed25519/ref/keypair.c) - # rename key generation function to the name OpenSSH expects - sed -e "s/crypto_sign_keypair/crypto_sign_ed25519_keypair/g" + # provide an explicit-seed key generation function and rename + # it to the name OpenSSH expects + sed -e "s/crypto_sign_keypair(unsigned char \*pk,unsigned char \*sk)/crypto_sign_ed25519_keypair_from_seed(unsigned char *pk,unsigned char *sk, const unsigned char *seed)/g" \ + -e "s/randombytes(sk,32);/memcpy(sk, seed, 32);/g" ;; */crypto_sign/ed25519/ref/open.c) # rename verification function to the name OpenSSH expects - sed -e "s/crypto_sign_open/crypto_sign_ed25519_open/g" + # Insert malleability checks + sed -e "s/crypto_sign_open/crypto_sign_ed25519_open/g" | \ + perl -0777 -pe 's/(.*if.*ge25519_unpackneg_vartime.*get1,pk.*)/ if (sc25519_inrange(sm+32)) goto badsig;\n\1\n if (ge25519_isneutral_vartime(&get1)) goto badsig;/' + #perl -0777 -pe 's/^(.*ge25519_unpackneg_vartime.*,pk.*)$/ if (sc25519_inrange(sm+32)) goto badsig;\n$1\n if (ge25519_isneutral_vartime(&get1)) goto badsig;/' ;; */crypto_sign/ed25519/ref/fe25519.*) # avoid a couple of name collisions with other files @@ -116,4 +154,30 @@ for i in $FILES; do ;; esac | \ sed -e 's/[ ]*$//' + + # Include implicit-seed keygen function used for ssh-ed25519 + case "$i" in + */crypto_sign/ed25519/ref/keypair.c) + cat << _EOF + +int +crypto_sign_ed25519_keypair(unsigned char *pk, unsigned char *sk) +{ + unsigned char seed[32]; + int r; + + randombytes(seed, 32); + r = crypto_sign_ed25519_keypair_from_seed(pk, sk, seed); + explicit_bzero(seed, sizeof(seed)); + return r; +} +_EOF + ;; + esac + done + +if [ "$PORTABLE" -ne 0 ]; then + echo + echo '#endif /* OPENSSL_HAS_ED25519 */' +fi From 37bf1431aa0f5e746f9ae0247f52da1e8b5758d6 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 5 Jun 2026 06:51:02 +0000 Subject: [PATCH 094/196] upstream: rename a variable to be more accurate OpenBSD-Commit-ID: bf277f2832125eb40ac2c9fa3ea66e31214f2131 --- ed25519.c | 8 ++++---- ed25519.sh | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ed25519.c b/ed25519.c index 8f683a2c0f67..553f2f3c9d9d 100644 --- a/ed25519.c +++ b/ed25519.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ed25519.c,v 1.5 2026/06/04 04:26:51 djm Exp $ */ +/* $OpenBSD: ed25519.c,v 1.6 2026/06/05 06:51:02 djm Exp $ */ /* * Public Domain, Authors: @@ -2004,13 +2004,13 @@ int crypto_sign_ed25519( * Where L = 2^{252} + 27742317777372353535851937790883648493 * This can be variable time as the signature is public. */ -static inline int sc25519_inrange(const unsigned char *pk) +static inline int sc25519_inrange(const unsigned char *s) { int i; for (i = 0; i < 32; i++) { - if (pk[31 - i] > sc25519_m[31 - i]) return -1; - if (pk[31 - i] < sc25519_m[31 - i]) return 0; + if (s[31 - i] > sc25519_m[31 - i]) return -1; + if (s[31 - i] < sc25519_m[31 - i]) return 0; } return -1; } diff --git a/ed25519.sh b/ed25519.sh index d24cdc0fcef4..1560b5efb289 100644 --- a/ed25519.sh +++ b/ed25519.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $OpenBSD: ed25519.sh,v 1.3 2026/06/04 04:26:51 djm Exp $ +# $OpenBSD: ed25519.sh,v 1.4 2026/06/05 06:51:02 djm Exp $ # Placed in the Public Domain. # AUTHOR="supercop-20221122/crypto_sign/ed25519/ref/implementors" @@ -60,13 +60,13 @@ for i in $FILES; do * Where L = 2^{252} + 27742317777372353535851937790883648493 * This can be variable time as the signature is public. */ -static inline int sc25519_inrange(const unsigned char *pk) +static inline int sc25519_inrange(const unsigned char *s) { int i; for (i = 0; i < 32; i++) { - if (pk[31 - i] > sc25519_m[31 - i]) return -1; - if (pk[31 - i] < sc25519_m[31 - i]) return 0; + if (s[31 - i] > sc25519_m[31 - i]) return -1; + if (s[31 - i] < sc25519_m[31 - i]) return 0; } return -1; } From 70d7044a966a541d9df6002fbeb62d005555cc78 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 5 Jun 2026 08:48:43 +0000 Subject: [PATCH 095/196] upstream: avoid truncation of pathnames headed to lstat() for systems where PATH_MAX is not the actual max; reported by sahvx655-wq via GHPR688 OpenBSD-Commit-ID: fcbeeff99d857f2f3916ad06570fa05fc38b0f07 --- sftp-server.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/sftp-server.c b/sftp-server.c index ed57339d5b13..156d5ece58c3 100644 --- a/sftp-server.c +++ b/sftp-server.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-server.c,v 1.154 2026/05/31 04:59:51 djm Exp $ */ +/* $OpenBSD: sftp-server.c,v 1.155 2026/06/05 08:48:43 djm Exp $ */ /* * Copyright (c) 2000-2004 Markus Friedl. All rights reserved. * @@ -1136,7 +1136,7 @@ process_readdir(uint32_t id) send_status(id, SSH2_FX_FAILURE); } else { struct stat st; - char pathname[PATH_MAX]; + char *pathname; Stat *stats; int nstats = 10, count = 0, i; @@ -1146,10 +1146,11 @@ process_readdir(uint32_t id) nstats *= 2; stats = xreallocarray(stats, nstats, sizeof(Stat)); } -/* XXX OVERFLOW ? */ - snprintf(pathname, sizeof pathname, "%s%s%s", path, + xasprintf(&pathname, "%s%s%s", path, strcmp(path, "/") ? "/" : "", dp->d_name); - if (lstat(pathname, &st) == -1) + r = lstat(pathname, &st); + free(pathname); + if (r == -1) continue; stat_to_attrib(&st, &(stats[count].attrib)); stats[count].name = xstrdup(dp->d_name); From e9916c44c1324ab9ab022719e4df08a390a83014 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 5 Jun 2026 08:53:07 +0000 Subject: [PATCH 096/196] upstream: pass >9 commandline arguments to the internal-sftp server, previously they were silently dropped; reported by Steve Caffrey ok deraadt@ OpenBSD-Commit-ID: ee6cd5430a3ca027c3223af54b58ad3cc7ccd624 --- session.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/session.c b/session.c index dee66598e4e4..fc9c9d6f88ff 100644 --- a/session.c +++ b/session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: session.c,v 1.349 2026/06/01 08:27:28 djm Exp $ */ +/* $OpenBSD: session.c,v 1.350 2026/06/05 08:53:07 djm Exp $ */ /* * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland * All rights reserved @@ -1607,21 +1607,22 @@ do_child(struct ssh *ssh, Session *s, const char *command) exit(1); } else if (s->is_subsystem == SUBSYSTEM_INT_SFTP) { extern int optind, optreset; - int i; - char *p, *args; + int sftp_argc; + char **sftp_argv; setproctitle("%s@%s", s->pw->pw_name, INTERNAL_SFTP_NAME); - args = xstrdup(command ? command : "sftp-server"); - for (i = 0, (p = strtok(args, " ")); p; (p = strtok(NULL, " "))) - if (i < ARGV_MAX - 1) - argv[i++] = p; - argv[i] = NULL; + if (argv_split(command == NULL ? "sftp-server" : command, + &sftp_argc, &sftp_argv, 1) != 0) { + error("internal error: can't split internal-sftp " + "arguments"); + exit(1); + } optind = optreset = 1; - __progname = argv[0]; + __progname = sftp_argv[0]; #ifdef WITH_SELINUX ssh_selinux_change_context("sftpd_t"); #endif - exit(sftp_server_main(i, argv, s->pw)); + exit(sftp_server_main(sftp_argc, sftp_argv, s->pw)); } fflush(NULL); From 47af21eb8d480c0f368a629ab58e31b993ed28f2 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Sun, 7 Jun 2026 09:56:41 +1000 Subject: [PATCH 097/196] sync fmt_scaled.c with OpenBSD upstream Notably picks up this commit: revision 1.24 date: 2026/06/06 23:49:25; author: djm; state: Exp; lines: +28 -12; commitid: oznzDs0MaUT3FEqO; rearrange scan_scaled(3) ordering of multiplications and divisions to better preserve accuracy for large exponents. From metsw24-max via https://github.com/openssh/openssh-portable/pull/671/ ok tb@ --- openbsd-compat/fmt_scaled.c | 39 +++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/openbsd-compat/fmt_scaled.c b/openbsd-compat/fmt_scaled.c index 87d40d2d38c0..9aa8ef23a9e2 100644 --- a/openbsd-compat/fmt_scaled.c +++ b/openbsd-compat/fmt_scaled.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fmt_scaled.c,v 1.21 2022/03/11 07:29:53 dtucker Exp $ */ +/* $OpenBSD: fmt_scaled.c,v 1.25 2026/06/06 23:53:59 djm Exp $ */ /* * Copyright (c) 2001, 2002, 2003 Ian F. Darwin. All rights reserved. @@ -77,7 +77,7 @@ scan_scaled(char *scaled, long long *result) { char *p = scaled; int sign = 0; - unsigned int i, ndigits = 0, fract_digits = 0; + unsigned int i, ndigits = 0, fract_digits = 0, muls = 0, divs = 0; long long scale_fact = 1, whole = 0, fpart = 0; /* Skip leading whitespace */ @@ -186,18 +186,33 @@ scan_scaled(char *scaled, long long *result) /* scale whole part */ whole *= scale_fact; - /* truncate fpart so it doesn't overflow. - * then scale fractional part. + /* + * Scale fractional part: compute + * fpart * scale_fact / 10^(fract_digits-1) + * without intermediate overflow. scale_fact is 1024^i, + * i.e. a power of 1024 = 2^10. Interleave + * multiply-by-1024 with divide-by-10 so the running + * value stays within long long range while preserving + * precision. */ - while (fpart >= LLONG_MAX / scale_fact || - fpart <= LLONG_MIN / scale_fact) { - fpart /= 10; - fract_digits--; - } - fpart *= scale_fact; - if (fract_digits > 0) { - for (i = 0; i < fract_digits -1; i++) + muls = i; + divs = fract_digits > 0 ? fract_digits - 1 : 0; + while (muls > 0 && divs > 0) { + if (fpart <= LLONG_MAX / 1024) { + fpart *= 1024; + muls--; + } else { fpart /= 10; + divs--; + } + } + while (muls > 0) { + fpart *= 1024; + muls--; + } + while (divs > 0) { + fpart /= 10; + divs--; } if (sign == -1) whole -= fpart; From 5ebfdf3afaede40b1f0f9b5874ba53bf9d21d6d5 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Sun, 7 Jun 2026 08:21:07 +0000 Subject: [PATCH 098/196] upstream: Import updated moduli OpenBSD-Commit-ID: c3081ccc6e4c1cb21e68c36f5a92e6d9f09e70b3 --- moduli | 1124 +++++++++++++++++++++++++++----------------------------- 1 file changed, 539 insertions(+), 585 deletions(-) diff --git a/moduli b/moduli index f5e0bba07354..3fba18bc7f99 100644 --- a/moduli +++ b/moduli @@ -1,586 +1,540 @@ -# $OpenBSD: moduli,v 1.41 2025/10/11 23:39:14 dtucker Exp $ +# $OpenBSD: moduli,v 1.42 2026/06/07 08:21:06 dtucker Exp $ # Time Type Tests Tries Size Generator Modulus -20250616002444 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626168803637 -20250616002455 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626168CECC1F -20250616002507 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261692C7353 -20250616002518 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261697DCA23 -20250616002520 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261698D69EF -20250616002525 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626169AA57DB -20250616002529 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626169CBB25F -20250616002546 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616A5307EB -20250616002549 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616A6385DB -20250616002603 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616AD0C40B -20250616002612 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616B10F7D3 -20250616002613 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616B182DC3 -20250616002615 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616B25024B -20250616002624 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616B689AFF -20250616002627 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616B79A1F3 -20250616002633 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616BA0CE7B -20250616002634 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616BA926E7 -20250616002638 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616BBF1327 -20250616002644 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616BEC119B -20250616002648 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616C0A4D47 -20250616002651 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616C1B6AAF -20250616002713 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616CCBE9D3 -20250616002747 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616DE70BB3 -20250616002755 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616E1C5B1F -20250616002802 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616E57586B -20250616002822 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616EFEC4AB -20250616002825 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F0CBA83 -20250616002826 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F133697 -20250616002834 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F526313 -20250616002835 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F56D8DB -20250616002838 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F63E88B -20250616002842 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F813C83 -20250616002843 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616F86C16B -20250616002854 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616FDC52CF -20250616002858 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62616FFB576F -20250616002914 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626170776DAF -20250616002919 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626170939C97 -20250616002920 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261709C6907 -20250616002954 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171B2A95B -20250616002958 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171CCCD77 -20250616003000 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171D0FA13 -20250616003002 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171E18997 -20250616003005 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171EE92B7 -20250616003006 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171F5ADB3 -20250616003007 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626171F9F0F3 -20250616003016 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261723F66A7 -20250616003019 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261724E9AAF -20250616003020 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626172573C83 -20250616003025 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626172798D8B -20250616003052 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261734F06E7 -20250616003103 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626173A507C3 -20250616003114 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626173FB9947 -20250616003118 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617416E49B -20250616003127 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261745F914B -20250616003136 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626174A4F763 -20250616003143 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626174D621A7 -20250616003153 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626175244157 -20250616003155 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626175304CEB -20250616003159 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617553F42F -20250616003209 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261759B7C0B -20250616003214 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626175BFA7AF -20250616003217 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626175D8110F -20250616003218 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626175D8BEBB -20250616003248 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626176C7670B -20250616003253 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626176E7934F -20250616003256 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626176FDC4CB -20250616003314 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261778C1A6B -20250616003318 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626177A40A3F -20250616003324 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626177CE451F -20250616003329 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626177F722EB -20250616003331 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626177FFB46F -20250616003336 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617822C973 -20250616003337 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617828C757 -20250616003405 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261790E9D67 -20250616003413 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261794E5533 -20250616003416 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA6261796529CF -20250616003430 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626179D66303 -20250616003432 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626179DCC057 -20250616003437 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617A0363F3 -20250616003446 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617A46B76B -20250616003455 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617A8D28A7 -20250616003502 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617AC41817 -20250616003503 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617AC8EBC3 -20250616003509 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617AF2AA53 -20250616003510 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617AF70D8B -20250616003522 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617B4FA6B7 -20250616003526 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617B69E4D7 -20250616003530 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617B8C1623 -20250616003541 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617BE325B3 -20250616003554 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617C48E047 -20250616003605 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617C9BBBC7 -20250616003611 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617CC7D78B -20250616003642 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617DC7164F -20250616003645 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617DDCEBBB -20250616003646 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617DDD5EFF -20250616003700 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617E532FAF -20250616003718 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617EE49D4F -20250616003737 2 6 100 2047 5 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617F78544F -20250616003745 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA62617FBBF7FB -20250616003759 2 6 100 2047 2 EE0FE3E5743174100BD44FCCF81A0B0C184789558AC0B35400ED73B9EFEEFFED3075997428479CAC425A827BBC69DB6C3DD2DFD508472073700893CE2B48F7A69CD9FB1D7C12FECB37E9A6928B3A3F80D1DBC0BAAB33AD37738E36CA83D3916529F1210294618DF754F1AD7BEA0A224CA3F771C18E2A9B9326F9AE725FFCCE244C2DA3435599DA41FF9C434DBB1302A6E9925E4F3BAAD3717288B312F1ACE0117E54AABAABFD113C3A722BBDCD26A7767371FF56CCD572A3F91006BE91C72B3FFEB235FAA91338B9A191845846FCEAFA179B059A13C158530E107E284E6CA2D63C002E2F6734CC9DBA05036F193D2D6F508CFCBA899512AD42CA626180295803 -20250616024900 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE52FE1D8983 -20250616024916 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE52FE5187AB -20250616025426 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53015B738B -20250616025613 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5302B72663 -20250616025652 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53032B6AB3 -20250616025739 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5303BCB52B -20250616025750 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5303D8B5E7 -20250616025804 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5303FF3613 -20250616025808 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5304041DF3 -20250616025813 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53040D42B3 -20250616025942 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5305308573 -20250616025956 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5305566ACB -20250616030027 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5305B57B5B -20250616030040 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5305D951BB -20250616030126 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53066DC43B -20250616030131 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5306792277 -20250616030407 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53087BB3C3 -20250616030439 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5308DA22D7 -20250616030457 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53090CC43F -20250616030623 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530A10BF03 -20250616030625 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530A12A4A3 -20250616030728 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530AD1C937 -20250616030747 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530B08F417 -20250616030753 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530B149E1F -20250616030835 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530B97C463 -20250616030917 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530C17195B -20250616030941 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530C5E29EB -20250616031012 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530CB69887 -20250616031047 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530D1B2B3B -20250616031102 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530D42691B -20250616031119 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530D6F09B7 -20250616031345 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530F453A3F -20250616031437 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE530FE6A46F -20250616031522 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5310725CA3 -20250616031526 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5310796467 -20250616031630 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531145D673 -20250616031744 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53122DAB97 -20250616031748 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531235DC5B -20250616031828 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5312B5048F -20250616031908 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53132F33C7 -20250616031911 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531334BD6B -20250616031947 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5313A1C823 -20250616032023 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53140EA06B -20250616032050 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531463930B -20250616032110 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53149D1AE3 -20250616032205 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53154763FB -20250616032225 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531582AC17 -20250616032243 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5315B3627B -20250616032250 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5315C62473 -20250616032257 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5315D6A113 -20250616032301 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5315DA6E1B -20250616032456 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53174EA23B -20250616032613 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5318454747 -20250616032619 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5318518CE3 -20250616032621 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53185266F3 -20250616032705 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5318DB30D3 -20250616032722 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53190CF753 -20250616032801 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531983C403 -20250616032827 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5319D4832F -20250616032843 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531A0401AB -20250616032854 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531A1F94AB -20250616032858 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531A26B47B -20250616032930 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531A86BE9B -20250616032934 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531A8B9B23 -20250616032956 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531ACEECF7 -20250616033009 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531AF0B31B -20250616033016 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531B028B8B -20250616033036 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531B3D86EB -20250616033049 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531B65D127 -20250616033115 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531BB41F3F -20250616033140 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531C01336B -20250616033207 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531C54135F -20250616033259 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531CF6B74B -20250616033308 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531D0E1EF3 -20250616033331 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531D5478CB -20250616033419 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531DED6323 -20250616033601 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531F31D043 -20250616033611 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531F48BD03 -20250616033701 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE531FEA1EFF -20250616033825 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5320F3FBAB -20250616033938 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5321DD2153 -20250616033959 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53221A5443 -20250616034137 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532357E1EF -20250616034150 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53237AE35B -20250616034211 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5323B7E21F -20250616034317 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532486893F -20250616034324 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532496A2F7 -20250616034453 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5325B5FF2F -20250616034508 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5325DFBD83 -20250616034516 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5325F4BEAF -20250616034538 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532632A773 -20250616034604 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE53267F3C1F -20250616034646 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532703CCAF -20250616034920 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE5328EDA0EF -20250616035201 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532AF8A223 -20250616035247 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532B864D0B -20250616035259 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532BA3AD6F -20250616035343 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532C2F66F3 -20250616035404 2 6 100 3071 5 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532C6CBB1F -20250616035550 2 6 100 3071 2 CEDC89F91D5B5F3DAC95CBCC930B48068AE6149F5DC88374E503625E4B5236F2C65319DAD0D0B6A82BF7F41B255248306E71D51F9E2869885B39DACBD5222ACDFDDF290C21129701015D6F2AFED9904454BA15479CC4E819311C27F83CAAB9C8C4B3572489C94167DF92ABDEBD8D738411446904D2FDC1C02A38320CC5FA7EFAD66C787B5D76754F9858490E0CEB18DB7845B8C685D78414BE438E08FE7151AF55E234E9808986E342B8ADD40797D4EE8453C5F18A1AADCF026E6A148BAFC2874A8BEBA0E675861B3EC122FB3A0ECAB6BBA1B322D86026F843B459B8B89423117C7FFC47A922EF3AA3C3EA40885D9F2E94D6E87C0C578655F38FC53389B5356DE343BD142253CEBCAFC014D1F22B6F50018BEA27F05DB691B65C10C4F3C7E23E860D537276851B30257F206233CA2F67E6F96D2BBE5C58A22ADF5F84E804273E3B6B4A7B57F78324A3ACCCA14F9F5F2E1C6E24B20CBB1DF11A6C7B64DE5AA16E460C646507CD5BA015ECAB525DE328579EF6E20EFF8829E31049AE532DC5FC83 -20250616025251 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0AAACEB7 -20250616025500 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0B703A67 -20250616025644 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0C098BAF -20250616025822 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0C9F6593 -20250616025947 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0D1C3E97 -20250616030000 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0D2AE36B -20250616030055 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0D7B87EB -20250616030200 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0DD7FA2B -20250616030339 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D0E70A8D7 -20250616031225 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D119395BB -20250616031921 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D141530E7 -20250616032156 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D14FF9A9B -20250616032638 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D16BBC31B -20250616032926 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D17C00207 -20250616032959 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D17ED9CB7 -20250616033143 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D188B3F2B -20250616033239 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D18D93D7B -20250616033406 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D195811AF -20250616033432 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D197A3F23 -20250616033615 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1A164913 -20250616033743 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1A9B44E3 -20250616034059 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1BCEF6E7 -20250616034148 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1C136A53 -20250616034236 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1C5441E3 -20250616034337 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1CAB3D9F -20250616034506 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1D3741AB -20250616034604 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1D8D2B83 -20250616034629 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1DABAEFF -20250616034737 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1E0E748B -20250616034755 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1E214BBF -20250616034809 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1E33125F -20250616035026 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1F01594F -20250616035037 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1F0BD763 -20250616035313 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D1FFD9B1F -20250616035402 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2044014B -20250616035437 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D20733A13 -20250616035449 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D207F63BF -20250616035530 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D20B97BAF -20250616035709 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D214FA723 -20250616035859 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D21FB8CD3 -20250616035947 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D22419713 -20250616040250 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D23574D73 -20250616041101 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D265B4043 -20250616041134 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2688243B -20250616041233 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D26E075D3 -20250616041313 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2717FB07 -20250616041513 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D27C50567 -20250616041521 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D27C7F1FF -20250616041543 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D27E425BB -20250616041613 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D280BE63F -20250616041750 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D289E2F63 -20250616041811 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D28B7A6AB -20250616042211 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2A30F7BB -20250616042216 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2A31526F -20250616042440 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2B142177 -20250616042937 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2CF2463F -20250616043203 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D2DCED4A3 -20250616044015 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D30DE8723 -20250616044102 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3123CD73 -20250616044318 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D31EC950F -20250616044447 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D326D5903 -20250616044737 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D33780D73 -20250616045055 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D34ADF7BB -20250616045513 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D363FBDB3 -20250616045709 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D36F8CB13 -20250616045917 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D37C1BF97 -20250616050232 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D38EF2887 -20250616050404 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3978CA43 -20250616050547 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3A18F2FB -20250616050558 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3A207793 -20250616050630 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3A4A78B3 -20250616051043 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3BCF05C7 -20250616051341 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3CE19A73 -20250616051541 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3D96A783 -20250616051610 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3DBD0F4F -20250616051630 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D3DD597C3 -20250616052534 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D412B8027 -20250616052644 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4191D41B -20250616052653 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4197FE0F -20250616053049 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D43097AFB -20250616053247 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D43BB9F6F -20250616053318 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D43E4F583 -20250616053536 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D44B73D53 -20250616053606 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D44E1EE3B -20250616053755 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D45876E0F -20250616054222 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4726EF6B -20250616054241 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D473B5563 -20250616054858 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D498E3BAF -20250616054917 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D49A569F7 -20250616055026 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4A0F8DAB -20250616055148 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4A8B902F -20250616055232 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4AC9177F -20250616055323 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4B1157AB -20250616055559 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4C06056B -20250616055943 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4D5F3253 -20250616060324 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4EB4258B -20250616060456 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D4F406FC3 -20250616061112 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D51930143 -20250616061754 2 6 100 4095 2 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D5404A0F3 -20250616062045 2 6 100 4095 5 ECFE2345925613E912C05977A53B7FFB53C9CC5F153ABC4B86FB6EE484FCA6EFA4FB6A21A07984A885B16B8316BD30007D0AEB805E960C0BDEB0AC4D7941E9299071B2FD8E29936EEF604963DAFF758B79326DBA0F875C5A1BA26AA7841135758235A4359130BA4B50FD05921D6FCE4CB46FC7DCCF7374DF61ADFEE13BCBA269AD82F379279EE9DA30F1ECBC59DA3EE072F08E278ED59107BB38429BD020383A1316B5B6505D98D4DE55935F8AB9D65316491BE5E104CF7B004878D04D839278D373C65211EA91E774246B33F98066C95B959127EB03D9B0C4BFB141E61E0C57741E18A1D69DABE678FFBDAF384FC7E8546CB032DEA833E4FAF2A2BB965364566AD5591E56FB54C6CF10D4DBB0C0B01EA5EE17043A8B033BF3C0209EAA6CADD9CECCA503F6DF31382411C32100DC16D2C92682A0EA02CABB44ED418BC92D906343799C77AEA661123BB1A304ED9CAAB8CF2D27FAEADB5B723562B164C0C7636EEA2C70A2544967B5087CBBE6EEB7B69B7CF00E45543FC6A5E611A0476D310EFB400FD7280CB984C4F61A808311351C685957BD311052FE647A84F82EDFC9FC0F8A7ABDA3ACB06084EA82B761F99FE4A5DA7C6E95C4346447A3BC816C29734DFABE2451087D44A605365B38F19F8C47581E0415D7CB67F2FF045AB8C6F4589768E065CB5611C93FD7D10FC57C082B7A7D6FFBC9733264354EB8AB2F1D550D543F -20250616031848 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABCFEBCFD5B -20250616041123 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD054A326B -20250616042441 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD06E7D59B -20250616042612 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD07106BD3 -20250616043534 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD08355803 -20250616043924 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD08A63293 -20250616044633 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0982DEEB -20250616045128 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0A19FE5B -20250616050534 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0BD5F123 -20250616051248 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0CB284DF -20250616051744 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0D4576E7 -20250616052615 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0E4EAA4F -20250616053024 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD0EC9F933 -20250616054931 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD112C869B -20250616061023 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD13C0FA33 -20250616061103 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD13CF073F -20250616062941 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD16121F27 -20250616063708 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD16F3763F -20250616065251 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD18E600CF -20250616065656 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD1961739B -20250616070508 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD1A63040B -20250616071147 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD1B2EB503 -20250616072730 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD1D19F2FF -20250616075823 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD20E7E04F -20250616085003 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD274EB153 -20250616090823 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD298EF107 -20250616090942 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD29B0BD37 -20250616091953 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD2AD9C44B -20250616092428 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD2B623263 -20250616092837 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD2BDBD627 -20250616093520 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD2CA7968B -20250616093745 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD2CEA82B3 -20250616100958 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD30DEC413 -20250616104346 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD34EE8193 -20250616104422 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD34F86857 -20250616111013 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD3825D493 -20250616113910 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD3BAD9997 -20250616115912 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD3E1DEE1B -20250616121039 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD3F7A2C5B -20250616130700 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD46657F43 -20250616131547 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47787287 -20250616131819 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47C09A53 -20250616132017 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47F6C84F -20250616140437 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4D750693 -20250616141233 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4E6BD827 -20250616141414 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4E9887C3 -20250616141602 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4EC7148F -20250616142052 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4F592B73 -20250616142305 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4F9896B3 -20250616151719 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD5631119F -20250616152331 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD56EC431B -20250616154044 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD590666B7 -20250616155712 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD5B10CB97 -20250616160048 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD5B7B673F -20250616170503 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD6377E0DF -20250616170926 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD63FDBC83 -20250616171549 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD64C3C247 -20250616171931 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD653018DB -20250616175241 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD69541097 -20250616183731 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD6EE1B19F -20250616184010 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD6F2D909B -20250616184304 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD6F839987 -20250616190140 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD71C69267 -20250616190401 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD720797DB -20250616191520 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD73692CE3 -20250616192842 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD75053C7B -20250616194857 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD7782C27B -20250616195918 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD78C5964B -20250616200557 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD799219DF -20250616203649 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD7D732CE7 -20250616205237 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD7F5D63A3 -20250616211219 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD81D243C7 -20250616211808 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD827D9623 -20250616213202 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD8429B4CF -20250616214429 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD85BA7CCF -20250616215347 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD86DADC7B -20250616215504 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD86FBFAC3 -20250616215846 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD876E6177 -20250616221047 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD88DF6D3B -20250616223829 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD8C566667 -20250616224259 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD8CE0DE5B -20250616231230 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD908DA493 -20250616232834 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD928EEF7B -20250616233319 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD931E7A6F -20250616235722 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD961D984F -20250617002544 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD3F7A2C5B -20250617012034 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD46657F43 -20250617012906 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47787287 -20250617013133 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47C09A53 -20250617013329 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD47F6C84F -20250617021654 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4D750693 -20250617022440 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4E6BD827 -20250617022615 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4E9887C3 -20250617022801 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4EC7148F -20250617023244 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4F592B73 -20250617023455 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD4F9896B3 -20250617032739 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD5631119F -20250617033339 2 6 100 6143 2 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD56EC431B -20250617035013 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD590666B7 -20250617040630 2 6 100 6143 5 E14CB0AD6B03109962790668D317CC69BC29BB96941F75C9BB739C214F83ABACC6508E89C92108C3C075AC60830A996E6A5758E76CCE93C18627A18E951FF26DD53CB94D1348BD062C835177EF5B07353F9AC7D5874D78B3E215C4DC54A8E8F0A3D97705390A53050F25C75E944A4AF84803830492006104387892A78ABBCE80E7950A1B4F59D79AD867DF6DCFD7E23046774C0E28FD907F37F5EE9EF6D9F593DF94313E725D9EE35C57DBE177FA3027AE4BF30C4509333CCBE98DF2E251710A4B899C6C42CA499A8D2657FDC1A82945C74776AC859665175FD8F1DCB16C7B22D455E584DB02B3A95AF9A88126CE3634570A6968DB2654254A030B2F8A133E49F6EAFCD8015FF22D7C622026D6D6FA63BEFA7237C5EC05B7DF99A5854D4792683B454F0ECD52EF41266A550595594556AE969EE307915AC40FA9C551379F2C485A1D53F9C960CF9262A8AD681CFF53EE2D0E208E3DDAFC7C6C82271E0890745579C906BA77716E593D29C5B15F0C18E616BCA698BE676918697281730E0DAF112EE5B763906FC0A373EC15915202FB96241F26AAB0D77DA4357CB2B0C3101F3DB88B5D3AB4497C21377DD543BB422C12CF4E18861AE40924DC2D9AFCCDA500FCFA693288B5DD73216515ECCB12D0400D19BB27E50D3C3183BEA9C113B5A553F9704962FD4BC8510D930F32061EABEC7FC2C1CE32CA6297F5BA8DB6E4B6AEB755A07EF153C51BF7C07A827F43FBFDD4D5136187533FB6155535A9369C5776BDB22D1BE141316CA5DF6704FF2F970C070F6EA37678258683DEDF45056F127C5819E59F2A94680CF651EA983632EA91F47BF80B6D725ADD1E5795884239C5877E753C374266DFD973C414587074750852A5397A7FAC047152100F29AF82E7B2DA89DF3248CAA2B3DF71C4912989A4A660F8DF46155229B4AAF59789ACF49B0021CF015C59D97DE13B91EEA8BFAD9CA6699C59CF385C40F9FC38263207A46505D76DE443A3C2A7BEFB5E5A1040337F50D569F529D885CD651A87100B4634EE7A6F0D5C607E894E1475434F56DC62B016C73C07AE7A716B55F0AD0F399ABD5B10CB97 -20250616035607 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85826297803B -20250616042133 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582643F4617 -20250616052001 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858268210533 -20250616054850 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85826A097C53 -20250616080903 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858273567FDB -20250616093015 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858278B0E5BB -20250616103728 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85827D1D4113 -20250616111218 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85827F657FAB -20250616112833 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858280648FFB -20250616125341 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858285F47EEF -20250616135204 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858289C8483F -20250616150327 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85828E80E33B -20250616161704 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582936A88E3 -20250616170843 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858296D09663 -20250616174557 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858299434467 -20250616185934 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E1EAFA3 -20250616190202 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E3F6D2B -20250616202814 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A400B97B -20250616210901 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A6B686D7 -20250616212925 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A805594B -20250616232503 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582AFB7787B -20250616235406 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B19E791F -20250616235513 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B1A8E57B -20250617002853 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858289C8483F -20250617013846 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85828E80E33B -20250617025103 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582936A88E3 -20250617034223 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858296D09663 -20250617041923 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858299434467 -20250617053144 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E1EAFA3 -20250617053409 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E3F6D2B -20250617075210 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85826297803B -20250617081717 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582643F4617 -20250617091509 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858268210533 -20250617094347 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85826A097C53 -20250617120252 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858273567FDB -20250617132226 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858278B0E5BB -20250617142749 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85827D1D4113 -20250617150158 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85827F657FAB -20250617151822 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858280648FFB -20250617164140 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858285F47EEF -20250617173833 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858289C8483F -20250617184837 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85828E80E33B -20250617200056 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582936A88E3 -20250617205150 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858296D09663 -20250617212820 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858299434467 -20250617223953 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E1EAFA3 -20250617224217 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85829E3F6D2B -20250618000646 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A400B97B -20250618004650 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A6B686D7 -20250618010652 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582A805594B -20250618030037 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582AFB7787B -20250618032918 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B19E791F -20250618033024 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B1A8E57B -20250618042330 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B53C775B -20250618045322 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B7440A97 -20250618052359 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582B954EBF7 -20250618055947 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582BBB8C053 -20250618070614 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582C035FFE3 -20250618072936 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582C1B7AD67 -20250618073924 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582C2551963 -20250618081151 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582C480076F -20250618091411 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582C8B7648B -20250618104754 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582CEFBD56F -20250618114039 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D2828D6F -20250618121547 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D4D953FB -20250618122123 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D533E9B3 -20250618123407 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D608F5D7 -20250618124634 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D6DB3867 -20250618125907 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D7B0E9A3 -20250618131722 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582D8E5433B -20250618154711 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582E318E597 -20250618161518 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582E4FC61FF -20250618173320 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582EA4C196B -20250618181001 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582ECCDA5AF -20250618182405 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582EDB674CF -20250618185052 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582EF76E9A7 -20250618205008 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582F7986EE3 -20250618212939 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8582FA3E17BF -20250618235642 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858304421B3B -20250619002145 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858305ECDC73 -20250619004148 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8583074F20CB -20250619005851 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858308581EC3 -20250619011346 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858309471D47 -20250619020628 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85830CCF0183 -20250619024424 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85830F5F31F3 -20250619033602 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858312D48B7B -20250619043748 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858316F99C53 -20250619050309 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A858318AA26EF -20250619053830 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85831AFC8263 -20250619063025 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85831E74A76B -20250619063819 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85831EF74217 -20250619064710 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85831F833663 -20250619082314 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8583253C251F -20250619082850 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8583257F0853 -20250619090252 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A8583276E0493 -20250619095319 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85832AA1D0AB -20250619111645 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85833035388F -20250619143826 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85833DC506AB -20250619144408 2 6 100 7679 5 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85833E1EBFA7 -20250619144618 2 6 100 7679 2 EEB5FE98B7CF15B438162A5F2DEBBAB8BCF08B8A2614E263AA570052D2B01AC3E0B943491218DF247DB063E7DAECD19D0CD00C65335041AC9D3E4B8493CB58F9CBB166E38FF5E8697EF59D9EE4FAC6415070E0156AF8DA6BE11D672AA9A8E71033936AF75D835CCDBB0ED13CB17CBF9C9D98DEB4FAAD874FCD0929E86CF411426A3A96CED22F7EDC5F7E8D3A3B860F91E3FE92623F97C15EF13921C6AE6B3A566C7E42F46EF7B9721A09D10BEE52CE93694F6EF85F362D90239C4066C8FFFA6C6CCBAF59DFE083B248BF313F2A9D3EF96ACF569CA1B05FBDEFBD4A52C854C7B71AAB2B8AEAF8BFA8F283851E4CAA76F7D155939555F09830E49F38E73A7AE48B489883CA0D96A59B3560A8DF02DC0A0E5B6AD0AFD445B54F5580F4D962D8156DB6A0F70E5E4E47CF3CF9E1281180F5BC90B5C6FCB2DEFF1BD985D405BC3A138700D75D9BAEBBD1A7496F5CD1E6E6D5C0325B89E120A0994AFF0F35741DDC17A7D7C19A818A6C3DB5874B0E78B2BA319C6D4F850762EC32005074492723FAD2876E1C8F9A318852E97F6B28706F67ACAB944E8CFCA7C6A47C0D2F9B6907713CFFE21DEB070F45BAC19828094C424A445440ADF79E925BFE0BE687E82751D9ACBDDA02A6FACD4FEC77EEB9CD32A265B67ABFF9CF22E7EE68DCA133109BD7515B0002A9D4DEF5E3B190CE0E5C8EE2BF18F6176CD47DC00C87CD5CFBADC9D3085DAE39ECC4B320C4AE130E62A03FA4E321F0CDA4844551140DAB5658F27B2A1884BA1B039F25AA1E386BBE9C0BB3906880E46A22D2F9F9C1A7943BC1D71E45A9E6FF4828196192B4063650EAC50555E53516BF4D816888C1E7841914862FA5F82181204155ADCD7652D4B3F8CB0CDFF69BC897FEE50C420A6243059B742171BBC5C94BC6AF23AE90F0DE756DBC1027E3F92EE866A669054CC133A685AE21A51478A305851308220705E0E38D97BD62A8B07047594266DEE3414D3D6C0659C4A8DB9484B86E0638ED13499E7B58030881991FD4E83B61AD429E4276DE69DB74677F16A1EB6D5D3756CB7074B312DDA5679C4E85720ECA7B738F4556BCAADD307D4A2F29158CE326F55CCDEB8755BABC2F7F8DE3F8B19C786D4219E9C45CB9FC7BAD2C5EE5984A392E2AC541662C4552CDB981BB65FE4A28FD19B1A472015BB45AB351F0CF6A9FD756EF6471794E08AB5A7092E0657F873133A0FEB2882251B80D08FC475EB43173F6A9F34787A67B282BB86FB559D883FDE93F10CCA73EA0ECC232CA1B719A98E0280CEAC5338550DBAE750E388F6671F8552A4FEFEDA1190DA60909A797336785C8C7BE9C233CC33F86818D1686C9558C900553F19A85833E3B9B63 -20250616030759 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F355CA78B -20250616040000 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F3838355B -20250616041144 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F38D7F49B -20250616050424 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F3BBD0A5B -20250616052304 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F3CBEA257 -20250616061654 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F3FACE56B -20250616075926 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F454D7B5F -20250616081144 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F45F6C43F -20250616090044 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F48A7A38B -20250616122407 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F53BFE9BB -20250616142400 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5A4DBBAF -20250616160108 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5F8C5217 -20250616193743 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F6B909527 -20250616213952 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F72566C2F -20250616232936 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F785F050F -20250617022031 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5A4DBBAF -20250617035521 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5F8C5217 -20250617084531 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5A4DBBAF -20250617102034 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F5F8C5217 -20250617135507 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F6B909527 -20250617155752 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F72566C2F -20250617174609 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F785F050F -20250617185010 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F7BE9453B -20250617203518 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F81D8D1BF -20250617221016 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F872F0C47 -20250617224617 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F89296483 -20250618022226 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F955CABCF -20250618025323 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F971B858F -20250618025845 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F976024CF -20250618031117 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F980C128F -20250618050316 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93F9E572DB3 -20250618054129 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FA0770223 -20250618054813 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FA0D14BEB -20250618061719 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FA267BBE3 -20250618064955 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FA436E453 -20250618065418 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FA46BE9D3 -20250618091516 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FAC5A7C77 -20250618094924 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FAE3F83CB -20250618115905 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FB57652DF -20250618130037 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FB8EDA617 -20250618132027 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FBA050653 -20250618141430 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FBD161D4F -20250618141922 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FBD51B563 -20250618142521 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FBD9DAAA3 -20250618155406 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FC2A05D13 -20250618171641 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FC74EF183 -20250618171856 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FC769295B -20250618181022 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FCA4F6A13 -20250618202914 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FD226B033 -20250618220927 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FD7DA67EF -20250618224256 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FD9B5DB6B -20250618232600 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDC16AAB7 -20250618232719 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDC210A83 -20250618233147 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDC59DC33 -20250618234218 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDCEE4BE3 -20250618235527 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDDA3E65F -20250619001532 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FDEC67F03 -20250619021548 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FE56B64F3 -20250619022245 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FE5CF6A53 -20250619050955 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FEF3B127B -20250619055851 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FF1FBE17F -20250619061510 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FF2DEEC33 -20250619062630 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FF376CBEB -20250619062934 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FF39994E7 -20250619075919 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FF8440A8F -20250619100929 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED93FFEB8B7A3 -20250619113103 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED940033A057B -20250619121235 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94005794C2F -20250619123456 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94006B2B897 -20250619124527 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94007401FAB -20250619143042 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9400D0E145B -20250619161110 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94012944667 -20250619180616 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94019090B9F -20250619182713 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9401A2D7303 -20250619200425 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9401F9624E3 -20250619202406 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94020A68B53 -20250619224804 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94028B6619B -20250619234955 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402C389D97 -20250619235705 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402C96896B -20250620000401 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402CF2980F -20250620001146 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402D572997 -20250620002229 2 6 100 8191 5 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402DE7288F -20250620004426 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED9402F1E827B -20250620013315 2 6 100 8191 2 DA1E367F51064DE37C61DF292F64D691D584C03B41D0D878E4EAA25ECE0D922818300E39D15F259EB25F466620B3BAA5A1BB314488CD6BC2BA17B82542CE832E02410CEB2C6619BD5358D1C0898F91777C76CE47507DAC5DCE417ED74BD7D816447C06A59051E5F70EEEF96BEBFC70752E26A3507DE5B89B66548A4AC87BA678064ECC851356306BAC0AF3189C284C5D2AE4E624552B2DC83705CB320D3AD9445D569486A6B80B05BBD2C55E8E085A25F422F2FACF52B33ECCA626BE5EC2283FF401D937B3FBE49527D233C8E7187E0A85AC04871CCE580067BDD5C687285C5DA0A930B05AF96DD44CA6F2935C7398251CA9DB735069F88DE6CE2423B6A334DA2CC50AFD2A29C1B5CA7785CCEFD856B39B87666AE368996CEBCC3999562434DA299C1856EDED42DF3F92B122957175296F115C0D6FB214B13EA5616DC9597768FBFF08E2B6BAF5619C078E11F7EEFD8C90459F155305DA5854EE326490AA8D6A9403A62031E890881AD2FDF1855A7BBD6591AD2D1C85EF1270BD1EAFC5EF58336EF37155421222DE87045709F2590250E6CB893DA415E0C1ECFD856544C1100EC71541721C6632CF5A2698A4F8A831414D9DF21B5DB664FCE613BE362C2851DFA14997AF54C9DE6EC79A402060A379C2706BBCE05D192FEDF9C3E6838E6D7B5B8B16D08AE01A5A614CD41CDC6D2EF81CAB6A6C66F2DFE62DFF99F50BBD74E2D1C6F301F84F8DE83952023A2B06FA5391082EF6A4AC7DBFEBB48F0572B6C08FD390EF30D75B6E442D273A6C248A49CE291B55B7E820685541EEE2AA7EBAFAA9516A5EFAB4F41F81347829956522C44DAAC5727E7BFD9DE81493069497D3092E4F36597EE35142629CB3B64750964CEFAB2916B51C507C48DEB6DC62681ED8AEB4F29A3D82D2C20C54153C874F090C9DB8112A6F4F279E22D6CF17C6230963B7A46AFA77195B4CB982D00F351BE4ACBF3B721EF95CDEEF56A3DFF16503BC9B1D1094131DD3CE3DEED0F579EBDD35308FCEB3877F06AE591875236F79608699CBA67B50D6540955D5BEE1CD0A24C175056ABE9C3A93E6EEECD21B60E8BD2F4E73C7385BC35F210E4E29AD2D957008C9BC985B5AB5942E506C3EA2C66BED0811BED5D7CC8CAC13AF701555F6C3E36A21C5BE052E01916B3A22D315ED4824F310D540AD1FBE4A2EF695F507175B4B91D0B3E8C970038700BB5147FC461641858AE21BEB4DDA61A7BE98419001223F4754A4A67CEE4683DDC1094BC2843ED5C95A4769C85450141E1EADF6A611D5E9B8C3A621D94BE0E2965F8309CDDEE5BDDACF9BA41097CBF50144E5E50BF17BE66C8C5F201B007BE42D52A7B65A37E288AC425AC7FD16D059B95EA1EDFFD361F717FEA5F1586459FF2218652DAFB69511B3551CCEF1417ED578B083C92C58AAEF2BE45C24A9877E2261E51A26D69ED94031D70FAB +20260511084302 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E851DEBB +20260511084318 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E8CDA50F +20260511084322 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E8E7805F +20260511084334 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E94028EB +20260511084337 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E9505B93 +20260511084339 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E95A061B +20260511084340 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E95BA34F +20260511084342 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E964EDA7 +20260511084351 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052E9AC0DDF +20260511084409 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EA355D93 +20260511084417 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EA69CB33 +20260511084426 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EAAF511F +20260511084431 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EAD498C7 +20260511084447 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EB48A09F +20260511084451 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EB5D719B +20260511084452 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EB5FF503 +20260511084458 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EB9013DB +20260511084503 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EBAB5767 +20260511084504 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EBB15B27 +20260511084514 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EBFFBC17 +20260511084531 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EC843A6B +20260511084534 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EC97F50F +20260511084545 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052ECE6901F +20260511084552 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052ED1971BF +20260511084554 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052ED209567 +20260511084557 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052ED3552FB +20260511084558 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052ED37ACB7 +20260511084612 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052ED9E9FDB +20260511084619 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EDCC8513 +20260511084627 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EE0829AB +20260511084630 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EE1858F3 +20260511084637 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EE4986F7 +20260511084649 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EE9F8F2F +20260511084651 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EEA9F6DB +20260511084655 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EEC54913 +20260511084701 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EEEFE82B +20260511084717 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EF65796F +20260511084728 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EFB3FB6B +20260511084729 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052EFBB6893 +20260511084741 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F00BAE93 +20260511084754 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F06D30AF +20260511084758 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F081BABF +20260511084800 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F08CAD2B +20260511084814 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F0EE3FEB +20260511084819 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F10E456B +20260511084829 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F1593833 +20260511084904 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F26E90EB +20260511084916 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F2CC1023 +20260511084921 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F2E9B9CB +20260511084922 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F2EBAD03 +20260511084927 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F30CA733 +20260511084930 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F322EC3B +20260511084932 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F32B7783 +20260511084950 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F3B9BE77 +20260511084957 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F3F3C437 +20260511085004 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F42127EB +20260511085025 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F4C1A767 +20260511085040 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F53CE3D3 +20260511085041 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F53EA897 +20260511085045 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F5564993 +20260511085048 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F566832B +20260511085053 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F58B657B +20260511085057 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F5A62933 +20260511085101 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F5C1B747 +20260511085103 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F5CC5643 +20260511085109 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F5F9ADD3 +20260511085112 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F60A5803 +20260511085115 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F6181907 +20260511085120 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F64085F3 +20260511085128 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F67EBEC7 +20260511085130 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F688928F +20260511085134 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F6A11BCF +20260511085228 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F84A6DC3 +20260511085236 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F886857B +20260511085238 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F894B7E3 +20260511085243 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F8B33F7F +20260511085251 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F8F5CCAF +20260511085302 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052F94B6593 +20260511085354 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FAE53BA3 +20260511085401 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FB1B04EF +20260511085416 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FB90570F +20260511085423 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FBC24453 +20260511085431 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FBFF5EBF +20260511085437 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FC2916A7 +20260511085450 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FC8A174B +20260511085456 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FCB54EBB +20260511085500 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FCD84703 +20260511085512 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FD3265F3 +20260511085514 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FD3CC283 +20260511085529 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FDB0BB73 +20260511085531 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FDB76EE3 +20260511085533 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FDC6AE2B +20260511085548 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FE3AB12F +20260511085617 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FF1F380B +20260511085623 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FF46610F +20260511085630 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA2052FF785033 +20260511085657 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA20530053C857 +20260511085659 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA205300635C0B +20260511085706 2 6 100 2047 2 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA20530094D4D3 +20260511085715 2 6 100 2047 5 F3718C7E134C24BBF03E495C9444A0FA6DE2857B04C171505D403D0460B8FD8B5E823CD34E86B69AA9FAF4A7AD4E8908B4C9BC28228EAD8090146109B725B2B654BAF07CC710F8BD20849702B463BF8DB5DF64CBA1FFA5C72A30F5C8D7238705EDEA172214EA5AF93A183E718FD2F0CC51CC535F0C77A08F9941E372376668C0C95DE4C15A44C713979D343B5110EE7669A862A6F2ACAF09D8B38381DBF844981642A352D8C38C74E8F3C67382E0839EF8D0681BC6B2FB253DCB723F7299D0E82D5AFC36FC89E1DDD047361468BDAFE772DC2A6910C4C88F20A084CD26F16A6351B9717EE500321EA0A6D97B09B122CFBAF6A03F39F6270232BA205300D26217 +20260511084413 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B05396A17 +20260511084504 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B05D7CE83 +20260511084537 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B063E0F03 +20260511084605 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0694203B +20260511084716 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B07739A3B +20260511084739 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B07B7FD93 +20260511085045 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0A123D03 +20260511085131 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0AA2643F +20260511085155 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0AE8B7E7 +20260511085213 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0B1A625F +20260511085218 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0B270357 +20260511085318 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0BE5EB97 +20260511085329 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0C0201D7 +20260511085449 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0D082603 +20260511085506 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0D343EEB +20260511085538 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0D98CBB7 +20260511085551 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0DBAC91F +20260511085607 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0DEA2D2B +20260511085639 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0E481887 +20260511085646 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B0E5B35DB +20260511085920 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B10469FFF +20260511090018 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B10FADAA3 +20260511090049 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B115B837B +20260511090111 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B119CA293 +20260511090116 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B11A91A3F +20260511090146 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B120787EB +20260511090154 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B12180293 +20260511090214 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1255511F +20260511090236 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B129443B7 +20260511090310 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B12FC8243 +20260511090349 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B13750D6F +20260511090452 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1439B6F7 +20260511090627 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1563EAA7 +20260511090721 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B160885A3 +20260511090747 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B16556747 +20260511090921 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1778151B +20260511091003 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B17FB45F7 +20260511091015 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B181815E3 +20260511091116 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B18DC5233 +20260511091208 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B197CA4BB +20260511091230 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B19BDF25F +20260511091254 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1A059A4B +20260511091335 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1A77F8CB +20260511091344 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1A8DA6B3 +20260511091437 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1B23D1AF +20260511091508 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1B835193 +20260511091542 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1BE6CC9F +20260511091609 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1C3B3E33 +20260511091652 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1CBA0FD3 +20260511091719 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B1D0C0E5B +20260511092501 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B22F536CB +20260511092700 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2473CBFB +20260511092712 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B249283BB +20260511092730 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B24C4CEE3 +20260511092755 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B250C2AAF +20260511092826 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B256821E3 +20260511092945 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2660073B +20260511093009 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B26A7E263 +20260511093059 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B27443AE3 +20260511093200 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B280601C3 +20260511093208 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2818FFF7 +20260511093314 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B28E347B7 +20260511093409 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B298F8053 +20260511093444 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B29FBD093 +20260511093513 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2A55D2EB +20260511093558 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2ADA0177 +20260511093606 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2AEBC943 +20260511093609 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2AEF3F93 +20260511093705 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2B9BBACB +20260511093831 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2CB08B33 +20260511093923 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2D4E8FAB +20260511093947 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2D9706EB +20260511094039 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2E3FDE8B +20260511094044 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2E49A9A7 +20260511094053 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2E60035B +20260511094108 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2E8A410B +20260511094116 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2E9B5E5B +20260511094140 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2EE064EB +20260511094147 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2EEDA093 +20260511094220 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2F4F767F +20260511094257 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B2FC5CA63 +20260511094331 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B302706CB +20260511094404 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B3082EFEF +20260511094407 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B30857693 +20260511094542 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B31B00EAB +20260511094602 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B31EBAA07 +20260511094619 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B3219F023 +20260511094653 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B3282600B +20260511094709 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B32AECC03 +20260511094718 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B32C6615F +20260511094726 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B32D965CF +20260511094804 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B334EF713 +20260511094906 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B34116A1F +20260511094915 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B34272383 +20260511094952 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B349A4D7F +20260511095034 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B35214227 +20260511095052 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B3553AE5B +20260511095101 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B356BA7EF +20260511095122 2 6 100 3071 5 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B35A661AF +20260511095148 2 6 100 3071 2 EAD24B3A27A7280F23BA2C6EC870EBEBBD35ECBB9B814963A39B0B7CBBD6F2518012A172FA259530B66662E47C0A4F8B6546EF81A96BC80F6EEDC840D983BB27168A08996281B19296CE154E0001FCDEE2F697CC4B26B948BF011DEA684D7F720728AAF16E9398C012B39FF52C01D3F97EF7CAE04A0EAFE6B724125793398FBD9A8DC0A05608A6D1F12A4295E8849B6D9F1870535B65FE9B9C4B063CCD6348DE4937084870EF5C4BBA33D4972CB80FE1216DDB495CC73F03C4B64B9C4A6733E008F8648F8E1EF0A99E9DBBA877F1C3686ED0016BBF0D4A4981C49C7AC2B9744DF6C46E8FE431402C0C8FC1280DDD2F7B65B475BA6F6C262024CC8D21C69D9D664013A75EFD73E0D80C1945D531568BB7FA5FBA24CB45B8E7137AA70812D39D9A446A2F0F65524A518032373721F12059748ECAF566C972A02DD4B035F4B5E20B0522C908DFA30D2BD5115D56C08DB61E705303235267A5BFF5B24A6763E1B5763EA9E896AFB27CBA0736AF3BFDFD56D39C697A5D3F362AD2689F3B1B35F36513 +20260511085213 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1DE796233 +20260511085455 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1DF78A11B +20260511085506 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1DF821ACB +20260511085613 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1DFE7899F +20260511085624 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1DFEFBF13 +20260511085639 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E00065BF +20260511090533 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E345D97B +20260511090740 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E40A6A43 +20260511091009 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E4EF8BC3 +20260511091250 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E5E74B47 +20260511091354 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E63E25D3 +20260511091542 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E6E0282B +20260511092251 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E978EDEB +20260511092333 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1E9B60FBF +20260511092429 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EA0645E7 +20260511092440 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EA104583 +20260511092500 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EA26ABBB +20260511092742 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EB1D22A7 +20260511092937 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EBCC43AF +20260511093204 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1ECA80283 +20260511093236 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1ECD3A797 +20260511093508 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EDBEAE9B +20260511093637 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EE4557E3 +20260511093729 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EE901BBF +20260511093914 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1EF2D9C97 +20260511094301 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1F0870C3F +20260511094812 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1F26162C7 +20260511094925 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1F2CE5093 +20260511095255 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1F412A0A3 +20260511095718 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1F5A667E3 +20260511100210 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1F765790B +20260511100855 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1F9E60ACF +20260511101503 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1FC198267 +20260511101632 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1FCA08DA7 +20260511101824 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1FD4C1BEB +20260511102051 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1FE309CDF +20260511102133 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A1FE6C88DB +20260511102723 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2009CC593 +20260511102930 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A201604573 +20260511103230 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20277E113 +20260511103421 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20324492B +20260511103540 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20397DC0F +20260511103602 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A203B389EB +20260511103609 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A203B5C6F7 +20260511103730 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2042D0BFB +20260511104003 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A205194FAF +20260511104124 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2059088B3 +20260511104348 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2066E4383 +20260511104441 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A206B5560B +20260511104447 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A206B71ADB +20260511104510 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A206D5D4F3 +20260511104609 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20729D44B +20260511105129 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2091F8A7F +20260511105356 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20A07BA33 +20260511105523 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20A8D3D93 +20260511105713 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20B36BFDF +20260511105805 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20B7EBACF +20260511105930 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20C01B713 +20260511110250 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20D379513 +20260511110424 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A20DCA2F2B +20260511111115 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A210571093 +20260511111657 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2127B4EFB +20260511112235 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A214947EFB +20260511112319 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A214D56B13 +20260511113230 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21837527B +20260511113343 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A218A1E943 +20260511113538 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2194E88FF +20260511113939 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21AD1E593 +20260511114036 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21B2908DF +20260511114202 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21BAD3A53 +20260511114234 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21BD87D93 +20260511114513 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21CCDE94F +20260511115037 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21ED27967 +20260511115213 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21F6A2A6F +20260511115226 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21F76753F +20260511115256 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A21FA0A4C7 +20260511115406 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2200ACE93 +20260511115634 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A220FAC5C3 +20260511115820 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A221A2CEF3 +20260511120346 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A223AC6827 +20260511121321 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A227440BD3 +20260511121429 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A227A4BBD7 +20260511121935 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2298B4EA7 +20260511122206 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A22A789527 +20260511122928 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A22D39A913 +20260511123114 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A22DDE0A8B +20260511123332 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A22EB6627B +20260511123530 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A22F6EE5B7 +20260511123631 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A22FC8DB4F +20260511123659 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A22FF08FC7 +20260511123715 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A23000CA8B +20260511124057 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2315CFC2F +20260511124239 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A231F5A91F +20260511124823 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2340856F3 +20260511124915 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A234539983 +20260511124941 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A23476E82F +20260511125143 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A2353A2E13 +20260511125539 2 6 100 4095 5 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A236AE737F +20260511125618 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A236E43983 +20260511125947 2 6 100 4095 2 D6397D4823BD05CF609186660A2EE9CF028C2FB0B6BB8A2EF2D03AD5933F1CA768826D89E8F529040482FA7008F182A4923768B4D563228AE9364FBE449D95F07ADD3DA554437EB94BC3706F13EFFF71CAD39C3EC410ACD82D0B7CA0587D87BF7ACFFD36BC968E3E3E9DFECB06A3FFE2DA3CC3BDA2819F9FEB04654B3FCDBB2DA402B47D41AB69D87707833FA04AB5BA7CCAFC16CBC6B68D60E13F4DCA10BC2C6BF9276BE4EBF01C2258815887AA8D4537EC56798102FD9C599C572D3899A36EA48035CF1F3D43F4D70D953108C47E45D85CC5A49C9FE5688C4A89A318AE1212C1B6B36B9D51E306BD716CF793C491131FDBCA05587E7309EDC9C1079219CDFCAA1C169B8442D25BDE6957A15DF2F7DD609CDB7AD9560B0B495CE79925B7DE8F8FA49D4769C19FC20E301557F87CF82FFEB0ADD8EE2403C19B5D8BB8B3DB9A0FA8F1874C865531806635DAE03E65FBC6E2764103737ACBBE0BE9C751EE377758890546DDAAC730B4847582115268F280B8EC7511D83C80D3C6DD5C2DF19DAFDF0981D83ACEB5175D44AE460DA66C9135DCD6FABD27808E4094E384F158B6F68AA4F65E7855BD8A57CDD2420ACBEEF686380DAB2296410182DD4F8D8DF2EF3ABA72D0A4D20561FD9838CEA273D980C60DBA2C9E6E50C73DBAF0AB49B9A414553BD9BF16B10440D8BB8F3F1796F027F40E793026E3B8ACF33B144F56A238375663 +20260511085845 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C78EEE8C4A3 +20260511091516 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C78F0E483FB +20260511091649 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C78F10A675B +20260511093018 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C78F2A92B63 +20260511093324 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C78F2FF6B0F +20260511101420 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C78F807C29B +20260511104659 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C78FC09470B +20260511110615 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C78FE71565B +20260511112848 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7901464FDB +20260511114632 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C790375F297 +20260511122808 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7908BA57D3 +20260511123014 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7908F62953 +20260511125838 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C790C86D58B +20260511130101 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C790CCD812F +20260511130335 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C790D192017 +20260511130358 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C790D1DBB23 +20260511130634 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C790D6B1413 +20260511131453 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C790E637693 +20260511134423 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79121B6543 +20260511135551 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7913895007 +20260511135629 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7913958A6F +20260511140207 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7914432D1B +20260511142805 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79176DF777 +20260511143724 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C791898E99B +20260511145300 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C791A956863 +20260511145512 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C791AD9028B +20260511152445 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C791E9E0B3B +20260511153122 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C791F6775F7 +20260511165234 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7929CAE4E7 +20260511165507 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C792A15C183 +20260511172732 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C792E258D2B +20260511174520 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79306C05D3 +20260511175205 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79313F5D3B +20260511181843 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7934943E23 +20260511182739 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7935AC74D3 +20260511183113 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C793618258F +20260511183359 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79366E11CB +20260511183514 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79368BF21B +20260511184341 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C793792FB37 +20260511184626 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7937E46E9F +20260511185327 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7938C104EF +20260511185431 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7938DB4C7B +20260511191128 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C793AFE3BF7 +20260511192516 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C793CBDCAA7 +20260511193714 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C793E3CB59F +20260511201609 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79432B719B +20260511204606 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7946FD4633 +20260511204844 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79474F10CB +20260511205054 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79478F021B +20260511215117 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C794F44112B +20260511221406 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79523250AF +20260511224852 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7956958807 +20260511235101 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C795E8AABB3 +20260512001813 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7961F83DE3 +20260512002328 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79629B8D77 +20260512002427 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7962B3E783 +20260512004136 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7964DE75B3 +20260512005125 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79661C50F3 +20260512005206 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79662965CB +20260512005339 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7966521EB3 +20260512005621 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7966A4BD43 +20260512011429 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7968EBCCDB +20260512021321 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C796DD7F4EF +20260512025410 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79710005D7 +20260512031022 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C797310C3BB +20260512031410 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79738711AB +20260512041548 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C797B6EC643 +20260512042107 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C797C153B7B +20260512042126 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C797C177A13 +20260512044238 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C797ECAEAE3 +20260512045048 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C797FCC663B +20260512051517 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7982E7DBA7 +20260512051642 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79830DD24B +20260512052705 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7984615657 +20260512053154 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7984F6924F +20260512053217 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7984FAD9DF +20260512054425 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C798681D66F +20260512054523 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C798698633B +20260512055000 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C798728786B +20260512060001 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C798863FE9F +20260512061535 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C798A5BCD13 +20260512061630 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C798A706533 +20260512063005 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C798C26C26F +20260512072010 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C799290ADD7 +20260512072617 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7993516D9B +20260512073134 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7993F4B5EB +20260512074200 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7995438487 +20260512080903 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C7998B913D3 +20260512082534 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C799AD2284F +20260512083554 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C799C17F823 +20260512083638 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C799C26EB7B +20260512085653 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C799EB2ADEB +20260512090224 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C799F5E738B +20260512091939 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79A18435A7 +20260512092147 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79A1C02383 +20260512093959 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79A40C47BF +20260512094454 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79A4A146A3 +20260512094621 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79A4C60CA3 +20260512102542 2 6 100 6143 5 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79A9BFC7EF +20260512102838 2 6 100 6143 2 F38160A353271F63D0B2AF727A3F5F522DC2C90C8AEB206C2180AA6CA15A38EE16675F1493755FE33E64ED2A9EA724C09C47FB79BC7DD0282DB878339E0ADA0D7274ABBAF61C998C08E86194E160DD78AA410D715EF02FE9072618AEE260E657E3D0FCAD759BB8A265AAF264D7AE76C90B1FE1FD1210A69F27C4DB136E9E7C72A84B8B55E90B45A2ED48DF3FCD42AAEF79F9587DEEED50F21E4A95FF25A22467E88E71312D67D8A4F2AFAE732E96D6FE0FEBD0790A0AB013C82EF7F80766BFEAC96AC217CF62B80A2FDE111ED495DAB5B5C6631BF3EBA61D67B1FB4A49B610FE1FB58DFD82C5AB6021CC25D278F8E0B2C5FF8D5D1AC8B4D5717191E43929B889704628C03AD49B23B6AA027030D04E03029DE926C3F8FCCEC3837CF62CB871BF78BDD6EAA7085606C92B5A3A2C57A9841121B759DD9C10C8DEA2B08ACD150E50F9B2F581732B3F49F950B74931D852CEE4AFA2AFC0B4A016E05F6A391476CF5CAFE2B2059F4313736F0134B2A1C36AA8B77D3BE55614F2DDBDD0F833943AF014FDFDFE737C78D4BA3FE4AC8BFEDF07A752BA954CD38CD9D608EADA641A462DB64C99692B7BEEA28E51223CDD47E9219C3FB5A2D0D290C77885288D3C08914AE4AC112C447A20588218FF50014F7DAA32D27BFF2151D3DEE2C404B7A32ABE41463B84941EB997BF7A482EC9DA0BEE3206A2C7083404B3900BB2840349DA284FD6FEDAAB248B29E271E51FCBD8E956954FB239814C72667651CE20ED848E171081DEB04A9B1B6D17934A737BD409F82A397AA35392CA48AE4F3847CAB91F036A6C048DF185734104CCFF1DF13B7A2A4A90EBB6469ED940FB0B2B2FA8FD3D57B148E229786501B546B8998BF9FBC36DA879CE72029106A3E4C6E07AA1F3710E8084DCB9968F77B62D03F8BD3426BE85FC08EE025C49BE807A5E2805983E8A9B786D6782032B8FB19412B18DF19BE5F849E36AA3354DFEC3769026967F2F6D3BDB5AD3C077B2AC736DCB418FD1420920A3CC16AF167BB8851FE26A5B7B74C65DA4D8D8056B381E34E42CFB9F41B6D9B99D0EBB23DA29333B0B50E0C51C79AA13CF1B +20260511095023 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE41A98E00B +20260511104049 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE41DE1C75F +20260511111800 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE42054B41B +20260511114647 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4224158D3 +20260511115816 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE422FEA613 +20260511123229 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4254D176F +20260511124134 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE425DE3F2B +20260511140548 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE42B854DAF +20260511142301 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE42CA60FCB +20260511160651 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE433B318C3 +20260511172659 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE43927A373 +20260511174857 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE43AA749EB +20260511185225 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE43EF1B2BB +20260511192332 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE441149A33 +20260511211933 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE449044E63 +20260511212941 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE449ABBF17 +20260511233100 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE451E75B43 +20260511235300 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4536430A7 +20260512001220 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE454AF2CD7 +20260512005230 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4576B1E63 +20260512011028 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE458A36BEB +20260512013349 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE45A34F373 +20260512013652 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE45A61D7E3 +20260512023147 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE45BE8ECD3 +20260512035157 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE461284F53 +20260512065243 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE46D8128FF +20260512065410 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE46D91A00B +20260512071754 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE46F24D8BF +20260512075434 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4719D54EF +20260512083210 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4742B4B23 +20260512084341 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE474ECB74F +20260512102543 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE47BD030C7 +20260512105318 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE47D9F87DB +20260512111841 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE47F494AC7 +20260512112752 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE47FDF4083 +20260512114215 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE480CDE24F +20260512121938 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4830272F7 +20260512122538 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4835F13DB +20260512132936 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE487B0E3AF +20260512134435 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE488AC6987 +20260512150407 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE48DFD71FB +20260512151822 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE48EE7B8CF +20260512192821 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE49FE9732F +20260512193203 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4A0249163 +20260513000500 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4B2AF3C0F +20260513001701 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4B37C5183 +20260513002704 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4B4244193 +20260513005121 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4B5BFF1D3 +20260513010334 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4B6872613 +20260513011510 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4B748D7B7 +20260513012701 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4B810909F +20260513015144 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4B9B88957 +20260513021535 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4BB51DF93 +20260513031324 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4BF3E64C3 +20260513042835 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4C44BBCEF +20260513060042 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4CA71B093 +20260513064033 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4CD267A3F +20260513074519 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4D189F8EF +20260513081343 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4D36F51EB +20260513085150 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4D5FDED37 +20260513085855 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4D6734DBB +20260513091849 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4D7C11EBF +20260513092259 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4D7FF058B +20260513095632 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4DA2CA7D7 +20260513124647 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4E5A3F6FF +20260513130359 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4E6C326EB +20260513143142 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE4ECADA1EF +20260513191748 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE5000215EF +20260513194554 2 6 100 7679 5 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE501D8E52F +20260513203356 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE5051C5DA3 +20260513212158 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE508579E33 +20260513221925 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE50C29C5F3 +20260513235432 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE512A0E32B +20260514000827 2 6 100 7679 2 D490448C9B7C6CF62DD6B294F645B94BEDA0E81F3D406BD870E8FB1A932F3C92026B99033C8B9E7902D01D6711C564E9727A54D71989A80D82D9A50516CD7A1AA1254382A1B5E1612D6F43ED3273240C2E96DDD8100AC103D9E41EEF6283532035D1E37468464585A2B8801D9857E798B68DB9EE71BB6374314854DBFD6AC01CCE72705136A7678D6813A767A84BB1D8AA7AFCC040B193AB1C0FD83D80AA5883BE430024CD8280F70394AE4F005C9C288B75F361B443ACCF92E131435ED74E8AE336E343FAF41A760AEFCF960201AAA51376D3886529D3534BCC76C324D7EB33DFA6245C2628DCF64866B525B98D7827341B840501A5D702DDF052E22EA6E1B36DC27534B91395D6FF7EDE7DFD2D5D8A603586225CAC675D6A382336192825D585D5E9015360FC3D02676120E54957961BD4619ED67274514325ED2B141A9862BA69C2A40C653404419F997806A231F0F3EFD32475C6B84F329CC48DEE3CA8E0A595C60E5BD61016255B704BB5D559E14776AA6E65539B10E9CA125D21009825D0FE8967DFA9D07F89FC6171EDC48276D4CDF9A5D40D7C8F06218F0F2595E37578AEEC19C689DBAC7F6D82003006F06ABA3071E98BBB84B1D749EFCA1D25A29BA9F944C96E4D948AE9AE96D6468E59789F8F5F738146ECB3F1AED1A3A6309B621184749682D3FCA3FD26EFD51230C488EEA965EBB0ABD2F9B3E5AD6EF60B77DE3CCFDC68183A762E1A8BF520BFFC9ED353D98B8DCE38A01804F689C13D62F2BD2E51A0BCEB0D11F08CCB26B2CDB138F42D8D10A90C68FE2B03B3F1F8ABED93ECD11471834A5C8C0C0F162885A7D8288A7BE4EBA27C92D50419D8926CFA3F3F310AAB42C38A5B49D52D3FB0027D9758BDFBD7ADE8FBB1FED698BBD3E53961817618A714E5FA03480D120B6291CE0C0970416F7F539486A8BF006B59264FC272CD29D46609821A58899C391F6659F8D4D65258D55F7E1E47FB952536B203EA22552D8E53853A059D2A7ECB80FBCED477B2F0AA250F3D354B5D41A26C1BA9067B52DEE2D4C77CBD26AB08AC296DC85B7A28EEB8AC861B0B0484DC872505256CDB9B55A2B74A56FA3B3541AFE1E8366147DA2E743815E38D84DB32B52A04B0D640452FC3DDF2A8FB862FE4F5CCAD56785EAC2E8462F19ED1BCB6CD8A2BF1741F2C8B77EA22B3F8AB60A98886128C73D39D7C590498DA1EC5D3CFCCEA3F3CCB9D4FC9862B821C853DBDFAB535A3A12C71CBB56EBD6A9FF30F3E790A15B434A1C5C7B9B819AFB8ECC6763CE99AF2E5475DAACDB1E772A32FE920D3746AEC2509C86B3A1392B56C7E1C8300B16324C1C91502AE219A804820846D45B9E7EBE5138C5F9B +20260511093417 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE854E91CB27 +20260511133337 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE855BCC5B67 +20260511145423 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85604E94B3 +20260511152916 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85623EE687 +20260511160309 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE856420E2A7 +20260511161537 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE8564CD00EB +20260511163527 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE8565E5703B +20260511172036 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85686FFB77 +20260511193344 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE856FF4A103 +20260511211617 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE8575C0979B +20260511222255 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85797BD56B +20260511230530 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE857BDBEC07 +20260511231453 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE857C591683 +20260511234043 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE857DCED457 +20260512004541 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE858168DF27 +20260512014053 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE858481054F +20260512030626 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85874839C3 +20260512062055 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE859252BF97 +20260512070341 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE8594B94C23 +20260512080443 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE859821CB6B +20260512085914 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE859B389833 +20260512092935 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE859CE7BECB +20260512101235 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE859F4B3543 +20260512111106 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85A291F197 +20260512121811 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85A60DB437 +20260512135205 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85AB56499F +20260512145753 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85AF07A1FB +20260512153458 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85B11A007F +20260512154815 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85B1D15B03 +20260512161228 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85B32725FF +20260512165132 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85B557930B +20260512184114 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85BB729CA7 +20260512191659 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85BD755397 +20260512193936 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85BEAF2BCF +20260512195447 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85BF824533 +20260512205424 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85C2E09833 +20260512211910 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85C43D91B7 +20260512231203 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85CA9BA833 +20260512233204 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85CBAFBAE7 +20260513004810 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85CFE44E7B +20260513011314 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85D149436B +20260513022921 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85D5893AAB +20260513024632 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85D67CA2EB +20260513034619 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85D9D53AF7 +20260513040743 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85DB0698F7 +20260513043513 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85DC8E920B +20260513085147 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85EAE29EE7 +20260513100018 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85EEA0C2B3 +20260513110225 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85F21DFAA3 +20260513141916 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE85FD2CD947 +20260513153435 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE860159FE0F +20260513153922 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE860197FBAF +20260513165456 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE8605D7E293 +20260513173921 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE860846992F +20260513233650 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE861C536263 +20260514015528 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE86242292E3 +20260514021814 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE8625634DFB +20260514024141 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE8626B1CACB +20260514040027 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE862B1D7613 +20260514081435 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE8639786A1F +20260514083254 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE863A73E92B +20260514095704 2 6 100 8191 5 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE863F20AE9F +20260514104217 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE86419FDAD3 +20260514122410 2 6 100 8191 2 DBF218F0B44A602CC2CC59AFD3704A6B56E33EA5EC0588370CBAE0D815E68E710AFD8DB0676220E9DA432A726B491D6795A9DFCD4DFCD34BA37A726E604DAC85B9FBA6F67FD01F1C6942263ECBEB6EE8684728522A34F87F02C59D11A1B484885E3871BBD5C369CE714B265ADE55C8EF4457D29C164CDBA46D5B0457DEDEBC64E5C3946DE2478B12E61FB5C1FE3DE2C2A2F9CEF5C0B2D66EBAD0183FF4F7CA6A9FF9EE2AE2C422F3677D693A156427065DD719A043910E2FB0CBE0A0A2CCF2AA715E47B4A6C3CD5DAAE3D4C2F7B19337F5DF4DB8C427D131F1BB6D21B7164965E9009339C872C6BD4EA61C43CBC9E369D8EBE31DD809D3105A0A03FFE0646871E67177797D4EEB7ECD96C954A4CE17F7A7931B250C65CE19A8E1C691EC42F69E5746E262A31D1A8F6A56CE84E90C31EB6ECA835289EB7048572368224695FD9A45617B3B468D5347ECA9B6DC80871591998264AF27FB4F93CFF4FA800B91E98BFC9BBAEBD5C1775E4D47F42FC4C5251B0BA1A79CC91E5A03B11453738834E63EBAB26FBD75DC70C88C7FE77D71CBE69D8954ADBCBC2727848EF82BA24FEC66E974FA7E16934EA7AD86C24910E359A385CD8C1D9095F604F5AD0092B35E37B2D87047324490BBF91F53DF7B7D0160E5F19548750CF8C4CD73A0167F81FD1EFC228EE3CBAD42C936B827982D37C353EAD203B2521884CEDC2F6F15CAC8471173D3DC5EC703A48E6603DC493D84C6F3E29522874569BDE1004E7EAE249E91B8172449F6706EA495F42C0D9E281751C8AC5B958CBA68EFB2535E09D1E0623C5A0FC0A757918220A8B50EEC8A49C63CFD2085644D18B23ABB1089C851915FC40040BC69FF0036C6F65CCA1F7E93CFEF99282BCF76E4297C2422656871FC708215214CA5EC8F3F88948230C24DBC141705F5A9170E71116EBEDB6F8479BFF6D7F0F1A7FE88C7ACE8C0C08C309AC3B808AC8ACE75C8A487719356CB3809FF223B2A776EAA938B5D017930105E5B2F463B68966767DFF71C408E7844F95F8090F66B2641020E121B9B122782C24CF62513E8342F4A7DAAEF84B6D439576B6B75C471E728F6592B09477977F890222CE3F9F4C5D06DFC596236E64CD22E1157C6876AE1FD20034C62213E3295F50077D86AD8F8F788830BBD395A6A0D0CAD5D123426DFC979EFACBB345E3BEC9A343F064F474D006242F21AED9B71CFD1391C584E0F80A444C6F888884C22E2B525EA8DEF21221454F9BD35421DB72C1DB0A6E296974528F5097CFAAF920CEA9B2C812BDD482BAFF0AD7E04FE5FBB6DFFD18E832DA417DEDA172E4DF684F7B1A8F973BAE1B2E5F2346EF70A069B4BDF469A685D9C566DB42B3B43E0A2A9C3E149F27F24F43C6EECB1F8F91F2E20B40B39213D97803DDAAC65BDCC7E6060728EDB39F6A459AB42A128518EF1837EB2BEC967BE864745ECBB From 5af8f3f290bd892352eb007866c066b7bf4a4385 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Sun, 7 Jun 2026 08:50:17 +0000 Subject: [PATCH 099/196] upstream: Make crypto_sign_ed25519_keypair_from_seed() static to prevent compiler warnings since it's only used within ed25519.c. OpenBSD-Commit-ID: cf8b1e8f364167eb1766f646cc18a40f32242991 --- ed25519.c | 4 ++-- ed25519.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ed25519.c b/ed25519.c index 553f2f3c9d9d..b7baa1490bef 100644 --- a/ed25519.c +++ b/ed25519.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ed25519.c,v 1.6 2026/06/05 06:51:02 djm Exp $ */ +/* $OpenBSD: ed25519.c,v 1.7 2026/06/07 08:50:17 dtucker Exp $ */ /* * Public Domain, Authors: @@ -1912,7 +1912,7 @@ static void ge25519_scalarmult_base(ge25519_p3 *r, const sc25519 *s) } /* from supercop-20221122/crypto_sign/ed25519/ref/keypair.c */ -int crypto_sign_ed25519_keypair_from_seed(unsigned char *pk,unsigned char *sk, const unsigned char *seed) +static int crypto_sign_ed25519_keypair_from_seed(unsigned char *pk,unsigned char *sk, const unsigned char *seed) { unsigned char az[64]; sc25519 scsk; diff --git a/ed25519.sh b/ed25519.sh index 1560b5efb289..5846cb6e7ab6 100644 --- a/ed25519.sh +++ b/ed25519.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $OpenBSD: ed25519.sh,v 1.4 2026/06/05 06:51:02 djm Exp $ +# $OpenBSD: ed25519.sh,v 1.5 2026/06/07 08:50:17 dtucker Exp $ # Placed in the Public Domain. # AUTHOR="supercop-20221122/crypto_sign/ed25519/ref/implementors" @@ -101,7 +101,7 @@ _EOF */crypto_sign/ed25519/ref/keypair.c) # provide an explicit-seed key generation function and rename # it to the name OpenSSH expects - sed -e "s/crypto_sign_keypair(unsigned char \*pk,unsigned char \*sk)/crypto_sign_ed25519_keypair_from_seed(unsigned char *pk,unsigned char *sk, const unsigned char *seed)/g" \ + sed -e "s/int crypto_sign_keypair(unsigned char \*pk,unsigned char \*sk)/static int crypto_sign_ed25519_keypair_from_seed(unsigned char *pk,unsigned char *sk, const unsigned char *seed)/g" \ -e "s/randombytes(sk,32);/memcpy(sk, seed, 32);/g" ;; */crypto_sign/ed25519/ref/open.c) From b7e552138b8861469295e33e1457040e3f747d06 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sat, 13 Jun 2026 00:37:13 +0000 Subject: [PATCH 100/196] upstream: when replying to a "query" SSH_AGENTC_EXTENSION request, don't append an SSH_AGENT_SUCCESS to the reply to the query. bz3967 ok dtucker@ OpenBSD-Commit-ID: b51418708096e26dbf73a0c1d3cb49b7352bc899 --- ssh-agent.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/ssh-agent.c b/ssh-agent.c index 151b2b324b65..a8bbf8d73a67 100644 --- a/ssh-agent.c +++ b/ssh-agent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-agent.c,v 1.328 2026/05/31 04:31:04 djm Exp $ */ +/* $OpenBSD: ssh-agent.c,v 1.329 2026/06/13 00:37:13 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1792,7 +1792,7 @@ process_ext_query(SocketEntry *e) static void process_extension(SocketEntry *e) { - int r, success = 0; + int r, replied = 0, success = 0; char *name; debug2_f("entering"); @@ -1803,7 +1803,7 @@ process_extension(SocketEntry *e) } if (strcmp(name, "query") == 0) - success = process_ext_query(e); + replied = success = process_ext_query(e); else if (strcmp(name, "session-bind@openssh.com") == 0) success = process_ext_session_bind(e); else { @@ -1814,8 +1814,10 @@ process_extension(SocketEntry *e) } free(name); /* Agent failures are signalled with a different error code */ - send_status_generic(e, - success ? SSH_AGENT_SUCCESS : SSH_AGENT_EXTENSION_FAILURE); + if (!replied) { + send_status_generic(e, + success ? SSH_AGENT_SUCCESS : SSH_AGENT_EXTENSION_FAILURE); + } } /* From 81ca1451bf94edd9533c4f6787130f2396219049 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 14 Jun 2026 03:59:34 +0000 Subject: [PATCH 101/196] upstream: Add experimental support for a composite post-quantum signature scheme that combines ML-DSA 44 and Ed25519 using the construction specified in draft-ietf-lamps-pq-composite-sigs. There's also an early draft documenting use of the integration of this scheme into SSH as draft-miller-sshm-mldsa44-ed25519-composite-sigs This scheme is not enabled by default. To you use, you'll need to add it to HostKeyAlgorithms, PubkeyAcceptedAlgorithms, etc. Keys may be generated using "ssh-keygen -t mldsa44-ed25519". The ML-DSA implementation comes from libcrux. Thanks to Jonas Schneider-Bensch and Jonathan Protzenko for their work to make this available. Consensus is that it's time to get this in to allow people to experiment with it. feedback markus@ tb@ logan@ deraadt@ OpenBSD-Commit-ID: 85f2d41e3d3374b4e8c28a45a7c92f153c4489e2 --- Makefile.in | 1 + authfd.c | 4 +- authfile.c | 3 +- crypto_api.h | 127 +- ed25519-openssl.c | 34 +- kexmlkem768x25519.c | 123 +- libcrux-mlkem-mldsa.c | 426 + libcrux_internal.h | 27332 ++++++++++++++++++++++++++++++++++++++ libcrux_mlkem768_sha3.h | 11752 ---------------- mlkem768.sh | 219 - mlkem_mldsa.sh | 341 + pathnames.h | 4 +- servconf.c | 4 +- ssh-keygen.c | 8 +- ssh-keyscan.c | 15 +- ssh-keysign.c | 3 +- ssh-mldsa-eddsa.c | 501 + ssh.c | 4 +- sshconnect.c | 3 +- sshd-auth.c | 5 +- sshd-session.c | 3 +- sshd.c | 3 +- ssherr.c | 4 +- ssherr.h | 4 +- sshkey.c | 11 +- sshkey.h | 7 +- 26 files changed, 28869 insertions(+), 12072 deletions(-) create mode 100644 libcrux-mlkem-mldsa.c create mode 100644 libcrux_internal.h delete mode 100644 libcrux_mlkem768_sha3.h delete mode 100644 mlkem768.sh create mode 100644 mlkem_mldsa.sh create mode 100644 ssh-mldsa-eddsa.c diff --git a/Makefile.in b/Makefile.in index 730e598d0577..9bf9422cefb6 100644 --- a/Makefile.in +++ b/Makefile.in @@ -102,6 +102,7 @@ LIBSSH_OBJS=${LIBOPENSSH_OBJS} \ smult_curve25519_ref.o \ poly1305.o chacha.o cipher-chachapoly.o cipher-chachapoly-libcrypto.o \ ssh-ed25519.o digest-openssl.o digest-libc.o \ + libcrux-mlkem-mldsa.o ssh-mldsa-eddsa.o \ hmac.o ed25519.o ed25519-openssl.o \ kex.o kex-names.o kexdh.o kexgex.o kexecdh.o kexc25519.o \ kexgexc.o kexgexs.o \ diff --git a/authfd.c b/authfd.c index fe3226140c01..1f2151b569aa 100644 --- a/authfd.c +++ b/authfd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: authfd.c,v 1.141 2026/03/05 05:44:15 djm Exp $ */ +/* $OpenBSD: authfd.c,v 1.142 2026/06/14 03:59:34 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -608,6 +608,8 @@ ssh_add_identity_constrained(int sock, struct sshkey *key, #endif case KEY_ED25519: case KEY_ED25519_CERT: + case KEY_MLDSA44_ED25519: + case KEY_MLDSA44_ED25519_CERT: case KEY_ED25519_SK: case KEY_ED25519_SK_CERT: type = constrained ? diff --git a/authfile.c b/authfile.c index 5fc2ec470057..3f15515c857e 100644 --- a/authfile.c +++ b/authfile.c @@ -1,4 +1,4 @@ -/* $OpenBSD: authfile.c,v 1.149 2026/02/14 00:18:34 jsg Exp $ */ +/* $OpenBSD: authfile.c,v 1.150 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright (c) 2000, 2013 Markus Friedl. All rights reserved. * @@ -321,6 +321,7 @@ sshkey_load_private_cert(int type, const char *filename, const char *passphrase, case KEY_ECDSA: #endif /* WITH_OPENSSL */ case KEY_ED25519: + case KEY_MLDSA44_ED25519: case KEY_UNSPEC: break; default: diff --git a/crypto_api.h b/crypto_api.h index f5e38b547ff3..9095d8292d2c 100644 --- a/crypto_api.h +++ b/crypto_api.h @@ -1,4 +1,4 @@ -/* $OpenBSD: crypto_api.h,v 1.10 2025/10/30 23:19:33 djm Exp $ */ +/* $OpenBSD: crypto_api.h,v 1.11 2026/06/14 03:59:34 djm Exp $ */ /* * Assembled from generated headers and source files by Markus Friedl. @@ -58,6 +58,7 @@ crypto_hash_sha512(unsigned char *out, const unsigned char *in, #define crypto_sign_ed25519_SECRETKEYBYTES 64U #define crypto_sign_ed25519_PUBLICKEYBYTES 32U +#define crypto_sign_ed25519_SEEDBYTES 32U #define crypto_sign_ed25519_BYTES 64U int crypto_sign_ed25519(unsigned char *, unsigned long long *, @@ -65,11 +66,15 @@ int crypto_sign_ed25519(unsigned char *, unsigned long long *, int crypto_sign_ed25519_open(unsigned char *, unsigned long long *, const unsigned char *, unsigned long long, const unsigned char *); int crypto_sign_ed25519_keypair(unsigned char *, unsigned char *); +int crypto_sign_ed25519_keypair_from_seed(unsigned char *, unsigned char *, + const unsigned char *); #define crypto_kem_sntrup761_PUBLICKEYBYTES 1158 #define crypto_kem_sntrup761_SECRETKEYBYTES 1763 #define crypto_kem_sntrup761_CIPHERTEXTBYTES 1039 #define crypto_kem_sntrup761_BYTES 32 +#define crypto_kem_mlkem768_ENCSEEDBYTES 32 +#define crypto_kem_mlkem768_KEYPAIRSEEDBYTES 64 int crypto_kem_sntrup761_enc(unsigned char *cstr, unsigned char *k, const unsigned char *pk); @@ -77,9 +82,129 @@ int crypto_kem_sntrup761_dec(unsigned char *k, const unsigned char *cstr, const unsigned char *sk); int crypto_kem_sntrup761_keypair(unsigned char *pk, unsigned char *sk); +/* ML-KEM-768 */ #define crypto_kem_mlkem768_PUBLICKEYBYTES 1184 #define crypto_kem_mlkem768_SECRETKEYBYTES 2400 #define crypto_kem_mlkem768_CIPHERTEXTBYTES 1088 #define crypto_kem_mlkem768_BYTES 32 +/* Aliases for MLKEM768 */ +#define MLKEM768_PUBLICKEYBYTES crypto_kem_mlkem768_PUBLICKEYBYTES +#define MLKEM768_SECRETKEYBYTES crypto_kem_mlkem768_SECRETKEYBYTES +#define MLKEM768_CIPHERTEXTBYTES crypto_kem_mlkem768_CIPHERTEXTBYTES +#define MLKEM768_BYTES crypto_kem_mlkem768_BYTES + +int crypto_kem_mlkem768_keypair(uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES], + uint8_t sk[crypto_kem_mlkem768_SECRETKEYBYTES]); +int crypto_kem_mlkem768_enc(uint8_t ct[crypto_kem_mlkem768_CIPHERTEXTBYTES], + uint8_t shared_secret[crypto_kem_mlkem768_BYTES], + const uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES]); +int crypto_kem_mlkem768_dec(uint8_t shared_secret[crypto_kem_mlkem768_BYTES], + const uint8_t ct[crypto_kem_mlkem768_CIPHERTEXTBYTES], + const uint8_t sk[crypto_kem_mlkem768_SECRETKEYBYTES]); +int crypto_kem_mlkem768_keypair_seeded(uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES], + uint8_t sk[crypto_kem_mlkem768_SECRETKEYBYTES], const uint8_t seed[64]); +int crypto_kem_mlkem768_enc_seeded(uint8_t ct[crypto_kem_mlkem768_CIPHERTEXTBYTES], + uint8_t shared_secret[crypto_kem_mlkem768_BYTES], + const uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES], + const uint8_t seed[32]); + +/* ML-DSA-44 */ +#define MLDSA44_PUBLICKEYBYTES 1312 +#define MLDSA44_SECRETKEYBYTES 2560 +#define MLDSA44_SIGBYTES 2420 +#define MLDSA44_SEEDBYTES 32 + +int crypto_sign_mldsa44_keypair(uint8_t pk[MLDSA44_PUBLICKEYBYTES], + uint8_t sk[MLDSA44_SECRETKEYBYTES]); +int crypto_sign_mldsa44(uint8_t sig[MLDSA44_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA44_SECRETKEYBYTES]); +int crypto_sign_mldsa44_verify(const uint8_t sig[MLDSA44_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t pk[MLDSA44_PUBLICKEYBYTES]); +int crypto_sign_mldsa44_keypair_seeded(uint8_t pk[MLDSA44_PUBLICKEYBYTES], + uint8_t sk[MLDSA44_SECRETKEYBYTES], const uint8_t seed[MLDSA44_SEEDBYTES]); +int crypto_sign_mldsa44_seeded(uint8_t sig[MLDSA44_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA44_SECRETKEYBYTES], + const uint8_t seed[MLDSA44_SEEDBYTES]); + +/* ML-DSA-65 */ +#define MLDSA65_PUBLICKEYBYTES 1952 +#define MLDSA65_SECRETKEYBYTES 4032 +#define MLDSA65_SIGBYTES 3309 +#define MLDSA65_SEEDBYTES 32 + +#if 0 +int crypto_sign_mldsa65_keypair(uint8_t pk[MLDSA65_PUBLICKEYBYTES], + uint8_t sk[MLDSA65_SECRETKEYBYTES]); +int crypto_sign_mldsa65(uint8_t sig[MLDSA65_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA65_SECRETKEYBYTES]); +int crypto_sign_mldsa65_verify(const uint8_t sig[MLDSA65_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t pk[MLDSA65_PUBLICKEYBYTES]); +int crypto_sign_mldsa65_keypair_seeded(uint8_t pk[MLDSA65_PUBLICKEYBYTES], + uint8_t sk[MLDSA65_SECRETKEYBYTES], const uint8_t seed[MLDSA65_SEEDBYTES]); +int crypto_sign_mldsa65_seeded(uint8_t sig[MLDSA65_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA65_SECRETKEYBYTES], + const uint8_t seed[MLDSA65_SEEDBYTES]); +#endif + +/* ML-DSA-87 */ +#define MLDSA87_PUBLICKEYBYTES 2592 +#define MLDSA87_SECRETKEYBYTES 4896 +#define MLDSA87_SIGBYTES 4627 +#define MLDSA87_SEEDBYTES 32 + +int crypto_sign_mldsa87_keypair(uint8_t pk[MLDSA87_PUBLICKEYBYTES], + uint8_t sk[MLDSA87_SECRETKEYBYTES]); +int crypto_sign_mldsa87(uint8_t sig[MLDSA87_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA87_SECRETKEYBYTES]); +int crypto_sign_mldsa87_verify(const uint8_t sig[MLDSA87_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t pk[MLDSA87_PUBLICKEYBYTES]); +int crypto_sign_mldsa87_keypair_seeded(uint8_t pk[MLDSA87_PUBLICKEYBYTES], + uint8_t sk[MLDSA87_SECRETKEYBYTES], const uint8_t seed[MLDSA87_SEEDBYTES]); +int crypto_sign_mldsa87_seeded(uint8_t sig[MLDSA87_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA87_SECRETKEYBYTES], + const uint8_t seed[MLDSA87_SEEDBYTES]); + +/* MLDSA44-Ed25519-SHA512 */ +#define MLDSA44_ED25519_PK_SZ (MLDSA44_PUBLICKEYBYTES + crypto_sign_ed25519_PUBLICKEYBYTES) +#define MLDSA44_ED25519_SK_SZ (MLDSA44_SEEDBYTES + crypto_sign_ed25519_SEEDBYTES) +#define MLDSA44_ED25519_SIG_SZ (MLDSA44_SIGBYTES + crypto_sign_ed25519_BYTES) + +int crypto_sign_mldsa44_ed25519_keygen(uint8_t pk[MLDSA44_ED25519_PK_SZ], + uint8_t sk[MLDSA44_ED25519_SK_SZ]); +int crypto_sign_mldsa44_ed25519_keygen_seeded(uint8_t pk[MLDSA44_ED25519_PK_SZ], + uint8_t sk[MLDSA44_ED25519_SK_SZ], + const uint8_t mldsa_seed[MLDSA44_SEEDBYTES], + const uint8_t ed25519_seed[crypto_sign_ed25519_SEEDBYTES]); +int crypto_sign_mldsa44_ed25519_sign(uint8_t sig[MLDSA44_ED25519_SIG_SZ], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA44_ED25519_SK_SZ]); +int crypto_sign_mldsa44_ed25519_verify(const uint8_t sig[MLDSA44_ED25519_SIG_SZ], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t pk[MLDSA44_ED25519_PK_SZ]); + +/* Utility */ +void sha3_256(uint8_t digest[32], const uint8_t *data, size_t len); +void sha3_512(uint8_t digest[64], const uint8_t *data, size_t len); + #endif /* crypto_api_h */ diff --git a/ed25519-openssl.c b/ed25519-openssl.c index 5d1e343d2e69..d45effdca4c6 100644 --- a/ed25519-openssl.c +++ b/ed25519-openssl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ed25519-openssl.c,v 1.1 2025/10/30 20:49:10 djm Exp $ */ +/* $OpenBSD: ed25519-openssl.c,v 1.2 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright (c) 2025 OpenSSH * @@ -95,6 +95,38 @@ crypto_sign_ed25519_keypair(unsigned char *pk, unsigned char *sk) return ret; } +int +crypto_sign_ed25519_keypair_from_seed(unsigned char *pk, unsigned char *sk, + const unsigned char *seed) +{ + EVP_PKEY *pkey = NULL; + size_t pklen; + int ret = -1; + + if ((pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, NULL, + seed, SSH_ED25519_RAW_SECRET_KEY_LEN)) == NULL) { + debug3_f("EVP_PKEY_new_raw_private_key failed"); + goto out; + } + + /* Extract public key */ + pklen = crypto_sign_ed25519_PUBLICKEYBYTES; + if (!EVP_PKEY_get_raw_public_key(pkey, pk, &pklen)) { + debug3_f("EVP_PKEY_get_raw_public_key failed"); + goto out; + } + + /* Build sk = seed || pk */ + memcpy(sk, seed, SSH_ED25519_RAW_SECRET_KEY_LEN); + memcpy(sk + SSH_ED25519_RAW_SECRET_KEY_LEN, pk, + crypto_sign_ed25519_PUBLICKEYBYTES); + + ret = 0; +out: + EVP_PKEY_free(pkey); + return ret; +} + int crypto_sign_ed25519(unsigned char *sm, unsigned long long *smlen, const unsigned char *m, unsigned long long mlen, diff --git a/kexmlkem768x25519.c b/kexmlkem768x25519.c index 2585d1db3935..1a5d16c41c97 100644 --- a/kexmlkem768x25519.c +++ b/kexmlkem768x25519.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kexmlkem768x25519.c,v 1.2 2024/10/27 02:06:59 djm Exp $ */ +/* $OpenBSD: kexmlkem768x25519.c,v 1.3 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright (c) 2023 Markus Friedl. All rights reserved. * @@ -25,6 +25,8 @@ #include "includes.h" +#ifdef USE_MLKEM768X25519 + #include #include @@ -41,34 +43,30 @@ #include "ssherr.h" #include "log.h" -#ifdef USE_MLKEM768X25519 - -#include "libcrux_mlkem768_sha3.h" +#include "crypto_api.h" int kex_kem_mlkem768x25519_keypair(struct kex *kex) { struct sshbuf *buf = NULL; - u_char rnd[LIBCRUX_ML_KEM_KEY_PAIR_PRNG_LEN], *cp = NULL; + u_char *cp = NULL; size_t need; int r = SSH_ERR_INTERNAL_ERROR; - struct libcrux_mlkem768_keypair keypair; if ((buf = sshbuf_new()) == NULL) return SSH_ERR_ALLOC_FAIL; - need = crypto_kem_mlkem768_PUBLICKEYBYTES + CURVE25519_SIZE; + need = MLKEM768_PUBLICKEYBYTES + CURVE25519_SIZE; if ((r = sshbuf_reserve(buf, need, &cp)) != 0) goto out; - arc4random_buf(rnd, sizeof(rnd)); - keypair = libcrux_ml_kem_mlkem768_portable_generate_key_pair(rnd); - memcpy(cp, keypair.pk.value, crypto_kem_mlkem768_PUBLICKEYBYTES); - memcpy(kex->mlkem768_client_key, keypair.sk.value, - sizeof(kex->mlkem768_client_key)); + if (crypto_kem_mlkem768_keypair(cp, kex->mlkem768_client_key) != 0) { + r = SSH_ERR_INTERNAL_ERROR; + goto out; + } #ifdef DEBUG_KEXECDH dump_digest("client public key mlkem768:", cp, - crypto_kem_mlkem768_PUBLICKEYBYTES); + MLKEM768_PUBLICKEYBYTES); #endif - cp += crypto_kem_mlkem768_PUBLICKEYBYTES; + cp += MLKEM768_PUBLICKEYBYTES; kexc25519_keygen(kex->c25519_client_key, cp); #ifdef DEBUG_KEXECDH dump_digest("client public key c25519:", cp, CURVE25519_SIZE); @@ -78,8 +76,6 @@ kex_kem_mlkem768x25519_keypair(struct kex *kex) kex->client_pub = buf; buf = NULL; out: - explicit_bzero(&keypair, sizeof(keypair)); - explicit_bzero(rnd, sizeof(rnd)); sshbuf_free(buf); return r; } @@ -92,20 +88,18 @@ kex_kem_mlkem768x25519_enc(struct kex *kex, struct sshbuf *server_blob = NULL; struct sshbuf *buf = NULL; const u_char *client_pub; - u_char rnd[LIBCRUX_ML_KEM_ENC_PRNG_LEN]; u_char server_pub[CURVE25519_SIZE], server_key[CURVE25519_SIZE]; u_char hash[SSH_DIGEST_MAX_LENGTH]; + u_char ct[MLKEM768_CIPHERTEXTBYTES]; + u_char shared_secret[MLKEM768_BYTES]; size_t need; int r = SSH_ERR_INTERNAL_ERROR; - struct libcrux_mlkem768_enc_result enc; - struct libcrux_mlkem768_pk mlkem_pub; *server_blobp = NULL; *shared_secretp = NULL; - memset(&mlkem_pub, 0, sizeof(mlkem_pub)); /* client_blob contains both KEM and ECDH client pubkeys */ - need = crypto_kem_mlkem768_PUBLICKEYBYTES + CURVE25519_SIZE; + need = MLKEM768_PUBLICKEYBYTES + CURVE25519_SIZE; if (sshbuf_len(client_blob) != need) { r = SSH_ERR_SIGNATURE_INVALID; goto out; @@ -113,17 +107,11 @@ kex_kem_mlkem768x25519_enc(struct kex *kex, client_pub = sshbuf_ptr(client_blob); #ifdef DEBUG_KEXECDH dump_digest("client public key mlkem768:", client_pub, - crypto_kem_mlkem768_PUBLICKEYBYTES); + MLKEM768_PUBLICKEYBYTES); dump_digest("client public key 25519:", - client_pub + crypto_kem_mlkem768_PUBLICKEYBYTES, + client_pub + MLKEM768_PUBLICKEYBYTES, CURVE25519_SIZE); #endif - /* check public key validity */ - memcpy(mlkem_pub.value, client_pub, crypto_kem_mlkem768_PUBLICKEYBYTES); - if (!libcrux_ml_kem_mlkem768_portable_validate_public_key(&mlkem_pub)) { - r = SSH_ERR_SIGNATURE_INVALID; - goto out; - } /* allocate buffer for concatenation of KEM key and ECDH shared key */ /* the buffer will be hashed and the result is the shared secret */ @@ -137,25 +125,27 @@ kex_kem_mlkem768x25519_enc(struct kex *kex, goto out; } /* generate and encrypt KEM key with client key */ - arc4random_buf(rnd, sizeof(rnd)); - enc = libcrux_ml_kem_mlkem768_portable_encapsulate(&mlkem_pub, rnd); + if (crypto_kem_mlkem768_enc(ct, shared_secret, client_pub) != 0) { + r = SSH_ERR_INTERNAL_ERROR; + goto out; + } /* generate ECDH key pair, store server pubkey after ciphertext */ kexc25519_keygen(server_key, server_pub); - if ((r = sshbuf_put(buf, enc.snd, sizeof(enc.snd))) != 0 || - (r = sshbuf_put(server_blob, enc.fst.value, sizeof(enc.fst.value))) != 0 || + if ((r = sshbuf_put(buf, shared_secret, sizeof(shared_secret))) != 0 || + (r = sshbuf_put(server_blob, ct, sizeof(ct))) != 0 || (r = sshbuf_put(server_blob, server_pub, sizeof(server_pub))) != 0) goto out; /* append ECDH shared key */ - client_pub += crypto_kem_mlkem768_PUBLICKEYBYTES; + client_pub += MLKEM768_PUBLICKEYBYTES; if ((r = kexc25519_shared_key_ext(server_key, client_pub, buf, 1)) < 0) goto out; - if ((r = ssh_digest_buffer(kex->hash_alg, buf, hash, sizeof(hash))) != 0) + if ((r = ssh_digest_buffer(kex->hash_alg, buf, + hash, sizeof(hash))) != 0) goto out; #ifdef DEBUG_KEXECDH dump_digest("server public key 25519:", server_pub, CURVE25519_SIZE); - dump_digest("server cipher text:", - enc.fst.value, sizeof(enc.fst.value)); - dump_digest("server kem key:", enc.snd, sizeof(enc.snd)); + dump_digest("server cipher text:", ct, sizeof(ct)); + dump_digest("server kem key:", shared_secret, sizeof(shared_secret)); dump_digest("concatenation of KEM key and ECDH shared key:", sshbuf_ptr(buf), sshbuf_len(buf)); #endif @@ -176,8 +166,7 @@ kex_kem_mlkem768x25519_enc(struct kex *kex, out: explicit_bzero(hash, sizeof(hash)); explicit_bzero(server_key, sizeof(server_key)); - explicit_bzero(rnd, sizeof(rnd)); - explicit_bzero(&enc, sizeof(enc)); + explicit_bzero(shared_secret, sizeof(shared_secret)); sshbuf_free(server_blob); sshbuf_free(buf); return r; @@ -188,42 +177,37 @@ kex_kem_mlkem768x25519_dec(struct kex *kex, const struct sshbuf *server_blob, struct sshbuf **shared_secretp) { struct sshbuf *buf = NULL; - u_char mlkem_key[crypto_kem_mlkem768_BYTES]; + u_char shared_secret[MLKEM768_BYTES]; const u_char *ciphertext, *server_pub; u_char hash[SSH_DIGEST_MAX_LENGTH]; size_t need; int r; - struct libcrux_mlkem768_sk mlkem_priv; - struct libcrux_mlkem768_ciphertext mlkem_ciphertext; *shared_secretp = NULL; - memset(&mlkem_priv, 0, sizeof(mlkem_priv)); - memset(&mlkem_ciphertext, 0, sizeof(mlkem_ciphertext)); - need = crypto_kem_mlkem768_CIPHERTEXTBYTES + CURVE25519_SIZE; + need = MLKEM768_CIPHERTEXTBYTES + CURVE25519_SIZE; if (sshbuf_len(server_blob) != need) { r = SSH_ERR_SIGNATURE_INVALID; goto out; } ciphertext = sshbuf_ptr(server_blob); - server_pub = ciphertext + crypto_kem_mlkem768_CIPHERTEXTBYTES; + server_pub = ciphertext + MLKEM768_CIPHERTEXTBYTES; /* hash concatenation of KEM key and ECDH shared key */ if ((buf = sshbuf_new()) == NULL) { r = SSH_ERR_ALLOC_FAIL; goto out; } - memcpy(mlkem_priv.value, kex->mlkem768_client_key, - sizeof(kex->mlkem768_client_key)); - memcpy(mlkem_ciphertext.value, ciphertext, - sizeof(mlkem_ciphertext.value)); #ifdef DEBUG_KEXECDH - dump_digest("server cipher text:", mlkem_ciphertext.value, - sizeof(mlkem_ciphertext.value)); + dump_digest("server cipher text:", ciphertext, + MLKEM768_CIPHERTEXTBYTES); dump_digest("server public key c25519:", server_pub, CURVE25519_SIZE); #endif - libcrux_ml_kem_mlkem768_portable_decapsulate(&mlkem_priv, - &mlkem_ciphertext, mlkem_key); - if ((r = sshbuf_put(buf, mlkem_key, sizeof(mlkem_key))) != 0) + if (crypto_kem_mlkem768_dec(shared_secret, ciphertext, + kex->mlkem768_client_key) != 0) { + r = SSH_ERR_INTERNAL_ERROR; + goto out; + } + if ((r = sshbuf_put(buf, shared_secret, sizeof(shared_secret))) != 0) goto out; if ((r = kexc25519_shared_key_ext(kex->c25519_client_key, server_pub, buf, 1)) < 0) @@ -232,7 +216,7 @@ kex_kem_mlkem768x25519_dec(struct kex *kex, hash, sizeof(hash))) != 0) goto out; #ifdef DEBUG_KEXECDH - dump_digest("client kem key:", mlkem_key, sizeof(mlkem_key)); + dump_digest("client kem key:", shared_secret, sizeof(shared_secret)); dump_digest("concatenation of KEM key and ECDH shared key:", sshbuf_ptr(buf), sshbuf_len(buf)); #endif @@ -249,31 +233,8 @@ kex_kem_mlkem768x25519_dec(struct kex *kex, buf = NULL; out: explicit_bzero(hash, sizeof(hash)); - explicit_bzero(&mlkem_priv, sizeof(mlkem_priv)); - explicit_bzero(&mlkem_ciphertext, sizeof(mlkem_ciphertext)); - explicit_bzero(mlkem_key, sizeof(mlkem_key)); + explicit_bzero(shared_secret, sizeof(shared_secret)); sshbuf_free(buf); return r; } -#else /* USE_MLKEM768X25519 */ -int -kex_kem_mlkem768x25519_keypair(struct kex *kex) -{ - return SSH_ERR_SIGN_ALG_UNSUPPORTED; -} - -int -kex_kem_mlkem768x25519_enc(struct kex *kex, - const struct sshbuf *client_blob, struct sshbuf **server_blobp, - struct sshbuf **shared_secretp) -{ - return SSH_ERR_SIGN_ALG_UNSUPPORTED; -} - -int -kex_kem_mlkem768x25519_dec(struct kex *kex, - const struct sshbuf *server_blob, struct sshbuf **shared_secretp) -{ - return SSH_ERR_SIGN_ALG_UNSUPPORTED; -} #endif /* USE_MLKEM768X25519 */ diff --git a/libcrux-mlkem-mldsa.c b/libcrux-mlkem-mldsa.c new file mode 100644 index 000000000000..d7e0e7c38f8d --- /dev/null +++ b/libcrux-mlkem-mldsa.c @@ -0,0 +1,426 @@ +/* $OpenBSD: libcrux-mlkem-mldsa.c,v 1.1 2026/06/14 03:59:34 djm Exp $ */ +/* + * Copyright (c) 2026 Damien Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + + +#include +#include +#include +#include +#include + +#include "log.h" +#include "crypto_api.h" +#include "libcrux_internal.h" + +/* ML-KEM 768 */ + +int +crypto_kem_mlkem768_keypair(uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES], + uint8_t sk[crypto_kem_mlkem768_SECRETKEYBYTES]) +{ + uint8_t rnd[crypto_kem_mlkem768_KEYPAIRSEEDBYTES]; + int r; + + arc4random_buf(rnd, sizeof(rnd)); + r = crypto_kem_mlkem768_keypair_seeded(pk, sk, rnd); + explicit_bzero(rnd, sizeof(rnd)); + return r; +} + +int +crypto_kem_mlkem768_keypair_seeded(uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES], + uint8_t sk[crypto_kem_mlkem768_SECRETKEYBYTES], + const uint8_t seed[crypto_kem_mlkem768_KEYPAIRSEEDBYTES]) +{ + libcrux_mlkem768_keypair keypair; + libcrux_mlkem768_keypair_rnd rnd; + + memcpy(rnd.data, seed, sizeof(rnd.data)); + keypair = libcrux_ml_kem_mlkem768_portable_generate_key_pair(rnd); + memcpy(pk, keypair.pk.data, crypto_kem_mlkem768_PUBLICKEYBYTES); + memcpy(sk, keypair.sk.data, crypto_kem_mlkem768_SECRETKEYBYTES); + + explicit_bzero(&keypair, sizeof(keypair)); + explicit_bzero(&rnd, sizeof(rnd)); + return 0; +} + +int +crypto_kem_mlkem768_enc(uint8_t ct[crypto_kem_mlkem768_CIPHERTEXTBYTES], + uint8_t shared_secret[crypto_kem_mlkem768_BYTES], + const uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES]) +{ + uint8_t rnd[crypto_kem_mlkem768_ENCSEEDBYTES]; + int r; + + arc4random_buf(rnd, sizeof(rnd)); + r = crypto_kem_mlkem768_enc_seeded(ct, shared_secret, pk, rnd); + explicit_bzero(rnd, sizeof(rnd)); + return r; +} + +int +crypto_kem_mlkem768_enc_seeded(uint8_t ct[crypto_kem_mlkem768_CIPHERTEXTBYTES], + uint8_t shared_secret[crypto_kem_mlkem768_BYTES], + const uint8_t pk[crypto_kem_mlkem768_PUBLICKEYBYTES], + const uint8_t seed[crypto_kem_mlkem768_ENCSEEDBYTES]) +{ + libcrux_mlkem768_enc_result enc; + libcrux_mlkem768_pk pk_internal; + libcrux_mlkem768_enc_rnd rnd; + + memcpy(pk_internal.data, pk, crypto_kem_mlkem768_PUBLICKEYBYTES); + if (!libcrux_ml_kem_mlkem768_portable_validate_public_key(&pk_internal)) + return -1; + memcpy(rnd.data, seed, sizeof(rnd.data)); + enc = libcrux_ml_kem_mlkem768_portable_encapsulate(&pk_internal, rnd); + memcpy(ct, enc.fst.data, crypto_kem_mlkem768_CIPHERTEXTBYTES); + memcpy(shared_secret, enc.snd.data, crypto_kem_mlkem768_BYTES); + + explicit_bzero(&enc, sizeof(enc)); + explicit_bzero(&rnd, sizeof(rnd)); + return 0; +} + +int +crypto_kem_mlkem768_dec(uint8_t shared_secret[crypto_kem_mlkem768_BYTES], + const uint8_t ct[crypto_kem_mlkem768_CIPHERTEXTBYTES], + const uint8_t sk[crypto_kem_mlkem768_SECRETKEYBYTES]) +{ + libcrux_mlkem768_sk sk_internal; + libcrux_mlkem768_ciphertext ct_internal; + libcrux_mlkem768_dec_result shared_secret_internal; + + memcpy(sk_internal.data, sk, crypto_kem_mlkem768_SECRETKEYBYTES); + memcpy(ct_internal.data, ct, crypto_kem_mlkem768_CIPHERTEXTBYTES); + shared_secret_internal = libcrux_ml_kem_mlkem768_portable_decapsulate( + &sk_internal, &ct_internal); + memcpy(shared_secret, shared_secret_internal.data, + crypto_kem_mlkem768_BYTES); + + explicit_bzero(&sk_internal, sizeof(sk_internal)); + explicit_bzero(&shared_secret_internal, sizeof(shared_secret_internal)); + return 0; +} + +/* ML-DSA 44 */ + +int +crypto_sign_mldsa44_keypair(uint8_t pk[MLDSA44_PUBLICKEYBYTES], + uint8_t sk[MLDSA44_SECRETKEYBYTES]) +{ + uint8_t rnd[MLDSA44_SEEDBYTES]; + int r; + + arc4random_buf(rnd, sizeof(rnd)); + r = crypto_sign_mldsa44_keypair_seeded(pk, sk, rnd); + explicit_bzero(rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa44_keypair_seeded(uint8_t pk[MLDSA44_PUBLICKEYBYTES], + uint8_t sk[MLDSA44_SECRETKEYBYTES], const uint8_t seed[MLDSA44_SEEDBYTES]) +{ + libcrux_mldsa44_keypair_rnd rnd; + libcrux_mldsa44_keypair keypair; + + memcpy(rnd.data, seed, sizeof(rnd.data)); + keypair = libcrux_ml_dsa_ml_dsa_44_portable_generate_key_pair(rnd); + memcpy(pk, keypair.verification_key.data, MLDSA44_PUBLICKEYBYTES); + memcpy(sk, keypair.signing_key.data, MLDSA44_SECRETKEYBYTES); + + explicit_bzero(&keypair, sizeof(keypair)); + explicit_bzero(&rnd, sizeof(rnd)); + return 0; +} + +int +crypto_sign_mldsa44(uint8_t sig[MLDSA44_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA44_SECRETKEYBYTES]) +{ + uint8_t rnd[MLDSA44_SEEDBYTES]; + int r; + + arc4random_buf(rnd, sizeof(rnd)); + r = crypto_sign_mldsa44_seeded(sig, msg, msglen, ctx, ctxlen, sk, rnd); + explicit_bzero(rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa44_seeded(uint8_t sig[MLDSA44_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA44_SECRETKEYBYTES], + const uint8_t seed[MLDSA44_SEEDBYTES]) +{ + libcrux_mldsa44_sign_rnd rnd; + libcrux_mldsa44_sk sk_internal; + libcrux_mldsa44_message message = { msg, msglen }; + libcrux_mldsa44_message context = { ctx, ctxlen }; + libcrux_mldsa44_sign_result res; + int r = -1; + + memcpy(sk_internal.data, sk, MLDSA44_SECRETKEYBYTES); + memcpy(rnd.data, seed, sizeof(rnd.data)); + res = libcrux_ml_dsa_ml_dsa_44_portable_sign(&sk_internal, + message, context, rnd); + if (res.tag == LIBCRUX_RESULT_OK) { + memcpy(sig, res.val.case_Ok.data, MLDSA44_SIGBYTES); + r = 0; + } + + explicit_bzero(&sk_internal, sizeof(sk_internal)); + explicit_bzero(&res, sizeof(res)); + explicit_bzero(&rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa44_verify(const uint8_t sig[MLDSA44_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t pk[MLDSA44_PUBLICKEYBYTES]) +{ + libcrux_mldsa44_pk pk_internal; + libcrux_mldsa44_signature sig_internal; + libcrux_mldsa44_message message = { msg, msglen }; + libcrux_mldsa44_message context = { ctx, ctxlen }; + libcrux_mldsa44_verify_result res; + + memcpy(pk_internal.data, pk, MLDSA44_PUBLICKEYBYTES); + memcpy(sig_internal.data, sig, MLDSA44_SIGBYTES); + res = libcrux_ml_dsa_ml_dsa_44_portable_verify(&pk_internal, + message, context, &sig_internal); + + return (res.tag == LIBCRUX_RESULT_OK) ? 0 : -1; +} + +/* ML-DSA 65 */ + +#if 0 +int +crypto_sign_mldsa65_keypair(uint8_t pk[MLDSA65_PUBLICKEYBYTES], + uint8_t sk[MLDSA65_SECRETKEYBYTES]) +{ + uint8_t rnd[MLDSA65_SEEDBYTES]; + int r; + + arc4random_buf(rnd, sizeof(rnd)); + r = crypto_sign_mldsa65_keypair_seeded(pk, sk, rnd); + explicit_bzero(rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa65_keypair_seeded(uint8_t pk[MLDSA65_PUBLICKEYBYTES], + uint8_t sk[MLDSA65_SECRETKEYBYTES], const uint8_t seed[MLDSA65_SEEDBYTES]) +{ + libcrux_mldsa65_keypair_rnd rnd; + libcrux_mldsa65_keypair keypair; + + memcpy(rnd.data, seed, sizeof(rnd.data)); + keypair = libcrux_ml_dsa_ml_dsa_65_portable_generate_key_pair(rnd); + memcpy(pk, keypair.verification_key.data, MLDSA65_PUBLICKEYBYTES); + memcpy(sk, keypair.signing_key.data, MLDSA65_SECRETKEYBYTES); + + explicit_bzero(&keypair, sizeof(keypair)); + explicit_bzero(&rnd, sizeof(rnd)); + return 0; +} + +int +crypto_sign_mldsa65(uint8_t sig[MLDSA65_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA65_SECRETKEYBYTES]) +{ + uint8_t rnd[MLDSA65_SEEDBYTES]; + int r; + + arc4random_buf(rnd, sizeof(rnd)); + r = crypto_sign_mldsa65_seeded(sig, msg, msglen, ctx, ctxlen, sk, rnd); + explicit_bzero(rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa65_seeded(uint8_t sig[MLDSA65_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA65_SECRETKEYBYTES], + const uint8_t seed[MLDSA65_SEEDBYTES]) +{ + libcrux_mldsa65_sign_rnd rnd; + libcrux_mldsa65_sk sk_internal; + libcrux_mldsa65_message message = { msg, msglen }; + libcrux_mldsa65_message context = { ctx, ctxlen }; + libcrux_mldsa65_sign_result res; + int r = -1; + + memcpy(sk_internal.data, sk, MLDSA65_SECRETKEYBYTES); + memcpy(rnd.data, seed, sizeof(rnd.data)); + res = libcrux_ml_dsa_ml_dsa_65_portable_sign(&sk_internal, + message, context, rnd); + if (res.tag == LIBCRUX_RESULT_OK) { + memcpy(sig, res.val.case_Ok.data, MLDSA65_SIGBYTES); + r = 0; + } + + explicit_bzero(&sk_internal, sizeof(sk_internal)); + explicit_bzero(&res, sizeof(res)); + explicit_bzero(&rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa65_verify(const uint8_t sig[MLDSA65_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t pk[MLDSA65_PUBLICKEYBYTES]) +{ + libcrux_mldsa65_pk pk_internal; + libcrux_mldsa65_signature sig_internal; + libcrux_mldsa65_message message = { msg, msglen }; + libcrux_mldsa65_message context = { ctx, ctxlen }; + libcrux_mldsa65_verify_result res; + + memcpy(pk_internal.data, pk, MLDSA65_PUBLICKEYBYTES); + memcpy(sig_internal.data, sig, MLDSA65_SIGBYTES); + res = libcrux_ml_dsa_ml_dsa_65_portable_verify(&pk_internal, + message, context, &sig_internal); + + return (res.tag == LIBCRUX_RESULT_OK) ? 0 : -1; +} +#endif + +/* ML-DSA 87 */ + +#if 0 +int +crypto_sign_mldsa87_keypair(uint8_t pk[MLDSA87_PUBLICKEYBYTES], + uint8_t sk[MLDSA87_SECRETKEYBYTES]) +{ + uint8_t rnd[MLDSA87_SEEDBYTES]; + int r; + + arc4random_buf(rnd, sizeof(rnd)); + r = crypto_sign_mldsa87_keypair_seeded(pk, sk, rnd); + explicit_bzero(rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa87_keypair_seeded(uint8_t pk[MLDSA87_PUBLICKEYBYTES], + uint8_t sk[MLDSA87_SECRETKEYBYTES], const uint8_t seed[MLDSA87_SEEDBYTES]) +{ + libcrux_mldsa87_keypair_rnd rnd; + libcrux_mldsa87_keypair keypair; + + memcpy(rnd.data, seed, sizeof(rnd.data)); + keypair = libcrux_ml_dsa_ml_dsa_87_portable_generate_key_pair(rnd); + memcpy(pk, keypair.verification_key.data, MLDSA87_PUBLICKEYBYTES); + memcpy(sk, keypair.signing_key.data, MLDSA87_SECRETKEYBYTES); + + explicit_bzero(&keypair, sizeof(keypair)); + explicit_bzero(&rnd, sizeof(rnd)); + return 0; +} + +int +crypto_sign_mldsa87(uint8_t sig[MLDSA87_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA87_SECRETKEYBYTES]) +{ + uint8_t rnd[MLDSA87_SEEDBYTES]; + int r; + + arc4random_buf(rnd, sizeof(rnd)); + r = crypto_sign_mldsa87_seeded(sig, msg, msglen, ctx, ctxlen, sk, rnd); + explicit_bzero(rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa87_seeded(uint8_t sig[MLDSA87_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA87_SECRETKEYBYTES], + const uint8_t seed[MLDSA87_SEEDBYTES]) +{ + libcrux_mldsa87_sign_rnd rnd; + libcrux_mldsa87_sk sk_internal; + libcrux_mldsa87_message message = { msg, msglen }; + libcrux_mldsa87_message context = { ctx, ctxlen }; + libcrux_mldsa87_sign_result res; + int r = -1; + + memcpy(sk_internal.data, sk, MLDSA87_SECRETKEYBYTES); + memcpy(rnd.data, seed, sizeof(rnd.data)); + res = libcrux_ml_dsa_ml_dsa_87_portable_sign(&sk_internal, + message, context, rnd); + if (res.tag == LIBCRUX_RESULT_OK) { + memcpy(sig, res.val.case_Ok.data, MLDSA87_SIGBYTES); + r = 0; + } + + explicit_bzero(&sk_internal, sizeof(sk_internal)); + explicit_bzero(&res, sizeof(res)); + explicit_bzero(&rnd, sizeof(rnd)); + return r; +} + +int +crypto_sign_mldsa87_verify(const uint8_t sig[MLDSA87_SIGBYTES], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t pk[MLDSA87_PUBLICKEYBYTES]) +{ + libcrux_mldsa87_pk pk_internal; + libcrux_mldsa87_signature sig_internal; + libcrux_mldsa87_message message = { msg, msglen }; + libcrux_mldsa87_message context = { ctx, ctxlen }; + libcrux_mldsa87_verify_result res; + + memcpy(pk_internal.data, pk, MLDSA87_PUBLICKEYBYTES); + memcpy(sig_internal.data, sig, MLDSA87_SIGBYTES); + res = libcrux_ml_dsa_ml_dsa_87_portable_verify(&pk_internal, + message, context, &sig_internal); + + return (res.tag == LIBCRUX_RESULT_OK) ? 0 : -1; +} +#endif + +void +sha3_256(uint8_t digest[32], const uint8_t *data, size_t len) +{ + Eurydice_borrow_slice_u8 input = { data, len }; + Eurydice_mut_borrow_slice_u8 output = { digest, 32 }; + libcrux_sha3_portable_sha256(output, input); +} + +void +sha3_512(uint8_t digest[64], const uint8_t *data, size_t len) +{ + Eurydice_borrow_slice_u8 input = { data, len }; + Eurydice_mut_borrow_slice_u8 output = { digest, 64 }; + libcrux_sha3_portable_sha512(output, input); +} diff --git a/libcrux_internal.h b/libcrux_internal.h new file mode 100644 index 000000000000..29719795429f --- /dev/null +++ b/libcrux_internal.h @@ -0,0 +1,27332 @@ +/* $OpenBSD: libcrux_internal.h,v 1.1 2026/06/14 03:59:34 djm Exp $ */ + +/* Extracted from libcrux revision c46481ce3cd1cc8315e90db114581d8c992c3d7d */ + +/* + * MIT License + * + * Copyright (c) 2024 Cryspen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#if !defined(__GNUC__) || (__GNUC__ < 2) +# define __attribute__(x) +#endif +#define KRML_MUSTINLINE inline +#define KRML_NOINLINE __attribute__((noinline, unused)) +#define KRML_HOST_EPRINTF(...) +#define KRML_HOST_EXIT(x) fatal_f("internal error") +#define KRML_UNION_CONSTRUCTOR(T) + +static inline void +store64_le(uint8_t dst[8], uint64_t src) +{ + dst[0] = src & 0xff; + dst[1] = (src >> 8) & 0xff; + dst[2] = (src >> 16) & 0xff; + dst[3] = (src >> 24) & 0xff; + dst[4] = (src >> 32) & 0xff; + dst[5] = (src >> 40) & 0xff; + dst[6] = (src >> 48) & 0xff; + dst[7] = (src >> 56) & 0xff; +} + +static inline void +store32_le(uint8_t dst[4], uint32_t src) +{ + dst[0] = src & 0xff; + dst[1] = (src >> 8) & 0xff; + dst[2] = (src >> 16) & 0xff; + dst[3] = (src >> 24) & 0xff; +} + +static inline void +store16_le(uint8_t dst[2], uint16_t src) +{ + dst[0] = src & 0xff; + dst[1] = (src >> 8) & 0xff; +} + +static inline void +store32_be(uint8_t dst[4], uint32_t src) +{ + dst[0] = (src >> 24) & 0xff; + dst[1] = (src >> 16) & 0xff; + dst[2] = (src >> 8) & 0xff; + dst[3] = src & 0xff; +} + +static inline uint64_t +load64_le(uint8_t src[8]) +{ + return (uint64_t)(src[0]) | + ((uint64_t)(src[1]) << 8) | + ((uint64_t)(src[2]) << 16) | + ((uint64_t)(src[3]) << 24) | + ((uint64_t)(src[4]) << 32) | + ((uint64_t)(src[5]) << 40) | + ((uint64_t)(src[6]) << 48) | + ((uint64_t)(src[7]) << 56); +} + +static inline uint32_t +load32_le(uint8_t src[4]) +{ + return (uint32_t)(src[0]) | + ((uint32_t)(src[1]) << 8) | + ((uint32_t)(src[2]) << 16) | + ((uint32_t)(src[3]) << 24); +} + +static inline uint16_t +load16_le(uint8_t src[4]) +{ + return (uint16_t)(src[0]) | + ((uint16_t)(src[1]) << 8); +} + +#ifdef MISSING_BUILTIN_POPCOUNT +static inline unsigned int +__builtin_popcount(unsigned int num) +{ + const int v[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; + return v[num & 0xf] + v[(num >> 4) & 0xf]; +} +#endif + +/* from libcrux/combined_extraction/generated/eurydice_glue.h */ +#pragma once + + +#ifdef _MSC_VER +// For __popcnt +#endif + + +// C++ HELPERS + +#if defined(__cplusplus) + +#ifndef KRML_HOST_EPRINTF +#define KRML_HOST_EPRINTF(...) fprintf(stderr, __VA_ARGS__) +#endif + + +#ifndef __cpp_lib_type_identity +template +struct type_identity { + using type = T; +}; + +template +using type_identity_t = typename type_identity::type; +#else +using std::type_identity_t; +#endif + +#define KRML_UNION_CONSTRUCTOR(T) \ + template \ + constexpr T(int t, V U::*m, type_identity_t v) : tag(t) { \ + val.*m = std::move(v); \ + } \ + T() = default; + +#endif + +// GENERAL-PURPOSE STUFF + +#define LowStar_Ignore_ignore(e, t, _ret_t) ((void)e) + +#define EURYDICE_ASSERT(test, msg) \ + do { \ + if (!(test)) { \ + fprintf(stderr, "assertion \"%s\" failed: file \"%s\", line %d\n", msg, \ + __FILE__, __LINE__); \ + exit(255); \ + } \ + } while (0) + +// SIZEOF, ALIGNOF + +#define Eurydice_sizeof(t) sizeof(t) + +#define Eurydice_alignof(t) alignof(t) + +// SLICES, ARRAYS, ETC. + +// For convenience, we give these common slice types, below, a distinguished +// status and rather than emit them in the client code, we skip their +// code-generation in Cleanup3.ml and write them by hand here. This makes it +// easy to write interop code that brings those definitions in scope. + +// &[u8] +typedef struct Eurydice_borrow_slice_u8_s { + const uint8_t *ptr; + size_t meta; +} Eurydice_borrow_slice_u8; + +// &[u16] +typedef struct Eurydice_borrow_slice_i16_s { + const int16_t *ptr; + size_t meta; +} Eurydice_borrow_slice_i16; + +// &mut [u8] +typedef struct Eurydice_mut_borrow_slice_u8_s { + uint8_t *ptr; + size_t meta; +} Eurydice_mut_borrow_slice_u8; + +// &mut [u16] +typedef struct Eurydice_mut_borrow_slice_i16_s { + int16_t *ptr; + size_t meta; +} Eurydice_mut_borrow_slice_i16; + +#if defined(__cplusplus) +#define KRML_CLITERAL(type) type +#else +#define KRML_CLITERAL(type) (type) +#endif + +#if defined(__cplusplus) && defined(__cpp_designated_initializers) || \ + !(defined(__cplusplus)) +#define EURYDICE_CFIELD(X) X +#else +#define EURYDICE_CFIELD(X) +#endif + +#define Eurydice_array_repeat(dst, len, init, t) \ + ERROR "should've been desugared" + +// Copy a slice with memcopy +#define Eurydice_slice_copy(dst, src, t) \ + memcpy(dst.ptr, src.ptr, dst.meta * sizeof(t)) + +#define core_array___T__N___as_slice(len_, ptr_, t, ret_t) \ + (KRML_CLITERAL(ret_t){EURYDICE_CFIELD(.ptr =)(ptr_)->data, \ + EURYDICE_CFIELD(.meta =) len_}) + +#define core_array__core__clone__Clone_for__T__N___clone(len, src, elem_type, \ + _ret_t) \ + (*(src)) +#define TryFromSliceError uint8_t +#define core_array_TryFromSliceError uint8_t + +// Distinguished support for some PartialEq trait implementations +// +// core::cmp::PartialEq<@Array> for @Array +#define Eurydice_array_eq(sz, a1, a2, t) \ + (memcmp((a1)->data, (a2)->data, sz * sizeof(t)) == 0) +// core::cmp::PartialEq<&0 (@Slice)> for @Array +#define Eurydice_array_eq_slice_shared(sz, a1, s2, t, _) \ + (memcmp((a1)->data, (s2)->ptr, sz * sizeof(t)) == 0) +#define Eurydice_array_eq_slice_mut(sz, a1, s2, t, _) \ + Eurydice_array_eq_slice_shared(sz, a1, s2, t, _) + +// DEPRECATED -- should no longer be generated +#define core_array_equality__core__cmp__PartialEq__Array_U__N___for__Array_T__N___eq( \ + sz, a1, a2, t, _, _ret_t) \ + Eurydice_array_eq(sz, a1, a2, t) +#define core_array_equality__core__cmp__PartialEq__0___Slice_U____for__Array_T__N___eq( \ + sz, a1, a2, t, _, _ret_t) \ + Eurydice_array_eq(sz, a1, ((a2)->ptr), t) +#define core_cmp_impls__core__cmp__PartialEq__0_mut__B___for__1_mut__A___eq( \ + _m0, _m1, src1, src2, _0, _1, T) \ + Eurydice_slice_eq(src1, src2, _, _, T, _) + +#define Eurydice_slice_split_at(slice, mid, element_type, ret_t) \ + KRML_CLITERAL(ret_t) { \ + EURYDICE_CFIELD(.fst =){EURYDICE_CFIELD(.ptr =)((slice).ptr), \ + EURYDICE_CFIELD(.meta =) mid}, \ + EURYDICE_CFIELD(.snd =) { \ + EURYDICE_CFIELD(.ptr =) \ + ((slice).ptr + mid), EURYDICE_CFIELD(.meta =)((slice).meta - mid) \ + } \ + } + +#define Eurydice_slice_split_at_mut(slice, mid, element_type, ret_t) \ + KRML_CLITERAL(ret_t) { \ + EURYDICE_CFIELD(.fst =){EURYDICE_CFIELD(.ptr =)((slice).ptr), \ + EURYDICE_CFIELD(.meta =) mid}, \ + EURYDICE_CFIELD(.snd =) { \ + EURYDICE_CFIELD(.ptr =) \ + ((slice).ptr + mid), EURYDICE_CFIELD(.meta =)((slice).meta - mid) \ + } \ + } + +// Conversion of slice to an array, rewritten (by Eurydice) to name the +// destination array, since arrays are not values in C. +// N.B.: see note in karamel/lib/Inlining.ml if you change this. + +#define Eurydice_slice_to_ref_array2(len_, src, arr_ptr, t_ptr, t_arr, t_err, \ + t_res) \ + (src.meta >= len_ \ + ? ((t_res){.tag = core_result_Ok, .val = {.case_Ok = arr_ptr}}) \ + : ((t_res){.tag = core_result_Err, .val = {.case_Err = 0}})) + +// CORE STUFF (conversions, endianness, ...) + +// We slap extern "C" on declarations that intend to implement a prototype +// generated by Eurydice, because Eurydice prototypes are always emitted within +// an extern "C" block, UNLESS you use -fcxx17-compat, in which case, you must +// pass -DKRML_CXX17_COMPAT="" to your C++ compiler. +#if defined(__cplusplus) && !defined(KRML_CXX17_COMPAT) +extern "C" { +#endif + +#define core_hint_black_box(X, _0, _1) (X) + +// [ u8; 2 ] +typedef struct Eurydice_array_u8x2_s { + uint8_t data[2]; +} Eurydice_array_u8x2; + +// [ u8; 4 ] +typedef struct Eurydice_array_u8x4_s { + uint8_t data[4]; +} Eurydice_array_u8x4; + +// [ u8; 8 ] +typedef struct Eurydice_array_u8x8_s { + uint8_t data[8]; +} Eurydice_array_u8x8; + +static inline uint16_t core_num__u16__from_le_bytes(Eurydice_array_u8x2 buf) { + return load16_le(buf.data); +} + +static inline Eurydice_array_u8x4 core_num__u32__to_be_bytes(uint32_t src) { + // TODO: why not store32_be? + Eurydice_array_u8x4 a; + uint32_t x = htobe32(src); + memcpy(a.data, &x, 4); + return a; +} + +static inline Eurydice_array_u8x4 core_num__u32__to_le_bytes(uint32_t src) { + Eurydice_array_u8x4 a; + store32_le(a.data, src); + return a; +} + +static inline uint32_t core_num__u32__from_le_bytes(Eurydice_array_u8x4 buf) { + return load32_le(buf.data); +} + +static inline Eurydice_array_u8x8 core_num__u64__to_le_bytes(uint64_t v) { + Eurydice_array_u8x8 a; + store64_le(a.data, v); + return a; +} + +static inline uint64_t core_num__u64__from_le_bytes(Eurydice_array_u8x8 buf) { + return load64_le(buf.data); +} + +static inline int64_t core_convert_num__core__convert__From_i32__for_i64__from( + int32_t x) { + return x; +} + +static inline uint64_t core_convert_num__core__convert__From_u8__for_u64__from( + uint8_t x) { + return x; +} + +static inline uint64_t core_convert_num__core__convert__From_u16__for_u64__from( + uint16_t x) { + return x; +} + +static inline size_t core_convert_num__core__convert__From_u16__for_usize__from( + uint16_t x) { + return x; +} + +static inline uint32_t core_num__u8__count_ones(uint8_t x0) { +#ifdef _MSC_VER + return __popcnt(x0); +#else + return __builtin_popcount(x0); +#endif +} + +static inline uint32_t core_num__u32__count_ones(uint32_t x0) { +#ifdef _MSC_VER + return __popcnt(x0); +#else + return __builtin_popcount(x0); +#endif +} + +static inline uint32_t core_num__i32__count_ones(int32_t x0) { +#ifdef _MSC_VER + return __popcnt(x0); +#else + return __builtin_popcount(x0); +#endif +} + +static inline size_t core_cmp_impls__core__cmp__Ord_for_usize__min(size_t a, + size_t b) { + if (a <= b) + return a; + else + return b; +} + +// unsigned overflow wraparound semantics in C +static inline uint8_t core_num__u8__wrapping_sub(uint8_t x, uint8_t y) { + return x - y; +} +static inline uint8_t core_num__u8__wrapping_add(uint8_t x, uint8_t y) { + return x + y; +} +static inline uint8_t core_num__u8__wrapping_mul(uint8_t x, uint8_t y) { + return x * y; +} +static inline uint16_t core_num__u16__wrapping_sub(uint16_t x, uint16_t y) { + return x - y; +} +static inline uint16_t core_num__u16__wrapping_add(uint16_t x, uint16_t y) { + return x + y; +} +static inline uint16_t core_num__u16__wrapping_mul(uint16_t x, uint16_t y) { + return x * y; +} +static inline uint32_t core_num__u32__wrapping_sub(uint32_t x, uint32_t y) { + return x - y; +} +static inline uint32_t core_num__u32__wrapping_add(uint32_t x, uint32_t y) { + return x + y; +} +static inline uint32_t core_num__u32__wrapping_mul(uint32_t x, uint32_t y) { + return x * y; +} +static inline uint64_t core_num__u64__wrapping_sub(uint64_t x, uint64_t y) { + return x - y; +} +static inline uint64_t core_num__u64__wrapping_add(uint64_t x, uint64_t y) { + return x + y; +} +static inline uint64_t core_num__u64__wrapping_mul(uint64_t x, uint64_t y) { + return x * y; +} +static inline size_t core_num__usize__wrapping_sub(size_t x, size_t y) { + return x - y; +} +static inline size_t core_num__usize__wrapping_add(size_t x, size_t y) { + return x + y; +} +static inline size_t core_num__usize__wrapping_mul(size_t x, size_t y) { + return x * y; +} + +static inline int8_t core_num__i8__wrapping_add(int8_t x, int8_t y) { + return (int8_t)((uint8_t)x + (uint8_t)y); +} +static inline int8_t core_num__i8__wrapping_sub(int8_t x, int8_t y) { + return (int8_t)((uint8_t)x - (uint8_t)y); +} +static inline int8_t core_num__i8__wrapping_mul(int8_t x, int8_t y) { + return (int8_t)((uint8_t)x * (uint8_t)y); +} +static inline int16_t core_num__i16__wrapping_add(int16_t x, int16_t y) { + return (int16_t)((uint16_t)x + (uint16_t)y); +} +static inline int16_t core_num__i16__wrapping_sub(int16_t x, int16_t y) { + return (int16_t)((uint16_t)x - (uint16_t)y); +} +static inline int16_t core_num__i16__wrapping_mul(int16_t x, int16_t y) { + return (int16_t)((uint16_t)x * (uint16_t)y); +} +static inline int32_t core_num__i32__wrapping_add(int32_t x, int32_t y) { + return (int32_t)((uint32_t)x + (uint32_t)y); +} +static inline int32_t core_num__i32__wrapping_sub(int32_t x, int32_t y) { + return (int32_t)((uint32_t)x - (uint32_t)y); +} +static inline int32_t core_num__i32__wrapping_mul(int32_t x, int32_t y) { + return (int32_t)((uint32_t)x * (uint32_t)y); +} +static inline int64_t core_num__i64__wrapping_add(int64_t x, int64_t y) { + return (int64_t)((uint64_t)x + (uint64_t)y); +} +static inline int64_t core_num__i64__wrapping_sub(int64_t x, int64_t y) { + return (int64_t)((uint64_t)x - (uint64_t)y); +} +static inline int64_t core_num__i64__wrapping_mul(int64_t x, int64_t y) { + return (int64_t)((uint64_t)x * (uint64_t)y); +} +static inline int8_t core_num__i8__wrapping_neg(int8_t x) { + return (int8_t)(-(uint8_t)x); +} +static inline int16_t core_num__i16__wrapping_neg(int16_t x) { + return (int16_t)(-(uint16_t)x); +} +static inline int32_t core_num__i32__wrapping_neg(int32_t x) { + return (int32_t)(-(uint32_t)x); +} +static inline int64_t core_num__i64__wrapping_neg(int64_t x) { + return (int64_t)(-(uint64_t)x); +} + +static inline uint64_t core_num__u64__rotate_left(uint64_t x0, uint32_t x1) { + return (x0 << x1) | (x0 >> ((-x1) & 63)); +} + +static inline void core_ops_arith__i32__add_assign(int32_t *x0, int32_t *x1) { + *x0 = *x0 + *x1; +} + +static inline uint8_t Eurydice_bitand_pv_u8(const uint8_t *p, uint8_t v) { + return (*p) & v; +} +static inline uint8_t Eurydice_shr_pv_u8(const uint8_t *p, int32_t v) { + return (*p) >> v; +} +static inline uint32_t Eurydice_min_u32(uint32_t x, uint32_t y) { + return x < y ? x : y; +} + +static inline uint8_t +core_ops_bit__core__ops__bit__BitAnd_u8__u8__for__0__u8___bitand( + const uint8_t *x0, uint8_t x1) { + return Eurydice_bitand_pv_u8(x0, x1); +} + +static inline uint8_t +core_ops_bit__core__ops__bit__Shr_i32__u8__for__0__u8___shr(const uint8_t *x0, + int32_t x1) { + return Eurydice_shr_pv_u8(x0, x1); +} + +#define core_num_nonzero_private_NonZeroUsizeInner size_t +static inline core_num_nonzero_private_NonZeroUsizeInner +core_num_nonzero_private___core__clone__Clone_for_core__num__nonzero__private__NonZeroUsizeInner___clone( + core_num_nonzero_private_NonZeroUsizeInner *x0) { + return *x0; +} + +#if defined(__cplusplus) && !defined(KRML_CXX17_COMPAT) +} +#endif + +// ITERATORS + +#define Eurydice_range_iter_next(iter_ptr, t, ret_t) \ + (((iter_ptr)->start >= (iter_ptr)->end) \ + ? (KRML_CLITERAL(ret_t){EURYDICE_CFIELD(.tag =) 0, \ + EURYDICE_CFIELD(.f0 =) 0}) \ + : (KRML_CLITERAL(ret_t){EURYDICE_CFIELD(.tag =) 1, \ + EURYDICE_CFIELD(.f0 =)(iter_ptr)->start++})) + +#define core_iter_range__core__iter__traits__iterator__Iterator_A__for_core__ops__range__Range_A__TraitClause_0___next \ + Eurydice_range_iter_next + +// See note in karamel/lib/Inlining.ml if you change this +#define Eurydice_into_iter(x, t, _ret_t, _) (x) +#define core_iter_traits_collect__core__iter__traits__collect__IntoIterator_Clause1_Item__I__for_I__into_iter \ + Eurydice_into_iter + +// STRINGS + +typedef char Eurydice_c_char_t; +typedef const Eurydice_c_char_t *Prims_string; +typedef void Eurydice_c_void_t; + +// UNSAFE CODE + +#define core_slice___Slice_T___as_mut_ptr(x, t, _) (x.ptr) +#define core_mem_size_of(t, _) (sizeof(t)) +#define core_slice_raw_from_raw_parts_mut(ptr, len, _0, _1) \ + (KRML_CLITERAL(Eurydice_slice){(void *)(ptr), len}) +#define core_slice_raw_from_raw_parts(ptr, len, _0, _1) \ + (KRML_CLITERAL(Eurydice_slice){(void *)(ptr), len}) + +// FIXME: add dedicated extraction to extract NonNull as T* +#define core_ptr_non_null_NonNull void * + +// PRINTING +// +// This is temporary. Ultimately we want to be able to extract all of this. + +typedef void *core_fmt_Formatter; +#define core_fmt_rt__core__fmt__rt__Argument__a___new_display(x1, x2, x3, x4) \ + NULL + +// BOXES + +#ifndef EURYDICE_MALLOC +#define EURYDICE_MALLOC malloc +#endif + +#ifndef EURYDICE_REALLOC +#define EURYDICE_REALLOC realloc +#endif + +static inline char *malloc_and_init(size_t sz, char *init) { + char *ptr = (char *)EURYDICE_MALLOC(sz); + if (ptr != NULL) memcpy(ptr, init, sz); + return ptr; +} + +#define Eurydice_box_new(init, t, t_dst) \ + ((t_dst)(malloc_and_init(sizeof(t), (char *)(&init)))) + +// Initializer for array of size zero +#define Eurydice_empty_array(dummy, t, t_dst) ((t_dst){.data = {}}) + +#define Eurydice_box_new_array(len, ptr, t, t_dst) \ + ((t_dst)(malloc_and_init(len * sizeof(t), (char *)(ptr)))) + +// FIXME this needs to handle allocation failure errors, but this seems hard to +// do without evaluating malloc_and_init twice... +#define alloc_boxed__alloc__boxed__Box_T___try_new(init, t, t_ret) \ + ((t_ret){.tag = core_result_Ok, \ + .f0 = (t *)malloc_and_init(sizeof(t), (char *)(&init))}) + +// OPTIONS + +#define core_option__core__option__Option_T__TraitClause_0___is_some( \ + x, _of_type, _) \ + x->tag + +/* from libcrux/combined_extraction/generated/combined_core.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef combined_core_H +#define combined_core_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + +static inline uint32_t core_num__i32__count_ones(int32_t x0); + +static inline uint16_t core_num__u16__wrapping_add(uint16_t x0, uint16_t x1); + +static inline uint64_t core_num__u64__from_le_bytes(Eurydice_array_u8x8 x0); + +static inline uint64_t core_num__u64__rotate_left(uint64_t x0, uint32_t x1); + +static inline Eurydice_array_u8x8 core_num__u64__to_le_bytes(uint64_t x0); + +static inline uint32_t core_num__u8__count_ones(uint8_t x0); + +static inline uint8_t core_num__u8__wrapping_sub(uint8_t x0, uint8_t x1); + +static inline uint8_t +core_ops_bit__core__ops__bit__BitAnd_u8__u8__for__0__u8___bitand(const uint8_t *x0, uint8_t x1); + +static inline uint8_t +core_ops_bit__core__ops__bit__Shr_i32__u8__for__0__u8___shr(const uint8_t *x0, int32_t x1); + +/** +A monomorphic instance of core.ops.range.Range +with types size_t + +*/ +typedef struct core_ops_range_Range_87_s +{ + size_t start; + size_t end; +} +core_ops_range_Range_87; + +/** +A monomorphic instance of Eurydice.slice_subslice_mut +with types int16_t, core_ops_range_Range size_t, Eurydice_derefed_slice int16_t + +*/ +static inline Eurydice_mut_borrow_slice_i16 +Eurydice_slice_subslice_mut_a6(Eurydice_mut_borrow_slice_i16 s, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_i16){ + .ptr = s.ptr + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $16size_t +*/ +typedef struct Eurydice_arr_b2_s { uint8_t data[16U]; } Eurydice_arr_b2; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_b2 +with const generics +- $256size_t +*/ +typedef struct Eurydice_arr_87_s { Eurydice_arr_b2 data[256U]; } Eurydice_arr_87; + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $24size_t +*/ +typedef struct Eurydice_arr_94_s { uint8_t data[24U]; } Eurydice_arr_94; + +#define core_result_Ok 0 +#define core_result_Err 1 + +typedef uint8_t core_result_Result_57_tags; + +/** +A monomorphic instance of core.result.Result +with types Eurydice_arr_94, core_array_TryFromSliceError + +*/ +typedef struct core_result_Result_57_s +{ + core_result_Result_57_tags tag; + union { + Eurydice_arr_94 case_Ok; + core_array_TryFromSliceError case_Err; + } + val; +} +core_result_Result_57; + +/** +This function found in impl {core::result::Result[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of core.result.unwrap_26 +with types Eurydice_arr uint8_t[[$24size_t]], core_array_TryFromSliceError + +*/ +static inline Eurydice_arr_94 core_result_unwrap_26_78(core_result_Result_57 self) +{ + if (self.tag == core_result_Ok) + { + return self.val.case_Ok; + } + else + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "unwrap not Ok"); + KRML_HOST_EXIT(255U); + } +} + +/** +A monomorphic instance of Eurydice.arr +with types int16_t +with const generics +- $16size_t +*/ +typedef struct Eurydice_arr_d6_s { int16_t data[16U]; } Eurydice_arr_d6; + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $20size_t +*/ +typedef struct Eurydice_arr_fc_s { uint8_t data[20U]; } Eurydice_arr_fc; + +/** +A monomorphic instance of core.result.Result +with types Eurydice_arr_fc, core_array_TryFromSliceError + +*/ +typedef struct core_result_Result_83_s +{ + core_result_Result_57_tags tag; + union { + Eurydice_arr_fc case_Ok; + core_array_TryFromSliceError case_Err; + } + val; +} +core_result_Result_83; + +/** +This function found in impl {core::result::Result[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of core.result.unwrap_26 +with types Eurydice_arr uint8_t[[$20size_t]], core_array_TryFromSliceError + +*/ +static inline Eurydice_arr_fc core_result_unwrap_26_7d(core_result_Result_83 self) +{ + if (self.tag == core_result_Ok) + { + return self.val.case_Ok; + } + else + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "unwrap not Ok"); + KRML_HOST_EXIT(255U); + } +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $1184size_t +*/ +typedef struct Eurydice_arr_5f_s { uint8_t data[1184U]; } Eurydice_arr_5f; + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_shared +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1184 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_from_shared_5f2(const Eurydice_arr_5f *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)1184U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_to_shared +with types uint8_t, core_ops_range_RangeTo size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1184 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_to_shared_210(const Eurydice_arr_5f *a, size_t r) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = r; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $2400size_t +*/ +typedef struct Eurydice_arr_7d_s { uint8_t data[2400U]; } Eurydice_arr_7d; + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 2400 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d48(const Eurydice_arr_7d *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $1152size_t +*/ +typedef struct Eurydice_arr_0e_s { uint8_t data[1152U]; } Eurydice_arr_0e; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 1152 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_f4(const Eurydice_arr_0e *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1152U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 2400 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d417(Eurydice_arr_7d *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 1152 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_f4(Eurydice_arr_0e *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1152U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_mut +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1184 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_from_mut_5f4(Eurydice_arr_5f *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)1184U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1184 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d416(Eurydice_arr_5f *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 24 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_ed(const Eurydice_arr_94 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)24U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $384size_t +*/ +typedef struct Eurydice_arr_b20_s { uint8_t data[384U]; } Eurydice_arr_b20; + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 384 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d415(Eurydice_arr_b20 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 384 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_a9(const Eurydice_arr_b20 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)384U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $32size_t +*/ +typedef struct Eurydice_arr_ec_s { uint8_t data[32U]; } Eurydice_arr_ec; + +/** +A monomorphic instance of core.result.Result +with types Eurydice_arr_ec, core_array_TryFromSliceError + +*/ +typedef struct core_result_Result_07_s +{ + core_result_Result_57_tags tag; + union { + Eurydice_arr_ec case_Ok; + core_array_TryFromSliceError case_Err; + } + val; +} +core_result_Result_07; + +/** +This function found in impl {core::result::Result[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of core.result.unwrap_26 +with types Eurydice_arr uint8_t[[$32size_t]], core_array_TryFromSliceError + +*/ +static inline Eurydice_arr_ec core_result_unwrap_26_39(core_result_Result_07 self) +{ + if (self.tag == core_result_Ok) + { + return self.val.case_Ok; + } + else + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "unwrap not Ok"); + KRML_HOST_EXIT(255U); + } +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $64size_t +*/ +typedef struct Eurydice_arr_c7_s { uint8_t data[64U]; } Eurydice_arr_c7; + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_shared +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 64 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_from_shared_5f1(const Eurydice_arr_c7 *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)64U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 64 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d47(const Eurydice_arr_c7 *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 1184 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_ff(const Eurydice_arr_5f *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1184U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $1088size_t +*/ +typedef struct Eurydice_arr_2b_s { uint8_t data[1088U]; } Eurydice_arr_2b; + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_mut +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1088 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_from_mut_5f3(Eurydice_arr_2b *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)1088U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1088 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d414(Eurydice_arr_2b *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 20 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_8f(const Eurydice_arr_fc *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)20U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $320size_t +*/ +typedef struct Eurydice_arr_b0_s { uint8_t data[320U]; } Eurydice_arr_b0; + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 320 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d413(Eurydice_arr_b0 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 320 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_56(const Eurydice_arr_b0 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)320U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types int16_t +with const generics +- $256size_t +*/ +typedef struct Eurydice_arr_04_s { int16_t data[256U]; } Eurydice_arr_04; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types int16_t +with const generics +- N= 256 +*/ +static inline Eurydice_borrow_slice_i16 +Eurydice_array_to_slice_shared_99(const Eurydice_arr_04 *a) +{ + Eurydice_borrow_slice_i16 lit; + lit.ptr = a->data; + lit.meta = (size_t)256U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $128size_t +*/ +typedef struct Eurydice_arr_89_s { uint8_t data[128U]; } Eurydice_arr_89; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_89 +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_58_s { Eurydice_arr_89 data[3U]; } Eurydice_arr_58; + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $33size_t +*/ +typedef struct Eurydice_arr_fa0_s { uint8_t data[33U]; } Eurydice_arr_fa0; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 33 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_b5(const Eurydice_arr_fa0 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)33U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_fa0 +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_fd_s { Eurydice_arr_fa0 data[3U]; } Eurydice_arr_fd; + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 33 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d412(Eurydice_arr_fa0 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.arr +with types int16_t +with const generics +- $272size_t +*/ +typedef struct Eurydice_arr_5b_s { int16_t data[272U]; } Eurydice_arr_5b; + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types int16_t, core_ops_range_Range size_t, Eurydice_derefed_slice int16_t +with const generics +- N= 272 +*/ +static inline Eurydice_borrow_slice_i16 +Eurydice_array_to_subslice_shared_e70(const Eurydice_arr_5b *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_i16){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $168size_t +*/ +typedef struct Eurydice_arr_c5_s { uint8_t data[168U]; } Eurydice_arr_c5; + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 168 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d46(const Eurydice_arr_c5 *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_c5 +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_2c_s { Eurydice_arr_c5 data[3U]; } Eurydice_arr_2c; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_5b +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_b1_s { Eurydice_arr_5b data[3U]; } Eurydice_arr_b1; + +/** +A monomorphic instance of Eurydice.arr +with types size_t +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_eb_s { size_t data[3U]; } Eurydice_arr_eb; + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types int16_t, core_ops_range_Range size_t, Eurydice_derefed_slice int16_t +with const generics +- N= 272 +*/ +static inline Eurydice_mut_borrow_slice_i16 +Eurydice_array_to_subslice_mut_e7(Eurydice_arr_5b *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_i16){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $504size_t +*/ +typedef struct Eurydice_arr_79_s { uint8_t data[504U]; } Eurydice_arr_79; + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 504 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d45(const Eurydice_arr_79 *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_79 +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_7e_s { Eurydice_arr_79 data[3U]; } Eurydice_arr_7e; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 504 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_48(Eurydice_arr_79 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)504U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $34size_t +*/ +typedef struct Eurydice_arr_31_s { uint8_t data[34U]; } Eurydice_arr_31; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_31 +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_810_s { Eurydice_arr_31 data[3U]; } Eurydice_arr_810; + +/** +A monomorphic instance of Eurydice.slice_subslice_from_shared +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t + +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_slice_subslice_from_shared_6d(Eurydice_borrow_slice_u8 s, size_t r) +{ + return (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = s.ptr + r, .meta = s.meta - r }); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $1120size_t +*/ +typedef struct Eurydice_arr_af_s { uint8_t data[1120U]; } Eurydice_arr_af; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 1120 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_81(const Eurydice_arr_af *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1120U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 1088 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_06(const Eurydice_arr_2b *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1088U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_mut +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1120 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_from_mut_5f2(Eurydice_arr_af *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)1120U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1120 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d411(Eurydice_arr_af *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_mut +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 64 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_from_mut_5f1(Eurydice_arr_c7 *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)64U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 64 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d410(Eurydice_arr_c7 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_shared +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1088 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_from_shared_5f0(const Eurydice_arr_2b *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)1088U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 1088 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d44(const Eurydice_arr_2b *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 2400 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_51(const Eurydice_arr_7d *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)2400U; + return lit; +} + +typedef struct int16_t_x2_s +{ + int16_t fst; + int16_t snd; +} +int16_t_x2; + +/** +This function found in impl {libcrux_secrets::traits::Declassify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types Eurydice_arr uint8_t[[$24size_t]] + +*/ +static KRML_MUSTINLINE Eurydice_arr_94 +libcrux_secrets_int_public_integers_declassify_d8_40(Eurydice_arr_94 self) +{ + return self; +} + +typedef struct uint8_t_x3_s +{ + uint8_t fst; + uint8_t snd; + uint8_t thd; +} +uint8_t_x3; + +/** +This function found in impl {libcrux_secrets::traits::Declassify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types Eurydice_arr uint8_t[[$20size_t]] + +*/ +static KRML_MUSTINLINE Eurydice_arr_fc +libcrux_secrets_int_public_integers_declassify_d8_2b(Eurydice_arr_fc self) +{ + return self; +} + +typedef struct uint8_t_x5_s +{ + uint8_t fst; + uint8_t snd; + uint8_t thd; + uint8_t f3; + uint8_t f4; +} +uint8_t_x5; + +/** +This function found in impl {libcrux_secrets::traits::Declassify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types Eurydice_arr uint8_t[[$8size_t]] + +*/ +static KRML_MUSTINLINE Eurydice_array_u8x8 +libcrux_secrets_int_public_integers_declassify_d8_52(Eurydice_array_u8x8 self) +{ + return self; +} + +typedef struct uint8_t_x4_s +{ + uint8_t fst; + uint8_t snd; + uint8_t thd; + uint8_t f3; +} +uint8_t_x4; + +/** +This function found in impl {libcrux_secrets::traits::Declassify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types Eurydice_arr uint8_t[[$2size_t]] + +*/ +static KRML_MUSTINLINE Eurydice_array_u8x2 +libcrux_secrets_int_public_integers_declassify_d8_75(Eurydice_array_u8x2 self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Classify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 +with types Eurydice_arr int16_t[[$16size_t]] + +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_secrets_int_public_integers_classify_27_4b(Eurydice_arr_d6 self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::ClassifyRef<&'a ([T])> for &'a ([T])} +*/ +/** +A monomorphic instance of libcrux_secrets.int.classify_public.classify_ref_6d +with types uint8_t + +*/ +static KRML_MUSTINLINE Eurydice_borrow_slice_u8 +libcrux_secrets_int_classify_public_classify_ref_6d_90(Eurydice_borrow_slice_u8 self) +{ + return self; +} + +typedef struct int16_t_x8_s +{ + int16_t fst; + int16_t snd; + int16_t thd; + int16_t f3; + int16_t f4; + int16_t f5; + int16_t f6; + int16_t f7; +} +int16_t_x8; + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types int16_t, core_ops_range_Range size_t, Eurydice_derefed_slice int16_t +with const generics +- N= 16 +*/ +static inline Eurydice_borrow_slice_i16 +Eurydice_array_to_subslice_shared_e7(const Eurydice_arr_d6 *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_i16){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +This function found in impl {libcrux_secrets::traits::ClassifyRef<&'a ([T])> for &'a ([T])} +*/ +/** +A monomorphic instance of libcrux_secrets.int.classify_public.classify_ref_6d +with types int16_t + +*/ +static KRML_MUSTINLINE Eurydice_borrow_slice_i16 +libcrux_secrets_int_classify_public_classify_ref_6d_39(Eurydice_borrow_slice_i16 self) +{ + return self; +} + +/** +A monomorphic instance of Eurydice.slice_subslice_shared +with types int16_t, core_ops_range_Range size_t, Eurydice_derefed_slice int16_t + +*/ +static inline Eurydice_borrow_slice_i16 +Eurydice_slice_subslice_shared_a6(Eurydice_borrow_slice_i16 s, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_i16){ .ptr = s.ptr + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of core.result.Result +with types Eurydice_arr_d6, core_array_TryFromSliceError + +*/ +typedef struct core_result_Result_ec_s +{ + core_result_Result_57_tags tag; + union { + Eurydice_arr_d6 case_Ok; + core_array_TryFromSliceError case_Err; + } + val; +} +core_result_Result_ec; + +/** +This function found in impl {core::result::Result[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of core.result.unwrap_26 +with types Eurydice_arr int16_t[[$16size_t]], core_array_TryFromSliceError + +*/ +static inline Eurydice_arr_d6 core_result_unwrap_26_d3(core_result_Result_ec self) +{ + if (self.tag == core_result_Ok) + { + return self.val.case_Ok; + } + else + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "unwrap not Ok"); + KRML_HOST_EXIT(255U); + } +} + +/** +A monomorphic instance of Eurydice.arr +with types int16_t +with const generics +- $128size_t +*/ +typedef struct Eurydice_arr_34_s { int16_t data[128U]; } Eurydice_arr_34; + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 24 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d43(const Eurydice_arr_94 *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 24 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d49(Eurydice_arr_94 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 16 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_29(Eurydice_arr_b2 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)16U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 16 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d42(const Eurydice_arr_b2 *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 16 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d48(Eurydice_arr_b2 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $19size_t +*/ +typedef struct Eurydice_arr_38_s { uint8_t data[19U]; } Eurydice_arr_38; + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 19 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d41(const Eurydice_arr_38 *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 19 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d47(Eurydice_arr_38 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.dst_ref_mut +with types int32_t, size_t + +*/ +typedef struct Eurydice_dst_ref_mut_83_s +{ + int32_t *ptr; + size_t meta; +} +Eurydice_dst_ref_mut_83; + +/** +A monomorphic instance of Eurydice.slice_subslice_mut +with types int32_t, core_ops_range_Range size_t, Eurydice_derefed_slice int32_t + +*/ +static inline Eurydice_dst_ref_mut_83 +Eurydice_slice_subslice_mut_47(Eurydice_dst_ref_mut_83 s, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_dst_ref_mut_83){ .ptr = s.ptr + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 16 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_29(const Eurydice_arr_b2 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)16U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_b2 +with const generics +- $16size_t +*/ +typedef struct Eurydice_arr_a30_s { Eurydice_arr_b2 data[16U]; } Eurydice_arr_a30; + +/** +A monomorphic instance of Eurydice.array_to_subslice_to_mut +with types uint8_t, core_ops_range_RangeTo size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 32 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_to_mut_21(Eurydice_arr_ec *a, size_t r) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = r; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $4627size_t +*/ +typedef struct Eurydice_arr_93_s { uint8_t data[4627U]; } Eurydice_arr_93; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 4627 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_11(const Eurydice_arr_93 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)4627U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $2592size_t +*/ +typedef struct Eurydice_arr_43_s { uint8_t data[2592U]; } Eurydice_arr_43; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 2592 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_fc(const Eurydice_arr_43 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)2592U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $4896size_t +*/ +typedef struct Eurydice_arr_e2_s { uint8_t data[4896U]; } Eurydice_arr_e2; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 4896 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_f7(const Eurydice_arr_e2 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)4896U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types int32_t +with const generics +- $256size_t +*/ +typedef struct Eurydice_arr_6c_s { int32_t data[256U]; } Eurydice_arr_6c; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_6c +with const generics +- $8size_t +*/ +typedef struct Eurydice_arr_81_s { Eurydice_arr_6c data[8U]; } Eurydice_arr_81; + +#define core_option_None 0 +#define core_option_Some 1 + +typedef uint8_t core_option_Option_45_tags; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_81 + +*/ +typedef struct core_option_Option_45_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_81 f0; +} +core_option_Option_45; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_c7 + +*/ +typedef struct core_option_Option_b2_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_c7 f0; +} +core_option_Option_b2; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 4627 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_11(Eurydice_arr_93 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)4627U; + return lit; +} + +/** +A monomorphic instance of Eurydice.dst_ref_shared +with types Eurydice_arr_6c, size_t + +*/ +typedef struct Eurydice_dst_ref_shared_20_s +{ + const Eurydice_arr_6c *ptr; + size_t meta; +} +Eurydice_dst_ref_shared_20; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types Eurydice_arr int32_t[[$256size_t]] +with const generics +- N= 8 +*/ +static inline Eurydice_dst_ref_shared_20 +Eurydice_array_to_slice_shared_861(const Eurydice_arr_81 *a) +{ + Eurydice_dst_ref_shared_20 lit; + lit.ptr = a->data; + lit.meta = (size_t)8U; + return lit; +} + +/** +A monomorphic instance of Eurydice.dst_ref_mut +with types Eurydice_arr_6c, size_t + +*/ +typedef struct Eurydice_dst_ref_mut_20_s +{ + Eurydice_arr_6c *ptr; + size_t meta; +} +Eurydice_dst_ref_mut_20; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types Eurydice_arr int32_t[[$256size_t]] +with const generics +- N= 8 +*/ +static inline Eurydice_dst_ref_mut_20 Eurydice_array_to_slice_mut_861(Eurydice_arr_81 *a) +{ + Eurydice_dst_ref_mut_20 lit; + lit.ptr = a->data; + lit.meta = (size_t)8U; + return lit; +} + +/** + Declassify secret memory. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_declassify +with types Eurydice_arr uint8_t[[$64size_t]] + +*/ +static KRML_MUSTINLINE void +libcrux_secrets_mem_requests_ct_declassify_56(const Eurydice_arr_c7 *val) +{ + +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $1024size_t +*/ +typedef struct Eurydice_arr_1b_s { uint8_t data[1024U]; } Eurydice_arr_1b; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 1024 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_68(const Eurydice_arr_1b *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1024U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 1024 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_68(Eurydice_arr_1b *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1024U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 2592 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_fc(Eurydice_arr_43 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)2592U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 4896 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_f7(Eurydice_arr_e2 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)4896U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $3309size_t +*/ +typedef struct Eurydice_arr_0c_s { uint8_t data[3309U]; } Eurydice_arr_0c; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 3309 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_6b(const Eurydice_arr_0c *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)3309U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $1952size_t +*/ +typedef struct Eurydice_arr_29_s { uint8_t data[1952U]; } Eurydice_arr_29; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 1952 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_37(const Eurydice_arr_29 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1952U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $4032size_t +*/ +typedef struct Eurydice_arr_24_s { uint8_t data[4032U]; } Eurydice_arr_24; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 4032 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_98(const Eurydice_arr_24 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)4032U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_6c +with const generics +- $6size_t +*/ +typedef struct Eurydice_arr_5d0_s { Eurydice_arr_6c data[6U]; } Eurydice_arr_5d0; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_5d0 + +*/ +typedef struct core_option_Option_05_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_5d0 f0; +} +core_option_Option_05; + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $48size_t +*/ +typedef struct Eurydice_arr_65_s { uint8_t data[48U]; } Eurydice_arr_65; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_65 + +*/ +typedef struct core_option_Option_81_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_65 f0; +} +core_option_Option_81; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 3309 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_6b(Eurydice_arr_0c *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)3309U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types Eurydice_arr int32_t[[$256size_t]] +with const generics +- N= 6 +*/ +static inline Eurydice_dst_ref_shared_20 +Eurydice_array_to_slice_shared_860(const Eurydice_arr_5d0 *a) +{ + Eurydice_dst_ref_shared_20 lit; + lit.ptr = a->data; + lit.meta = (size_t)6U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types Eurydice_arr int32_t[[$256size_t]] +with const generics +- N= 6 +*/ +static inline Eurydice_dst_ref_mut_20 Eurydice_array_to_slice_mut_860(Eurydice_arr_5d0 *a) +{ + Eurydice_dst_ref_mut_20 lit; + lit.ptr = a->data; + lit.meta = (size_t)6U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 48 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_9f0(const Eurydice_arr_65 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)48U; + return lit; +} + +/** + Declassify secret memory. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_declassify +with types Eurydice_arr uint8_t[[$48size_t]] + +*/ +static KRML_MUSTINLINE void +libcrux_secrets_mem_requests_ct_declassify_69(const Eurydice_arr_65 *val) +{ + +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 1952 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_37(Eurydice_arr_29 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1952U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 4032 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_98(Eurydice_arr_24 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)4032U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $2420size_t +*/ +typedef struct Eurydice_arr_85_s { uint8_t data[2420U]; } Eurydice_arr_85; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 2420 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_0d(const Eurydice_arr_85 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)2420U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $1312size_t +*/ +typedef struct Eurydice_arr_02_s { uint8_t data[1312U]; } Eurydice_arr_02; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 1312 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_9f(const Eurydice_arr_02 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1312U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $2560size_t +*/ +typedef struct Eurydice_arr_10_s { uint8_t data[2560U]; } Eurydice_arr_10; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 2560 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_34(const Eurydice_arr_10 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)2560U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_6c +with const generics +- $4size_t +*/ +typedef struct Eurydice_arr_b7_s { Eurydice_arr_6c data[4U]; } Eurydice_arr_b7; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_b7 + +*/ +typedef struct core_option_Option_51_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_b7 f0; +} +core_option_Option_51; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_ec + +*/ +typedef struct core_option_Option_14_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_ec f0; +} +core_option_Option_14; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 2420 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_0d(Eurydice_arr_85 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)2420U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types Eurydice_arr int32_t[[$256size_t]] +with const generics +- N= 4 +*/ +static inline Eurydice_dst_ref_shared_20 +Eurydice_array_to_slice_shared_86(const Eurydice_arr_b7 *a) +{ + Eurydice_dst_ref_shared_20 lit; + lit.ptr = a->data; + lit.meta = (size_t)4U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types Eurydice_arr int32_t[[$256size_t]] +with const generics +- N= 4 +*/ +static inline Eurydice_dst_ref_mut_20 Eurydice_array_to_slice_mut_86(Eurydice_arr_b7 *a) +{ + Eurydice_dst_ref_mut_20 lit; + lit.ptr = a->data; + lit.meta = (size_t)4U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types int32_t, core_ops_range_Range size_t, Eurydice_derefed_slice int32_t +with const generics +- N= 256 +*/ +static inline Eurydice_dst_ref_mut_83 +Eurydice_array_to_subslice_mut_44(Eurydice_arr_6c *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_dst_ref_mut_83){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.dst_ref_shared +with types int32_t, size_t + +*/ +typedef struct Eurydice_dst_ref_shared_83_s +{ + const int32_t *ptr; + size_t meta; +} +Eurydice_dst_ref_shared_83; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types int32_t +with const generics +- N= 256 +*/ +static inline Eurydice_dst_ref_shared_83 +Eurydice_array_to_slice_shared_af(const Eurydice_arr_6c *a) +{ + Eurydice_dst_ref_shared_83 lit; + lit.ptr = a->data; + lit.meta = (size_t)256U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $136size_t +*/ +typedef struct Eurydice_arr_ff_s { uint8_t data[136U]; } Eurydice_arr_ff; + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_shared +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 136 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_from_shared_5f(const Eurydice_arr_ff *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)136U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 136 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d40(const Eurydice_arr_ff *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** + Declassify secret memory. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_declassify +with types Eurydice_arr uint8_t[[$32size_t]] + +*/ +static KRML_MUSTINLINE void +libcrux_secrets_mem_requests_ct_declassify_4b(const Eurydice_arr_ec *val) +{ + +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $768size_t +*/ +typedef struct Eurydice_arr_d2_s { uint8_t data[768U]; } Eurydice_arr_d2; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 768 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_27(const Eurydice_arr_d2 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)768U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 768 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_27(Eurydice_arr_d2 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)768U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $640size_t +*/ +typedef struct Eurydice_arr_20_s { uint8_t data[640U]; } Eurydice_arr_20; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 640 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_4f(const Eurydice_arr_20 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)640U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 640 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_4f(Eurydice_arr_20 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)640U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $576size_t +*/ +typedef struct Eurydice_arr_220_s { uint8_t data[576U]; } Eurydice_arr_220; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 576 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_8a(const Eurydice_arr_220 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)576U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 576 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_8a(Eurydice_arr_220 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)576U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $11size_t +*/ +typedef struct Eurydice_arr_c9_s { uint8_t data[11U]; } Eurydice_arr_c9; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 11 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_2f(const Eurydice_arr_c9 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)11U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $1size_t +*/ +typedef struct Eurydice_arr_82_s { uint8_t data[1U]; } Eurydice_arr_82; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 1 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_79(const Eurydice_arr_82 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1U; + return lit; +} + +/** + Mark memory as secret. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_classify +with types Eurydice_derefed_slice uint8_t + +*/ +static KRML_MUSTINLINE void libcrux_secrets_mem_requests_ct_classify_45(const uint8_t (*val)[]) +{ + +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 1312 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_9f0(Eurydice_arr_02 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)1312U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 2560 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_34(Eurydice_arr_10 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)2560U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 64 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_17(const Eurydice_arr_c7 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)64U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types int32_t +with const generics +- $263size_t +*/ +typedef struct Eurydice_arr_d0_s { int32_t data[263U]; } Eurydice_arr_d0; + +/** +A monomorphic instance of Eurydice.dst_ref_mut +with types Eurydice_arr_d0, size_t + +*/ +typedef struct Eurydice_dst_ref_mut_33_s +{ + Eurydice_arr_d0 *ptr; + size_t meta; +} +Eurydice_dst_ref_mut_33; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_d0 +with const generics +- $4size_t +*/ +typedef struct Eurydice_arr_930_s { Eurydice_arr_d0 data[4U]; } Eurydice_arr_930; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types Eurydice_arr int32_t[[$263size_t]] +with const generics +- N= 4 +*/ +static inline Eurydice_dst_ref_mut_33 Eurydice_array_to_slice_mut_7e(Eurydice_arr_930 *a) +{ + Eurydice_dst_ref_mut_33 lit; + lit.ptr = a->data; + lit.meta = (size_t)4U; + return lit; +} + +/** +A monomorphic instance of Eurydice.dst_ref_shared +with types Eurydice_arr_d0, size_t + +*/ +typedef struct Eurydice_dst_ref_shared_33_s +{ + const Eurydice_arr_d0 *ptr; + size_t meta; +} +Eurydice_dst_ref_shared_33; + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $840size_t +*/ +typedef struct Eurydice_arr_d10_s { uint8_t data[840U]; } Eurydice_arr_d10; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 840 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_4c(const Eurydice_arr_d10 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)840U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 34 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_e9(const Eurydice_arr_31 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)34U; + return lit; +} + +/** + Declassify secret memory. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_declassify +with types Eurydice_derefed_slice uint8_t + +*/ +static KRML_MUSTINLINE void +libcrux_secrets_mem_requests_ct_declassify_45(const uint8_t (*val)[]) +{ + +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types int32_t +with const generics +- N= 263 +*/ +static inline Eurydice_dst_ref_shared_83 +Eurydice_array_to_slice_shared_2c0(const Eurydice_arr_d0 *a) +{ + Eurydice_dst_ref_shared_83 lit; + lit.ptr = a->data; + lit.meta = (size_t)263U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_mut +with types int32_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice int32_t +with const generics +- N= 263 +*/ +static inline Eurydice_dst_ref_mut_83 +Eurydice_array_to_subslice_from_mut_11(Eurydice_arr_d0 *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_dst_ref_mut_83){ .ptr = a->data + r, .meta = (size_t)263U - r }); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $66size_t +*/ +typedef struct Eurydice_arr_91_s { uint8_t data[66U]; } Eurydice_arr_91; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 66 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_f1(const Eurydice_arr_91 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)66U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 128 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_78(const Eurydice_arr_89 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)128U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 128 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_78(Eurydice_arr_89 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)128U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 2 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_82(const Eurydice_array_u8x2 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)2U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 32 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_01(const Eurydice_arr_ec *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)32U; + return lit; +} + +/** + Mark memory as secret. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_classify +with types Eurydice_arr uint8_t[[$32size_t]] + +*/ +static KRML_MUSTINLINE void +libcrux_secrets_mem_requests_ct_classify_4b(const Eurydice_arr_ec *val) +{ + +} + +typedef struct Eurydice_arr_c5_x4_s +{ + Eurydice_arr_c5 fst; + Eurydice_arr_c5 snd; + Eurydice_arr_c5 thd; + Eurydice_arr_c5 f3; +} +Eurydice_arr_c5_x4; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 168 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_2c(Eurydice_arr_c5 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)168U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 840 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_4c(Eurydice_arr_d10 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)840U; + return lit; +} + +typedef struct Eurydice_arr_ff_x4_s +{ + Eurydice_arr_ff fst; + Eurydice_arr_ff snd; + Eurydice_arr_ff thd; + Eurydice_arr_ff f3; +} +Eurydice_arr_ff_x4; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 136 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_58(Eurydice_arr_ff *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)136U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 32 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_shared_d4(const Eurydice_arr_ec *a, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = a->data + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_ff +with const generics +- $4size_t +*/ +typedef struct Eurydice_arr_dc0_s { Eurydice_arr_ff data[4U]; } Eurydice_arr_dc0; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_c5 +with const generics +- $4size_t +*/ +typedef struct Eurydice_arr_9c_s { Eurydice_arr_c5 data[4U]; } Eurydice_arr_9c; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_borrow_slice_u8 +with const generics +- $4size_t +*/ +typedef struct Eurydice_arr_68_s { Eurydice_borrow_slice_u8 data[4U]; } Eurydice_arr_68; + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 32 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d46(Eurydice_arr_ec *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_mut +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 168 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_from_mut_5f0(Eurydice_arr_c5 *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)168U - r }); +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_c5 +with const generics +- $1size_t +*/ +typedef struct Eurydice_arr_88_s { Eurydice_arr_c5 data[1U]; } Eurydice_arr_88; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 64 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_17(Eurydice_arr_c7 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)64U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 48 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_9f(Eurydice_arr_65 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)48U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 32 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_01(Eurydice_arr_ec *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)32U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $28size_t +*/ +typedef struct Eurydice_arr_a2_s { uint8_t data[28U]; } Eurydice_arr_a2; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types uint8_t +with const generics +- N= 28 +*/ +static inline Eurydice_mut_borrow_slice_u8 Eurydice_array_to_slice_mut_5e(Eurydice_arr_a2 *a) +{ + Eurydice_mut_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)28U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $104size_t +*/ +typedef struct Eurydice_arr_c4_s { uint8_t data[104U]; } Eurydice_arr_c4; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 104 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_72(const Eurydice_arr_c4 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)104U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 104 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d45(Eurydice_arr_c4 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $144size_t +*/ +typedef struct Eurydice_arr_f4_s { uint8_t data[144U]; } Eurydice_arr_f4; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 144 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_38(const Eurydice_arr_f4 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)144U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 144 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d44(Eurydice_arr_f4 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint8_t +with const generics +- $72size_t +*/ +typedef struct Eurydice_arr_ab_s { uint8_t data[72U]; } Eurydice_arr_ab; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 72 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_e2(const Eurydice_arr_ab *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)72U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 72 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d43(Eurydice_arr_ab *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.slice_subslice_to_shared +with types uint8_t, core_ops_range_RangeTo size_t, Eurydice_derefed_slice uint8_t + +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_slice_subslice_to_shared_72(Eurydice_borrow_slice_u8 s, size_t r) +{ + return (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = s.ptr, .meta = r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_from_mut +with types uint8_t, core_ops_range_RangeFrom size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 136 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_from_mut_5f(Eurydice_arr_ff *a, size_t r) +{ + return + (KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ .ptr = a->data + r, .meta = (size_t)136U - r }); +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_to_shared +with types uint8_t, core_ops_range_RangeTo size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 8 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_subslice_to_shared_21(const Eurydice_array_u8x8 *a, size_t r) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = r; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 8 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_6e(const Eurydice_array_u8x8 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)8U; + return lit; +} + +/** +A monomorphic instance of Eurydice.slice_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t + +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_slice_subslice_mut_c8(Eurydice_mut_borrow_slice_u8 s, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ .ptr = s.ptr + r.start, .meta = r.end - r.start } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 136 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_58(const Eurydice_arr_ff *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)136U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 136 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d42(Eurydice_arr_ff *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint64_t +with const generics +- $5size_t +*/ +typedef struct Eurydice_arr_84_s { uint64_t data[5U]; } Eurydice_arr_84; + +typedef struct size_t_x2_s +{ + size_t fst; + size_t snd; +} +size_t_x2; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_borrow_slice_u8 +with const generics +- $1size_t +*/ +typedef struct Eurydice_arr_dc_s { Eurydice_borrow_slice_u8 data[1U]; } Eurydice_arr_dc; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types uint8_t +with const generics +- N= 168 +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_array_to_slice_shared_2c(const Eurydice_arr_c5 *a) +{ + Eurydice_borrow_slice_u8 lit; + lit.ptr = a->data; + lit.meta = (size_t)168U; + return lit; +} + +/** +A monomorphic instance of core.result.Result +with types Eurydice_array_u8x8, core_array_TryFromSliceError + +*/ +typedef struct core_result_Result_8e_s +{ + core_result_Result_57_tags tag; + union { + Eurydice_array_u8x8 case_Ok; + core_array_TryFromSliceError case_Err; + } + val; +} +core_result_Result_8e; + +/** +This function found in impl {core::result::Result[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of core.result.unwrap_26 +with types Eurydice_arr uint8_t[[$8size_t]], core_array_TryFromSliceError + +*/ +static inline Eurydice_array_u8x8 core_result_unwrap_26_e0(core_result_Result_8e self) +{ + if (self.tag == core_result_Ok) + { + return self.val.case_Ok; + } + else + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "unwrap not Ok"); + KRML_HOST_EXIT(255U); + } +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 168 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d41(Eurydice_arr_c5 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +/** +A monomorphic instance of Eurydice.arr +with types uint64_t +with const generics +- $24size_t +*/ +typedef struct Eurydice_arr_22_s { uint64_t data[24U]; } Eurydice_arr_22; + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_ff +with const generics +- $1size_t +*/ +typedef struct Eurydice_arr_0b_s { Eurydice_arr_ff data[1U]; } Eurydice_arr_0b; + +/** +A monomorphic instance of Eurydice.arr +with types uint64_t +with const generics +- $25size_t +*/ +typedef struct Eurydice_arr_7c_s { uint64_t data[25U]; } Eurydice_arr_7c; + +/** +A monomorphic instance of Eurydice.slice_subslice_shared +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t + +*/ +static inline Eurydice_borrow_slice_u8 +Eurydice_slice_subslice_shared_c8(Eurydice_borrow_slice_u8 s, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_borrow_slice_u8){ .ptr = s.ptr + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.arr +with types int32_t +with const generics +- $8size_t +*/ +typedef struct Eurydice_arr_4d_s { int32_t data[8U]; } Eurydice_arr_4d; + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types int32_t, core_ops_range_Range size_t, Eurydice_derefed_slice int32_t +with const generics +- N= 8 +*/ +static inline Eurydice_dst_ref_shared_83 +Eurydice_array_to_subslice_shared_44(const Eurydice_arr_4d *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_dst_ref_shared_83){ .ptr = a->data + r.start, .meta = r.end - r.start } + ); +} + +/** + Declassify secret memory. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_declassify +with types bool + +*/ +static KRML_MUSTINLINE void libcrux_secrets_mem_requests_ct_declassify_5f(const bool *val) +{ + +} + +typedef struct int32_t_x2_s +{ + int32_t fst; + int32_t snd; +} +int32_t_x2; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types int32_t +with const generics +- N= 8 +*/ +static inline Eurydice_dst_ref_shared_83 +Eurydice_array_to_slice_shared_fd(const Eurydice_arr_4d *a) +{ + Eurydice_dst_ref_shared_83 lit; + lit.ptr = a->data; + lit.meta = (size_t)8U; + return lit; +} + +/** +A monomorphic instance of Eurydice.slice_subslice_shared +with types int32_t, core_ops_range_Range size_t, Eurydice_derefed_slice int32_t + +*/ +static inline Eurydice_dst_ref_shared_83 +Eurydice_slice_subslice_shared_47(Eurydice_dst_ref_shared_83 s, core_ops_range_Range_87 r) +{ + return + (KRML_CLITERAL(Eurydice_dst_ref_shared_83){ .ptr = s.ptr + r.start, .meta = r.end - r.start }); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types int32_t +with const generics +- N= 8 +*/ +static inline Eurydice_dst_ref_mut_83 Eurydice_array_to_slice_mut_fd(Eurydice_arr_4d *a) +{ + Eurydice_dst_ref_mut_83 lit; + lit.ptr = a->data; + lit.meta = (size_t)8U; + return lit; +} + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_c9 + +*/ +typedef struct core_option_Option_57_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_c9 f0; +} +core_option_Option_57; + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 34 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d40(Eurydice_arr_31 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +typedef struct uint8_t_x2_s +{ + uint8_t fst; + uint8_t snd; +} +uint8_t_x2; + +/** +A monomorphic instance of Eurydice.array_to_subslice_mut +with types uint8_t, core_ops_range_Range size_t, Eurydice_derefed_slice uint8_t +with const generics +- N= 66 +*/ +static inline Eurydice_mut_borrow_slice_u8 +Eurydice_array_to_subslice_mut_d4(Eurydice_arr_91 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_mut_borrow_slice_u8){ + .ptr = a->data + r.start, + .meta = r.end - r.start + } + ); +} + +typedef struct libcrux_ml_kem_utils_extraction_helper_Keypair768_s +{ + Eurydice_arr_0e fst; + Eurydice_arr_5f snd; +} +libcrux_ml_kem_utils_extraction_helper_Keypair768; + +/** +This function found in impl {libcrux_secrets::traits::Declassify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types uint64_t + +*/ +static KRML_MUSTINLINE uint64_t +libcrux_secrets_int_public_integers_declassify_d8_49(uint64_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Classify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 +with types uint32_t + +*/ +static KRML_MUSTINLINE uint32_t +libcrux_secrets_int_public_integers_classify_27_df(uint32_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Classify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 +with types uint64_t + +*/ +static KRML_MUSTINLINE uint64_t +libcrux_secrets_int_public_integers_classify_27_49(uint64_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Declassify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types uint16_t + +*/ +static KRML_MUSTINLINE uint16_t +libcrux_secrets_int_public_integers_declassify_d8_de(uint16_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Classify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 +with types uint16_t + +*/ +static KRML_MUSTINLINE uint16_t +libcrux_secrets_int_public_integers_classify_27_de(uint16_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Declassify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types uint32_t + +*/ +static KRML_MUSTINLINE uint32_t +libcrux_secrets_int_public_integers_declassify_d8_df(uint32_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Declassify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types int32_t + +*/ +static KRML_MUSTINLINE int32_t +libcrux_secrets_int_public_integers_declassify_d8_a8(int32_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Classify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 +with types int32_t + +*/ +static KRML_MUSTINLINE int32_t libcrux_secrets_int_public_integers_classify_27_a8(int32_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Declassify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types uint8_t + +*/ +static KRML_MUSTINLINE uint8_t +libcrux_secrets_int_public_integers_declassify_d8_90(uint8_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Classify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 +with types int16_t + +*/ +static KRML_MUSTINLINE int16_t libcrux_secrets_int_public_integers_classify_27_39(int16_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Declassify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 +with types int16_t + +*/ +static KRML_MUSTINLINE int16_t +libcrux_secrets_int_public_integers_declassify_d8_39(int16_t self) +{ + return self; +} + +/** +This function found in impl {libcrux_secrets::traits::Classify for T} +*/ +/** +A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 +with types uint8_t + +*/ +static KRML_MUSTINLINE uint8_t libcrux_secrets_int_public_integers_classify_27_90(uint8_t self) +{ + return self; +} + +#if defined(__cplusplus) +} +#endif + +#define combined_core_H_DEFINED +#endif /* combined_core_H */ + +/* from libcrux/combined_extraction/generated/libcrux_sha3_portable.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_sha3_portable_H +#define libcrux_sha3_portable_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.KeccakState +with types uint64_t +with const generics +- $1size_t +*/ +typedef Eurydice_arr_7c libcrux_sha3_generic_keccak_KeccakState_f3; + +typedef libcrux_sha3_generic_keccak_KeccakState_f3 libcrux_sha3_portable_KeccakState; + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.KeccakXofState +with types uint64_t +with const generics +- $1size_t +- $136size_t +*/ +typedef struct libcrux_sha3_generic_keccak_xof_KeccakXofState_8d_s +{ + Eurydice_arr_7c inner; + Eurydice_arr_0b buf; + size_t buf_len; + bool sponge; +} +libcrux_sha3_generic_keccak_xof_KeccakXofState_8d; + +typedef libcrux_sha3_generic_keccak_xof_KeccakXofState_8d +libcrux_sha3_portable_incremental_Shake256Xof; + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_zero_d2(void) +{ + return 0ULL; +} + +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__veor5q_u64( + uint64_t a, + uint64_t b, + uint64_t c, + uint64_t d, + uint64_t e +) +{ + return (((a ^ b) ^ c) ^ d) ^ e; +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor5_d2(uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e) +{ + return libcrux_sha3_simd_portable__veor5q_u64(a, b, c, d, e); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 1 +- RIGHT= 63 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_76(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)1); +} + +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable__vrax1q_u64(uint64_t a, uint64_t b) +{ + return a ^ libcrux_sha3_simd_portable_rotate_left_76(b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vrax1q_u64(a, b); +} + +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vbcaxq_u64(uint64_t a, uint64_t b, uint64_t c) +{ + return a ^ (b & ~c); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_and_not_xor_d2(uint64_t a, uint64_t b, uint64_t c) +{ + return libcrux_sha3_simd_portable__vbcaxq_u64(a, b, c); +} + +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable__veorq_n_u64(uint64_t a, uint64_t c) +{ + return a ^ c; +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_constant_d2(uint64_t a, uint64_t c) +{ + return libcrux_sha3_simd_portable__veorq_n_u64(a, c); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_xor_d2(uint64_t a, uint64_t b) +{ + return a ^ b; +} + +/** + Create a new Shake128 x4 state. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.new_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE Eurydice_arr_7c libcrux_sha3_generic_keccak_new_80_71(void) +{ + Eurydice_arr_7c lit; + uint64_t repeat_expression[25U]; + for (size_t i = (size_t)0U; i < (size_t)25U; i++) + { + repeat_expression[i] = libcrux_sha3_simd_portable_zero_d2(); + } + memcpy(lit.data, repeat_expression, (size_t)25U * sizeof (uint64_t)); + return lit; +} + +/** + Create a new SHAKE-128 state object. +*/ +static KRML_MUSTINLINE Eurydice_arr_7c libcrux_sha3_portable_incremental_shake128_init(void) +{ + return libcrux_sha3_generic_keccak_new_80_71(); +} + +#define LIBCRUX_SHA3_GENERIC_KECCAK_CONSTANTS_ROUNDCONSTANTS ((KRML_CLITERAL(Eurydice_arr_22){ .data = { 1ULL, 32898ULL, 9223372036854808714ULL, 9223372039002292224ULL, 32907ULL, 2147483649ULL, 9223372039002292353ULL, 9223372036854808585ULL, 138ULL, 136ULL, 2147516425ULL, 2147483658ULL, 2147516555ULL, 9223372036854775947ULL, 9223372036854808713ULL, 9223372036854808579ULL, 9223372036854808578ULL, 9223372036854775936ULL, 32778ULL, 9223372039002259466ULL, 9223372039002292353ULL, 9223372036854808704ULL, 2147483649ULL, 9223372039002292232ULL } })) + +/** +A monomorphic instance of libcrux_sha3.traits.get_ij +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE const +uint64_t +*libcrux_sha3_traits_get_ij_71(const Eurydice_arr_7c *arr, size_t i, size_t j) +{ + return &arr->data[(size_t)5U * j + i]; +} + +/** +A monomorphic instance of libcrux_sha3.traits.set_ij +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_traits_set_ij_71(Eurydice_arr_7c *arr, size_t i, size_t j, uint64_t value) +{ + arr->data[(size_t)5U * j + i] = value; +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_block_60( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start +) +{ + Eurydice_arr_7c state_flat = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) + { + size_t i0 = i; + size_t offset = start + (size_t)8U * i0; + Eurydice_array_u8x8 arr; + memcpy(arr.data, + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = offset, .end = offset + (size_t)8U })).ptr, + (size_t)8U * sizeof (uint8_t)); + Eurydice_array_u8x8 + uu____0 = + core_result_unwrap_26_e0(( + KRML_CLITERAL(core_result_Result_8e){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + )); + state_flat.data[i0] = core_num__u64__from_le_bytes(uu____0); + } + for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) + { + size_t i0 = i; + libcrux_sha3_traits_set_ij_71(state, + i0 / (size_t)5U, + i0 % (size_t)5U, + libcrux_sha3_traits_get_ij_71(state, i0 / (size_t)5U, i0 % (size_t)5U)[0U] ^ + state_flat.data[i0]); + } +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last +with const generics +- RATE= 168 +- DELIMITER= 31 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_last_37( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start, + size_t len +) +{ + Eurydice_arr_c5 buffer = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d41(&buffer, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = len })), + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = start, .end = start + len })), + uint8_t); + buffer.data[len] = 31U; + size_t uu____0 = (size_t)168U - (size_t)1U; + buffer.data[uu____0] = (uint32_t)buffer.data[uu____0] | 128U; + libcrux_sha3_simd_portable_load_block_60(state, + Eurydice_array_to_slice_shared_2c(&buffer), + (size_t)0U); +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 +with const generics +- RATE= 168 +- DELIMITER= 31 +*/ +static inline void +libcrux_sha3_simd_portable_load_last_a1_37( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_37(self, input->data[0U], start, len); +} + +/** + Get element `[i, j]`. +*/ +/** +This function found in impl {core::ops::index::Index<(usize, usize), T> for libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.index_c2 +with types uint64_t +with const generics +- N= 1 +*/ +static inline const +uint64_t +*libcrux_sha3_generic_keccak_index_c2_71(const Eurydice_arr_7c *self, size_t_x2 index) +{ + return libcrux_sha3_traits_get_ij_71(self, index.fst, index.snd); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.theta_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE Eurydice_arr_84 +libcrux_sha3_generic_keccak_theta_80_71(Eurydice_arr_7c *self) +{ + Eurydice_arr_84 + c = + { + .data = { + libcrux_sha3_simd_portable_xor5_d2(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)0U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)0U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)0U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)0U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)0U }))[0U]), + libcrux_sha3_simd_portable_xor5_d2(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)1U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)1U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)1U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)1U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)1U }))[0U]), + libcrux_sha3_simd_portable_xor5_d2(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)2U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)2U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)2U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)2U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)2U }))[0U]), + libcrux_sha3_simd_portable_xor5_d2(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)3U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)3U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)3U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)3U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)3U }))[0U]), + libcrux_sha3_simd_portable_xor5_d2(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)4U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)4U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)4U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)4U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)4U }))[0U]) + } + }; + return + ( + KRML_CLITERAL(Eurydice_arr_84){ + .data = { + libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(c.data[((size_t)0U + (size_t)4U) % + (size_t)5U], + c.data[((size_t)0U + (size_t)1U) % (size_t)5U]), + libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(c.data[((size_t)1U + (size_t)4U) % + (size_t)5U], + c.data[((size_t)1U + (size_t)1U) % (size_t)5U]), + libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(c.data[((size_t)2U + (size_t)4U) % + (size_t)5U], + c.data[((size_t)2U + (size_t)1U) % (size_t)5U]), + libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(c.data[((size_t)3U + (size_t)4U) % + (size_t)5U], + c.data[((size_t)3U + (size_t)1U) % (size_t)5U]), + libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(c.data[((size_t)4U + (size_t)4U) % + (size_t)5U], + c.data[((size_t)4U + (size_t)1U) % (size_t)5U]) + } + } + ); +} + +/** + Set element `[i, j] = v`. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.set_80 +with types uint64_t +with const generics +- N= 1 +*/ +static inline void +libcrux_sha3_generic_keccak_set_80_71(Eurydice_arr_7c *self, size_t i, size_t j, uint64_t v) +{ + libcrux_sha3_traits_set_ij_71(self, i, j, v); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 36 +- RIGHT= 28 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_02(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)36); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 36 +- RIGHT= 28 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_02(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_02(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 36 +- RIGHT= 28 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_02(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_02(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 3 +- RIGHT= 61 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_ac(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)3); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 3 +- RIGHT= 61 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_ac(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_ac(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 3 +- RIGHT= 61 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_ac(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_ac(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 41 +- RIGHT= 23 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_020(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)41); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 41 +- RIGHT= 23 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_020(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_020(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 41 +- RIGHT= 23 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_020(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_020(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 18 +- RIGHT= 46 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_a9(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)18); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 18 +- RIGHT= 46 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_a9(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_a9(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 18 +- RIGHT= 46 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_a9(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_a9(a, b); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.rho_0_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_rho_0_80_71(Eurydice_arr_7c *self, Eurydice_arr_84 t) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)0U, + libcrux_sha3_simd_portable_xor_d2(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)0U }))[0U], + t.data[0U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)0U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_02(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)0U }))[0U], + t.data[0U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)0U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_ac(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)0U }))[0U], + t.data[0U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)0U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_020(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)0U }))[0U], + t.data[0U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)0U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_a9(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)0U }))[0U], + t.data[0U])); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 1 +- RIGHT= 63 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_76(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_76(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 1 +- RIGHT= 63 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_76(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_76(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 44 +- RIGHT= 20 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_58(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)44); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 44 +- RIGHT= 20 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_58(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_58(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 44 +- RIGHT= 20 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_58(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_58(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 10 +- RIGHT= 54 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_e0(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)10); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 10 +- RIGHT= 54 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_e0(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_e0(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 10 +- RIGHT= 54 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_e0(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_e0(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 45 +- RIGHT= 19 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_63(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)45); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 45 +- RIGHT= 19 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_63(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_63(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 45 +- RIGHT= 19 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_63(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_63(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 2 +- RIGHT= 62 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_6a(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)2); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 2 +- RIGHT= 62 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_6a(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_6a(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 2 +- RIGHT= 62 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_6a(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_6a(a, b); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.rho_1_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_rho_1_80_71(Eurydice_arr_7c *self, Eurydice_arr_84 t) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)1U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_76(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)1U }))[0U], + t.data[1U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)1U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_58(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)1U }))[0U], + t.data[1U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)1U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_e0(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)1U }))[0U], + t.data[1U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)1U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_63(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)1U }))[0U], + t.data[1U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)1U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_6a(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)1U }))[0U], + t.data[1U])); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 62 +- RIGHT= 2 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_ab(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)62); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 62 +- RIGHT= 2 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_ab(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_ab(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 62 +- RIGHT= 2 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_ab(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_ab(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 6 +- RIGHT= 58 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_5b(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)6); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 6 +- RIGHT= 58 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_5b(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_5b(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 6 +- RIGHT= 58 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_5b(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_5b(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 43 +- RIGHT= 21 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_6f(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)43); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 43 +- RIGHT= 21 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_6f(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_6f(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 43 +- RIGHT= 21 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_6f(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_6f(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 15 +- RIGHT= 49 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_62(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)15); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 15 +- RIGHT= 49 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_62(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_62(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 15 +- RIGHT= 49 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_62(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_62(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 61 +- RIGHT= 3 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_23(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)61); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 61 +- RIGHT= 3 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_23(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_23(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 61 +- RIGHT= 3 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_23(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_23(a, b); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.rho_2_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_rho_2_80_71(Eurydice_arr_7c *self, Eurydice_arr_84 t) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)2U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_ab(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)2U }))[0U], + t.data[2U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)2U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_5b(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)2U }))[0U], + t.data[2U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)2U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_6f(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)2U }))[0U], + t.data[2U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)2U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_62(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)2U }))[0U], + t.data[2U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)2U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_23(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)2U }))[0U], + t.data[2U])); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 28 +- RIGHT= 36 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_37(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)28); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 28 +- RIGHT= 36 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_37(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_37(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 28 +- RIGHT= 36 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_37(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_37(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 55 +- RIGHT= 9 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_bb(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)55); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 55 +- RIGHT= 9 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_bb(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_bb(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 55 +- RIGHT= 9 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_bb(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_bb(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 25 +- RIGHT= 39 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_b9(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)25); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 25 +- RIGHT= 39 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_b9(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_b9(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 25 +- RIGHT= 39 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_b9(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_b9(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 21 +- RIGHT= 43 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_54(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)21); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 21 +- RIGHT= 43 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_54(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_54(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 21 +- RIGHT= 43 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_54(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_54(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 56 +- RIGHT= 8 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_4c(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)56); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 56 +- RIGHT= 8 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_4c(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_4c(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 56 +- RIGHT= 8 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_4c(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_4c(a, b); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.rho_3_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_rho_3_80_71(Eurydice_arr_7c *self, Eurydice_arr_84 t) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)3U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_37(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)3U }))[0U], + t.data[3U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)3U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_bb(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)3U }))[0U], + t.data[3U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)3U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_b9(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)3U }))[0U], + t.data[3U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)3U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_54(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)3U }))[0U], + t.data[3U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)3U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_4c(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)3U }))[0U], + t.data[3U])); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 27 +- RIGHT= 37 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_ce(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)27); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 27 +- RIGHT= 37 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_ce(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_ce(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 27 +- RIGHT= 37 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_ce(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_ce(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 20 +- RIGHT= 44 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_77(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)20); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 20 +- RIGHT= 44 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_77(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_77(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 20 +- RIGHT= 44 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_77(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_77(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 39 +- RIGHT= 25 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_25(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)39); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 39 +- RIGHT= 25 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_25(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_25(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 39 +- RIGHT= 25 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_25(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_25(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 8 +- RIGHT= 56 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_af(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)8); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 8 +- RIGHT= 56 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_af(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_af(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 8 +- RIGHT= 56 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_af(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_af(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.rotate_left +with const generics +- LEFT= 14 +- RIGHT= 50 +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_rotate_left_fd(uint64_t x) +{ + return core_num__u64__rotate_left(x, (uint32_t)14); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 +with const generics +- LEFT= 14 +- RIGHT= 50 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable__vxarq_u64_fd(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable_rotate_left_fd(a ^ b); +} + +/** +This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 +with const generics +- LEFT= 14 +- RIGHT= 50 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_simd_portable_xor_and_rotate_d2_fd(uint64_t a, uint64_t b) +{ + return libcrux_sha3_simd_portable__vxarq_u64_fd(a, b); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.rho_4_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_rho_4_80_71(Eurydice_arr_7c *self, Eurydice_arr_84 t) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)4U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_ce(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)4U }))[0U], + t.data[4U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)4U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_77(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)4U }))[0U], + t.data[4U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)4U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_25(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)4U }))[0U], + t.data[4U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)4U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_af(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)4U }))[0U], + t.data[4U])); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)4U, + libcrux_sha3_simd_portable_xor_and_rotate_d2_fd(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)4U }))[0U], + t.data[4U])); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.rho_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_rho_80_71(Eurydice_arr_7c *self, Eurydice_arr_84 t) +{ + libcrux_sha3_generic_keccak_rho_0_80_71(self, t); + libcrux_sha3_generic_keccak_rho_1_80_71(self, t); + libcrux_sha3_generic_keccak_rho_2_80_71(self, t); + libcrux_sha3_generic_keccak_rho_3_80_71(self, t); + libcrux_sha3_generic_keccak_rho_4_80_71(self, t); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.pi_0_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_pi_0_80_71(Eurydice_arr_7c *self, Eurydice_arr_7c old) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)0U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)3U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)0U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)1U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)0U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)4U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)0U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)2U }))[0U]); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.pi_1_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_pi_1_80_71(Eurydice_arr_7c *self, Eurydice_arr_7c old) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)1U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)1U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)1U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)4U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)1U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)2U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)1U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)0U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)1U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)1U, .snd = (size_t)3U }))[0U]); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.pi_2_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_pi_2_80_71(Eurydice_arr_7c *self, Eurydice_arr_7c old) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)2U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)2U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)2U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)0U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)2U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)3U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)2U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)1U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)2U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)2U, .snd = (size_t)4U }))[0U]); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.pi_3_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_pi_3_80_71(Eurydice_arr_7c *self, Eurydice_arr_7c old) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)3U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)3U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)3U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)1U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)3U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)4U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)3U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)2U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)3U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)3U, .snd = (size_t)0U }))[0U]); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.pi_4_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_pi_4_80_71(Eurydice_arr_7c *self, Eurydice_arr_7c old) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)4U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)4U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)1U, + (size_t)4U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)2U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)2U, + (size_t)4U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)0U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)3U, + (size_t)4U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)3U }))[0U]); + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)4U, + (size_t)4U, + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)4U, .snd = (size_t)1U }))[0U]); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.pi_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_pi_80_71(Eurydice_arr_7c *self) +{ + Eurydice_arr_7c old = self[0U]; + libcrux_sha3_generic_keccak_pi_0_80_71(self, old); + libcrux_sha3_generic_keccak_pi_1_80_71(self, old); + libcrux_sha3_generic_keccak_pi_2_80_71(self, old); + libcrux_sha3_generic_keccak_pi_3_80_71(self, old); + libcrux_sha3_generic_keccak_pi_4_80_71(self, old); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.chi_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_chi_80_71(Eurydice_arr_7c *self) +{ + Eurydice_arr_7c old = self[0U]; + for (size_t i0 = (size_t)0U; i0 < (size_t)5U; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)5U; i++) + { + size_t j = i; + libcrux_sha3_generic_keccak_set_80_71(self, + i1, + j, + libcrux_sha3_simd_portable_and_not_xor_d2(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = i1, .snd = j }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = i1, .snd = (j + (size_t)2U) % (size_t)5U }))[0U], + libcrux_sha3_generic_keccak_index_c2_71(&old, + (KRML_CLITERAL(size_t_x2){ .fst = i1, .snd = (j + (size_t)1U) % (size_t)5U }))[0U])); + } + } +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.iota_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_iota_80_71(Eurydice_arr_7c *self, size_t i) +{ + libcrux_sha3_generic_keccak_set_80_71(self, + (size_t)0U, + (size_t)0U, + libcrux_sha3_simd_portable_xor_constant_d2(libcrux_sha3_generic_keccak_index_c2_71(self, + (KRML_CLITERAL(size_t_x2){ .fst = (size_t)0U, .snd = (size_t)0U }))[0U], + LIBCRUX_SHA3_GENERIC_KECCAK_CONSTANTS_ROUNDCONSTANTS.data[i])); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.keccakf1600_80 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_keccakf1600_80_71(Eurydice_arr_7c *self) +{ + for (size_t i = (size_t)0U; i < (size_t)24U; i++) + { + size_t i0 = i; + Eurydice_arr_84 t = libcrux_sha3_generic_keccak_theta_80_71(self); + libcrux_sha3_generic_keccak_rho_80_71(self, t); + libcrux_sha3_generic_keccak_pi_80_71(self); + libcrux_sha3_generic_keccak_chi_80_71(self); + libcrux_sha3_generic_keccak_iota_80_71(self, i0); + } +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 168 +- DELIM= 31 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_final_80_bd( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_a1_37(self, input, start, len); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** + Absorb +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake128_absorb_final( + Eurydice_arr_7c *s, + Eurydice_borrow_slice_u8 data0 +) +{ + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { data0 } }; + libcrux_sha3_generic_keccak_absorb_final_80_bd(s, &lvalue, (size_t)0U, data0.meta); +} + +/** + Create a new SHAKE-256 state object. +*/ +static KRML_MUSTINLINE Eurydice_arr_7c libcrux_sha3_portable_incremental_shake256_init(void) +{ + return libcrux_sha3_generic_keccak_new_80_71(); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_block_b2( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start +) +{ + Eurydice_arr_7c state_flat = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) + { + size_t i0 = i; + size_t offset = start + (size_t)8U * i0; + Eurydice_array_u8x8 arr; + memcpy(arr.data, + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = offset, .end = offset + (size_t)8U })).ptr, + (size_t)8U * sizeof (uint8_t)); + Eurydice_array_u8x8 + uu____0 = + core_result_unwrap_26_e0(( + KRML_CLITERAL(core_result_Result_8e){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + )); + state_flat.data[i0] = core_num__u64__from_le_bytes(uu____0); + } + for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) + { + size_t i0 = i; + libcrux_sha3_traits_set_ij_71(state, + i0 / (size_t)5U, + i0 % (size_t)5U, + libcrux_sha3_traits_get_ij_71(state, i0 / (size_t)5U, i0 % (size_t)5U)[0U] ^ + state_flat.data[i0]); + } +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last +with const generics +- RATE= 136 +- DELIMITER= 31 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_last_22( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start, + size_t len +) +{ + Eurydice_arr_ff buffer = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d42(&buffer, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = len })), + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = start, .end = start + len })), + uint8_t); + buffer.data[len] = 31U; + size_t uu____0 = (size_t)136U - (size_t)1U; + buffer.data[uu____0] = (uint32_t)buffer.data[uu____0] | 128U; + libcrux_sha3_simd_portable_load_block_b2(state, + Eurydice_array_to_slice_shared_58(&buffer), + (size_t)0U); +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 +with const generics +- RATE= 136 +- DELIMITER= 31 +*/ +static inline void +libcrux_sha3_simd_portable_load_last_a1_22( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_22(self, input->data[0U], start, len); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 136 +- DELIM= 31 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_final_80_bd0( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_a1_22(self, input, start, len); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** + Absorb some data for SHAKE-256 for the last time +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake256_absorb_final( + Eurydice_arr_7c *s, + Eurydice_borrow_slice_u8 data +) +{ + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { data } }; + libcrux_sha3_generic_keccak_absorb_final_80_bd0(s, &lvalue, (size_t)0U, data.meta); +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 +with const generics +- RATE= 168 +*/ +static inline void +libcrux_sha3_simd_portable_load_block_a1_60( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_60(self, input->data[0U], start); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_block_80_e9( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_a1_60(self, input, start); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.store_block +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_store_block_60( + const Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + size_t octets = len / (size_t)8U; + for (size_t i = (size_t)0U; i < octets; i++) + { + size_t i0 = i; + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + i0 / (size_t)5U, + i0 % (size_t)5U)[0U]); + size_t out_pos = start + (size_t)8U * i0; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + (size_t)8U })), + Eurydice_array_to_slice_shared_6e(&bytes), + uint8_t); + } + size_t remaining = len % (size_t)8U; + if (remaining > (size_t)0U) + { + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + octets / (size_t)5U, + octets % (size_t)5U)[0U]); + size_t out_pos = start + len - remaining; + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + remaining })); + Eurydice_slice_copy(uu____0, + Eurydice_array_to_subslice_to_shared_21(&bytes, remaining), + uint8_t); + } +} + +/** +This function found in impl {libcrux_sha3::traits::Squeeze for libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.squeeze_9b +with const generics +- RATE= 168 +*/ +static inline void +libcrux_sha3_simd_portable_squeeze_9b_60( + const Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_store_block_60(self, out, start, len); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 +with const generics +- RATE= 168 +- DELIM= 31 +*/ +static inline void +libcrux_sha3_generic_keccak_portable_keccak1_37( + Eurydice_borrow_slice_u8 input, + Eurydice_mut_borrow_slice_u8 output +) +{ + Eurydice_arr_7c s = libcrux_sha3_generic_keccak_new_80_71(); + size_t input_len = input.meta; + size_t input_blocks = input_len / (size_t)168U; + size_t input_rem = input_len % (size_t)168U; + for (size_t i = (size_t)0U; i < input_blocks; i++) + { + size_t i0 = i; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_block_80_e9(&s, &lvalue, i0 * (size_t)168U); + } + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_final_80_bd(&s, &lvalue, input_len - input_rem, input_rem); + size_t output_len = output.meta; + size_t output_blocks = output_len / (size_t)168U; + size_t output_rem = output_len % (size_t)168U; + if (output_blocks == (size_t)0U) + { + libcrux_sha3_simd_portable_squeeze_9b_60(&s, output, (size_t)0U, output_len); + } + else + { + libcrux_sha3_simd_portable_squeeze_9b_60(&s, output, (size_t)0U, (size_t)168U); + for (size_t i = (size_t)1U; i < output_blocks; i++) + { + size_t i0 = i; + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_60(&s, output, i0 * (size_t)168U, (size_t)168U); + } + if (output_rem != (size_t)0U) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_60(&s, output, output_len - output_rem, output_rem); + } + } +} + +/** + A portable SHAKE128 implementation. +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_shake128( + Eurydice_mut_borrow_slice_u8 digest, + Eurydice_borrow_slice_u8 data +) +{ + libcrux_sha3_generic_keccak_portable_keccak1_37(data, digest); +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 +with const generics +- RATE= 136 +*/ +static inline void +libcrux_sha3_simd_portable_load_block_a1_b2( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_b2(self, input->data[0U], start); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 136 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_block_80_e90( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_a1_b2(self, input, start); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.store_block +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_store_block_b2( + const Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + size_t octets = len / (size_t)8U; + for (size_t i = (size_t)0U; i < octets; i++) + { + size_t i0 = i; + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + i0 / (size_t)5U, + i0 % (size_t)5U)[0U]); + size_t out_pos = start + (size_t)8U * i0; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + (size_t)8U })), + Eurydice_array_to_slice_shared_6e(&bytes), + uint8_t); + } + size_t remaining = len % (size_t)8U; + if (remaining > (size_t)0U) + { + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + octets / (size_t)5U, + octets % (size_t)5U)[0U]); + size_t out_pos = start + len - remaining; + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + remaining })); + Eurydice_slice_copy(uu____0, + Eurydice_array_to_subslice_to_shared_21(&bytes, remaining), + uint8_t); + } +} + +/** +This function found in impl {libcrux_sha3::traits::Squeeze for libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.squeeze_9b +with const generics +- RATE= 136 +*/ +static inline void +libcrux_sha3_simd_portable_squeeze_9b_b2( + const Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_store_block_b2(self, out, start, len); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 +with const generics +- RATE= 136 +- DELIM= 31 +*/ +static inline void +libcrux_sha3_generic_keccak_portable_keccak1_22( + Eurydice_borrow_slice_u8 input, + Eurydice_mut_borrow_slice_u8 output +) +{ + Eurydice_arr_7c s = libcrux_sha3_generic_keccak_new_80_71(); + size_t input_len = input.meta; + size_t input_blocks = input_len / (size_t)136U; + size_t input_rem = input_len % (size_t)136U; + for (size_t i = (size_t)0U; i < input_blocks; i++) + { + size_t i0 = i; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_block_80_e90(&s, &lvalue, i0 * (size_t)136U); + } + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_final_80_bd0(&s, &lvalue, input_len - input_rem, input_rem); + size_t output_len = output.meta; + size_t output_blocks = output_len / (size_t)136U; + size_t output_rem = output_len % (size_t)136U; + if (output_blocks == (size_t)0U) + { + libcrux_sha3_simd_portable_squeeze_9b_b2(&s, output, (size_t)0U, output_len); + } + else + { + libcrux_sha3_simd_portable_squeeze_9b_b2(&s, output, (size_t)0U, (size_t)136U); + for (size_t i = (size_t)1U; i < output_blocks; i++) + { + size_t i0 = i; + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_b2(&s, output, i0 * (size_t)136U, (size_t)136U); + } + if (output_rem != (size_t)0U) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_b2(&s, output, output_len - output_rem, output_rem); + } + } +} + +/** + A portable SHAKE256 implementation. +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_shake256( + Eurydice_mut_borrow_slice_u8 digest, + Eurydice_borrow_slice_u8 data +) +{ + libcrux_sha3_generic_keccak_portable_keccak1_22(data, digest); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.squeeze_first_block_b4 +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_portable_squeeze_first_block_b4_b2( + const Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_simd_portable_squeeze_9b_b2(self, out, (size_t)0U, (size_t)136U); +} + +/** + Squeeze the first SHAKE-256 block +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake256_squeeze_first_block( + Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_generic_keccak_portable_squeeze_first_block_b4_b2(&s[0U], out); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.squeeze_first_five_blocks_b4 +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_portable_squeeze_first_five_blocks_b4_60( + Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, (size_t)0U, (size_t)168U); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, (size_t)168U, (size_t)168U); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, (size_t)2U * (size_t)168U, (size_t)168U); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, (size_t)3U * (size_t)168U, (size_t)168U); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, (size_t)4U * (size_t)168U, (size_t)168U); +} + +/** + Squeeze five blocks +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks( + Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out0 +) +{ + libcrux_sha3_generic_keccak_portable_squeeze_first_five_blocks_b4_60(s, out0); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.squeeze_next_block_b4 +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_60( + Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out, + size_t start +) +{ + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, start, (size_t)168U); +} + +/** + Squeeze another block +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake128_squeeze_next_block( + Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out0 +) +{ + libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_60(s, out0, (size_t)0U); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.squeeze_next_block_b4 +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_b2( + Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out, + size_t start +) +{ + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); + libcrux_sha3_simd_portable_squeeze_9b_b2(self, out, start, (size_t)136U); +} + +/** + Squeeze the next SHAKE-256 block +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake256_squeeze_next_block( + Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_b2(s, out, (size_t)0U); +} + +/** + Try to complete the internal partial buffer by consuming the minimum required + number of bytes from the provided `inputs` so that `self.buf` becomes exactly + one full block of size `RATE`. + + Behaviour: + - If `self.buf_len` is 0 (no buffered bytes) or already equal to `RATE` + (already a full block), or if the combined available bytes in `inputs` are + not enough to reach `RATE`, the function does nothing and returns 0. + - If `0 < self.buf_len < RATE` and `inputs[..]` contain at least + `RATE - self.buf_len` bytes, the function copies exactly + `consumed = RATE - self.buf_len` bytes from each lane `inputs[i]` into + `self.buf[i]` starting at the current `self.buf_len` offset, sets + `self.buf_len = RATE`, and returns `consumed`. + + Returns the `consumed` bytes from `inputs` if there's enough buffered + content to consume, and `0` otherwise. + If `consumed > 0` is returned, `self.buf` contains a full block to be + loaded. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.fill_buffer_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static inline size_t +libcrux_sha3_generic_keccak_xof_fill_buffer_35_e9( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + const Eurydice_arr_dc *inputs +) +{ + size_t input_len = inputs->data->meta; + size_t uu____0; + if (self->buf_len != (size_t)0U) + { + if (input_len >= (size_t)136U - self->buf_len) + { + size_t consumed = (size_t)136U - self->buf_len; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) + { + size_t i0 = i; + Eurydice_slice_copy(Eurydice_array_to_subslice_from_mut_5f(&self->buf.data[i0], + self->buf_len), + Eurydice_slice_subslice_to_shared_72(inputs->data[i0], consumed), + uint8_t); + } + self->buf_len = (size_t)136U; + uu____0 = consumed; + } + else + { + uu____0 = (size_t)0U; + } + } + else + { + uu____0 = (size_t)0U; + } + return uu____0; +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.buf_to_slices.closure +with const generics +- $1size_t +- $136size_t +*/ +typedef const Eurydice_arr_0b *libcrux_sha3_generic_keccak_xof_buf_to_slices_closure_94; + +/** +This function found in impl {core::ops::function::FnMut<(usize), &'_ ([u8])> for libcrux_sha3::generic_keccak::xof::buf_to_slices::closure<0, PARALLEL_LANES, RATE>} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.buf_to_slices.call_mut_2a +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static inline Eurydice_borrow_slice_u8 +libcrux_sha3_generic_keccak_xof_buf_to_slices_call_mut_2a_81( + const Eurydice_arr_0b **_, + size_t tupled_args +) +{ + size_t i = tupled_args; + return + core_array___T__N___as_slice((size_t)136U, + &_[0U]->data[i], + uint8_t, + Eurydice_borrow_slice_u8); +} + +/** +This function found in impl {core::ops::function::FnOnce<(usize), &'_ ([u8])> for libcrux_sha3::generic_keccak::xof::buf_to_slices::closure<0, PARALLEL_LANES, RATE>} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.buf_to_slices.call_once_fa +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static inline Eurydice_borrow_slice_u8 +libcrux_sha3_generic_keccak_xof_buf_to_slices_call_once_fa_81( + const Eurydice_arr_0b *_, + size_t _0 +) +{ + return libcrux_sha3_generic_keccak_xof_buf_to_slices_call_mut_2a_81(&_, _0); +} + +/** + Note: This function exists to work around a hax bug where `core::array::from_fn` + is extracted with an incorrect explicit type parameter `#(usize -> t_Slice u8)` + instead of using the typeclass-based implicit parameter `#v_F` from + `Core_models.Array.from_fn`. + See: https://github.com/cryspen/hax/issues/1920 +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.buf_to_slices +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static KRML_MUSTINLINE Eurydice_arr_dc +libcrux_sha3_generic_keccak_xof_buf_to_slices_81(const Eurydice_arr_0b *buf) +{ + Eurydice_arr_dc arr_struct; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) + { + arr_struct.data[i] = libcrux_sha3_generic_keccak_xof_buf_to_slices_call_mut_2a_81(&buf, i); + } + return arr_struct; +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_full_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static inline size_t +libcrux_sha3_generic_keccak_xof_absorb_full_35_e9( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + const Eurydice_arr_dc *inputs +) +{ + size_t consumed = libcrux_sha3_generic_keccak_xof_fill_buffer_35_e9(self, inputs); + if (self->buf_len == (size_t)136U) + { + Eurydice_arr_dc borrowed = libcrux_sha3_generic_keccak_xof_buf_to_slices_81(&self->buf); + libcrux_sha3_simd_portable_load_block_a1_b2(&self->inner, &borrowed, (size_t)0U); + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + self->buf_len = (size_t)0U; + } + size_t input_to_consume = inputs->data->meta - consumed; + size_t num_blocks = input_to_consume / (size_t)136U; + size_t remainder = input_to_consume % (size_t)136U; + for (size_t i = (size_t)0U; i < num_blocks; i++) + { + size_t i0 = i; + size_t start = i0 * (size_t)136U + consumed; + libcrux_sha3_simd_portable_load_block_a1_b2(&self->inner, inputs, start); + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + } + return remainder; +} + +/** + Absorb + + This function takes any number of bytes to absorb and buffers if it's not enough. + The function assumes that all input slices in `inputs` have the same length. + + Only a multiple of `RATE` blocks are absorbed. + For the remaining bytes [`absorb_final`] needs to be called. + + This works best with relatively small `inputs`. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_xof_absorb_35_e9( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + const Eurydice_arr_dc *inputs +) +{ + size_t remainder = libcrux_sha3_generic_keccak_xof_absorb_full_35_e9(self, inputs); + if (remainder > (size_t)0U) + { + size_t input_len = inputs->data->meta; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) + { + size_t i0 = i; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d42(&self->buf.data[i0], + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = self->buf_len, + .end = self->buf_len + remainder + } + )), + Eurydice_slice_subslice_shared_c8(inputs->data[i0], + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = input_len - remainder, + .end = input_len + } + )), + uint8_t); + } + self->buf_len += remainder; + } +} + +/** + Shake256 absorb +*/ +/** +This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize> for libcrux_sha3::portable::incremental::Shake256Xof} +*/ +static inline void +libcrux_sha3_portable_incremental_absorb_42( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + Eurydice_borrow_slice_u8 input +) +{ + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_xof_absorb_35_e9(self, &lvalue); +} + +/** + Absorb a final block. + + The `inputs` block may be empty. Everything in the `inputs` block beyond + `RATE` bytes is ignored. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_final_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +- DELIMITER= 31 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_xof_absorb_final_35_bd( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + const Eurydice_arr_dc *inputs +) +{ + libcrux_sha3_generic_keccak_xof_absorb_35_e9(self, inputs); + Eurydice_arr_dc borrowed = libcrux_sha3_generic_keccak_xof_buf_to_slices_81(&self->buf); + libcrux_sha3_simd_portable_load_last_a1_22(&self->inner, &borrowed, (size_t)0U, self->buf_len); + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); +} + +/** + Shake256 absorb final +*/ +/** +This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize> for libcrux_sha3::portable::incremental::Shake256Xof} +*/ +static inline void +libcrux_sha3_portable_incremental_absorb_final_42( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + Eurydice_borrow_slice_u8 input +) +{ + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_xof_absorb_final_35_bd(self, &lvalue); +} + +/** + An all zero block +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.zero_block_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static inline Eurydice_arr_ff libcrux_sha3_generic_keccak_xof_zero_block_35_e9(void) +{ + return (KRML_CLITERAL(Eurydice_arr_ff){ .data = { 0U } }); +} + +/** + Generate a new keccak xof state. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.new_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_8d +libcrux_sha3_generic_keccak_xof_new_35_e9(void) +{ + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d lit; + lit.inner = libcrux_sha3_generic_keccak_new_80_71(); + Eurydice_arr_ff repeat_expression[1U]; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) + { + repeat_expression[i] = libcrux_sha3_generic_keccak_xof_zero_block_35_e9(); + } + memcpy(lit.buf.data, repeat_expression, (size_t)1U * sizeof (Eurydice_arr_ff)); + lit.buf_len = (size_t)0U; + lit.sponge = false; + return lit; +} + +/** + Shake256 new state +*/ +/** +This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize> for libcrux_sha3::portable::incremental::Shake256Xof} +*/ +static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_8d +libcrux_sha3_portable_incremental_new_42(void) +{ + return libcrux_sha3_generic_keccak_xof_new_35_e9(); +} + +/** + Squeeze `N` x `LEN` bytes. Only `N = 1` for now. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.squeeze_85 +with types uint64_t +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_xof_squeeze_85_76( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + Eurydice_mut_borrow_slice_u8 out +) +{ + size_t out_len = out.meta; + if (!(out_len == (size_t)0U)) + { + if (self->sponge) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + } + if (out_len > (size_t)0U) + { + size_t blocks = out_len / (size_t)136U; + size_t last = out_len - out_len % (size_t)136U; + if (blocks == (size_t)0U) + { + libcrux_sha3_simd_portable_squeeze_9b_b2(&self->inner, out, (size_t)0U, out_len); + } + else + { + libcrux_sha3_simd_portable_squeeze_9b_b2(&self->inner, out, (size_t)0U, (size_t)136U); + for (size_t i = (size_t)1U; i < blocks; i++) + { + size_t i0 = i; + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + libcrux_sha3_simd_portable_squeeze_9b_b2(&self->inner, + out, + i0 * (size_t)136U, + (size_t)136U); + } + if (last < out_len) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + libcrux_sha3_simd_portable_squeeze_9b_b2(&self->inner, out, last, out_len - last); + } + } + } + self->sponge = true; + } +} + +/** + Shake256 squeeze +*/ +/** +This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize> for libcrux_sha3::portable::incremental::Shake256Xof} +*/ +static inline void +libcrux_sha3_portable_incremental_squeeze_42( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_generic_keccak_xof_squeeze_85_76(self, out); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block +with const generics +- RATE= 72 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_block_c6( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start +) +{ + Eurydice_arr_7c state_flat = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) + { + size_t i0 = i; + size_t offset = start + (size_t)8U * i0; + Eurydice_array_u8x8 arr; + memcpy(arr.data, + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = offset, .end = offset + (size_t)8U })).ptr, + (size_t)8U * sizeof (uint8_t)); + Eurydice_array_u8x8 + uu____0 = + core_result_unwrap_26_e0(( + KRML_CLITERAL(core_result_Result_8e){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + )); + state_flat.data[i0] = core_num__u64__from_le_bytes(uu____0); + } + for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) + { + size_t i0 = i; + libcrux_sha3_traits_set_ij_71(state, + i0 / (size_t)5U, + i0 % (size_t)5U, + libcrux_sha3_traits_get_ij_71(state, i0 / (size_t)5U, i0 % (size_t)5U)[0U] ^ + state_flat.data[i0]); + } +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 +with const generics +- RATE= 72 +*/ +static inline void +libcrux_sha3_simd_portable_load_block_a1_c6( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_c6(self, input->data[0U], start); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 72 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_block_80_e91( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_a1_c6(self, input, start); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last +with const generics +- RATE= 72 +- DELIMITER= 6 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_last_dc( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start, + size_t len +) +{ + Eurydice_arr_ab buffer = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d43(&buffer, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = len })), + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = start, .end = start + len })), + uint8_t); + buffer.data[len] = 6U; + size_t uu____0 = (size_t)72U - (size_t)1U; + buffer.data[uu____0] = (uint32_t)buffer.data[uu____0] | 128U; + libcrux_sha3_simd_portable_load_block_c6(state, + Eurydice_array_to_slice_shared_e2(&buffer), + (size_t)0U); +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 +with const generics +- RATE= 72 +- DELIMITER= 6 +*/ +static inline void +libcrux_sha3_simd_portable_load_last_a1_dc( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_dc(self, input->data[0U], start, len); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 72 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_final_80_bd1( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_a1_dc(self, input, start, len); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.store_block +with const generics +- RATE= 72 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_store_block_c6( + const Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + size_t octets = len / (size_t)8U; + for (size_t i = (size_t)0U; i < octets; i++) + { + size_t i0 = i; + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + i0 / (size_t)5U, + i0 % (size_t)5U)[0U]); + size_t out_pos = start + (size_t)8U * i0; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + (size_t)8U })), + Eurydice_array_to_slice_shared_6e(&bytes), + uint8_t); + } + size_t remaining = len % (size_t)8U; + if (remaining > (size_t)0U) + { + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + octets / (size_t)5U, + octets % (size_t)5U)[0U]); + size_t out_pos = start + len - remaining; + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + remaining })); + Eurydice_slice_copy(uu____0, + Eurydice_array_to_subslice_to_shared_21(&bytes, remaining), + uint8_t); + } +} + +/** +This function found in impl {libcrux_sha3::traits::Squeeze for libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.squeeze_9b +with const generics +- RATE= 72 +*/ +static inline void +libcrux_sha3_simd_portable_squeeze_9b_c6( + const Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_store_block_c6(self, out, start, len); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 +with const generics +- RATE= 72 +- DELIM= 6 +*/ +static inline void +libcrux_sha3_generic_keccak_portable_keccak1_dc( + Eurydice_borrow_slice_u8 input, + Eurydice_mut_borrow_slice_u8 output +) +{ + Eurydice_arr_7c s = libcrux_sha3_generic_keccak_new_80_71(); + size_t input_len = input.meta; + size_t input_blocks = input_len / (size_t)72U; + size_t input_rem = input_len % (size_t)72U; + for (size_t i = (size_t)0U; i < input_blocks; i++) + { + size_t i0 = i; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_block_80_e91(&s, &lvalue, i0 * (size_t)72U); + } + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_final_80_bd1(&s, &lvalue, input_len - input_rem, input_rem); + size_t output_len = output.meta; + size_t output_blocks = output_len / (size_t)72U; + size_t output_rem = output_len % (size_t)72U; + if (output_blocks == (size_t)0U) + { + libcrux_sha3_simd_portable_squeeze_9b_c6(&s, output, (size_t)0U, output_len); + } + else + { + libcrux_sha3_simd_portable_squeeze_9b_c6(&s, output, (size_t)0U, (size_t)72U); + for (size_t i = (size_t)1U; i < output_blocks; i++) + { + size_t i0 = i; + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_c6(&s, output, i0 * (size_t)72U, (size_t)72U); + } + if (output_rem != (size_t)0U) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_c6(&s, output, output_len - output_rem, output_rem); + } + } +} + +/** + A portable SHA3 512 implementation. +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_sha512( + Eurydice_mut_borrow_slice_u8 digest, + Eurydice_borrow_slice_u8 data +) +{ + libcrux_sha3_generic_keccak_portable_keccak1_dc(data, digest); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last +with const generics +- RATE= 136 +- DELIMITER= 6 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_last_220( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start, + size_t len +) +{ + Eurydice_arr_ff buffer = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d42(&buffer, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = len })), + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = start, .end = start + len })), + uint8_t); + buffer.data[len] = 6U; + size_t uu____0 = (size_t)136U - (size_t)1U; + buffer.data[uu____0] = (uint32_t)buffer.data[uu____0] | 128U; + libcrux_sha3_simd_portable_load_block_b2(state, + Eurydice_array_to_slice_shared_58(&buffer), + (size_t)0U); +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 +with const generics +- RATE= 136 +- DELIMITER= 6 +*/ +static inline void +libcrux_sha3_simd_portable_load_last_a1_220( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_220(self, input->data[0U], start, len); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 136 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_final_80_bd2( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_a1_220(self, input, start, len); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 +with const generics +- RATE= 136 +- DELIM= 6 +*/ +static inline void +libcrux_sha3_generic_keccak_portable_keccak1_220( + Eurydice_borrow_slice_u8 input, + Eurydice_mut_borrow_slice_u8 output +) +{ + Eurydice_arr_7c s = libcrux_sha3_generic_keccak_new_80_71(); + size_t input_len = input.meta; + size_t input_blocks = input_len / (size_t)136U; + size_t input_rem = input_len % (size_t)136U; + for (size_t i = (size_t)0U; i < input_blocks; i++) + { + size_t i0 = i; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_block_80_e90(&s, &lvalue, i0 * (size_t)136U); + } + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_final_80_bd2(&s, &lvalue, input_len - input_rem, input_rem); + size_t output_len = output.meta; + size_t output_blocks = output_len / (size_t)136U; + size_t output_rem = output_len % (size_t)136U; + if (output_blocks == (size_t)0U) + { + libcrux_sha3_simd_portable_squeeze_9b_b2(&s, output, (size_t)0U, output_len); + } + else + { + libcrux_sha3_simd_portable_squeeze_9b_b2(&s, output, (size_t)0U, (size_t)136U); + for (size_t i = (size_t)1U; i < output_blocks; i++) + { + size_t i0 = i; + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_b2(&s, output, i0 * (size_t)136U, (size_t)136U); + } + if (output_rem != (size_t)0U) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_b2(&s, output, output_len - output_rem, output_rem); + } + } +} + +/** + A portable SHA3 256 implementation. +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_sha256( + Eurydice_mut_borrow_slice_u8 digest, + Eurydice_borrow_slice_u8 data +) +{ + libcrux_sha3_generic_keccak_portable_keccak1_220(data, digest); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.squeeze_first_three_blocks_b4 +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_portable_squeeze_first_three_blocks_b4_60( + Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, (size_t)0U, (size_t)168U); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, (size_t)168U, (size_t)168U); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); + libcrux_sha3_simd_portable_squeeze_9b_60(self, out, (size_t)2U * (size_t)168U, (size_t)168U); +} + +/** + Squeeze three blocks +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks( + Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out0 +) +{ + libcrux_sha3_generic_keccak_portable_squeeze_first_three_blocks_b4_60(s, out0); +} + +#define libcrux_sha3_Algorithm_Sha224 1 +#define libcrux_sha3_Algorithm_Sha256 2 +#define libcrux_sha3_Algorithm_Sha384 3 +#define libcrux_sha3_Algorithm_Sha512 4 + +typedef uint8_t libcrux_sha3_Algorithm; + +#define LIBCRUX_SHA3_SHA3_224_DIGEST_SIZE ((size_t)28U) + +#define LIBCRUX_SHA3_SHA3_256_DIGEST_SIZE ((size_t)32U) + +#define LIBCRUX_SHA3_SHA3_384_DIGEST_SIZE ((size_t)48U) + +#define LIBCRUX_SHA3_SHA3_512_DIGEST_SIZE ((size_t)64U) + +/** + Returns the output size of a digest. +*/ +static inline size_t libcrux_sha3_digest_size(libcrux_sha3_Algorithm mode) +{ + switch (mode) + { + case libcrux_sha3_Algorithm_Sha224: + { + break; + } + case libcrux_sha3_Algorithm_Sha256: + { + return LIBCRUX_SHA3_SHA3_256_DIGEST_SIZE; + } + case libcrux_sha3_Algorithm_Sha384: + { + return LIBCRUX_SHA3_SHA3_384_DIGEST_SIZE; + } + case libcrux_sha3_Algorithm_Sha512: + { + return LIBCRUX_SHA3_SHA3_512_DIGEST_SIZE; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, __LINE__); + KRML_HOST_EXIT(253U); + } + } + return LIBCRUX_SHA3_SHA3_224_DIGEST_SIZE; +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block +with const generics +- RATE= 144 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_block_9e( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start +) +{ + Eurydice_arr_7c state_flat = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) + { + size_t i0 = i; + size_t offset = start + (size_t)8U * i0; + Eurydice_array_u8x8 arr; + memcpy(arr.data, + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = offset, .end = offset + (size_t)8U })).ptr, + (size_t)8U * sizeof (uint8_t)); + Eurydice_array_u8x8 + uu____0 = + core_result_unwrap_26_e0(( + KRML_CLITERAL(core_result_Result_8e){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + )); + state_flat.data[i0] = core_num__u64__from_le_bytes(uu____0); + } + for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) + { + size_t i0 = i; + libcrux_sha3_traits_set_ij_71(state, + i0 / (size_t)5U, + i0 % (size_t)5U, + libcrux_sha3_traits_get_ij_71(state, i0 / (size_t)5U, i0 % (size_t)5U)[0U] ^ + state_flat.data[i0]); + } +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 +with const generics +- RATE= 144 +*/ +static inline void +libcrux_sha3_simd_portable_load_block_a1_9e( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_9e(self, input->data[0U], start); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 144 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_block_80_e92( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_a1_9e(self, input, start); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last +with const generics +- RATE= 144 +- DELIMITER= 6 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_last_3a( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start, + size_t len +) +{ + Eurydice_arr_f4 buffer = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d44(&buffer, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = len })), + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = start, .end = start + len })), + uint8_t); + buffer.data[len] = 6U; + size_t uu____0 = (size_t)144U - (size_t)1U; + buffer.data[uu____0] = (uint32_t)buffer.data[uu____0] | 128U; + libcrux_sha3_simd_portable_load_block_9e(state, + Eurydice_array_to_slice_shared_38(&buffer), + (size_t)0U); +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 +with const generics +- RATE= 144 +- DELIMITER= 6 +*/ +static inline void +libcrux_sha3_simd_portable_load_last_a1_3a( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_3a(self, input->data[0U], start, len); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 144 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_final_80_bd3( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_a1_3a(self, input, start, len); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.store_block +with const generics +- RATE= 144 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_store_block_9e( + const Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + size_t octets = len / (size_t)8U; + for (size_t i = (size_t)0U; i < octets; i++) + { + size_t i0 = i; + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + i0 / (size_t)5U, + i0 % (size_t)5U)[0U]); + size_t out_pos = start + (size_t)8U * i0; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + (size_t)8U })), + Eurydice_array_to_slice_shared_6e(&bytes), + uint8_t); + } + size_t remaining = len % (size_t)8U; + if (remaining > (size_t)0U) + { + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + octets / (size_t)5U, + octets % (size_t)5U)[0U]); + size_t out_pos = start + len - remaining; + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + remaining })); + Eurydice_slice_copy(uu____0, + Eurydice_array_to_subslice_to_shared_21(&bytes, remaining), + uint8_t); + } +} + +/** +This function found in impl {libcrux_sha3::traits::Squeeze for libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.squeeze_9b +with const generics +- RATE= 144 +*/ +static inline void +libcrux_sha3_simd_portable_squeeze_9b_9e( + const Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_store_block_9e(self, out, start, len); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 +with const generics +- RATE= 144 +- DELIM= 6 +*/ +static inline void +libcrux_sha3_generic_keccak_portable_keccak1_3a( + Eurydice_borrow_slice_u8 input, + Eurydice_mut_borrow_slice_u8 output +) +{ + Eurydice_arr_7c s = libcrux_sha3_generic_keccak_new_80_71(); + size_t input_len = input.meta; + size_t input_blocks = input_len / (size_t)144U; + size_t input_rem = input_len % (size_t)144U; + for (size_t i = (size_t)0U; i < input_blocks; i++) + { + size_t i0 = i; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_block_80_e92(&s, &lvalue, i0 * (size_t)144U); + } + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_final_80_bd3(&s, &lvalue, input_len - input_rem, input_rem); + size_t output_len = output.meta; + size_t output_blocks = output_len / (size_t)144U; + size_t output_rem = output_len % (size_t)144U; + if (output_blocks == (size_t)0U) + { + libcrux_sha3_simd_portable_squeeze_9b_9e(&s, output, (size_t)0U, output_len); + } + else + { + libcrux_sha3_simd_portable_squeeze_9b_9e(&s, output, (size_t)0U, (size_t)144U); + for (size_t i = (size_t)1U; i < output_blocks; i++) + { + size_t i0 = i; + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_9e(&s, output, i0 * (size_t)144U, (size_t)144U); + } + if (output_rem != (size_t)0U) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_9e(&s, output, output_len - output_rem, output_rem); + } + } +} + +/** + A portable SHA3 224 implementation. +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_sha224( + Eurydice_mut_borrow_slice_u8 digest, + Eurydice_borrow_slice_u8 data +) +{ + libcrux_sha3_generic_keccak_portable_keccak1_3a(data, digest); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block +with const generics +- RATE= 104 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_block_53( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start +) +{ + Eurydice_arr_7c state_flat = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) + { + size_t i0 = i; + size_t offset = start + (size_t)8U * i0; + Eurydice_array_u8x8 arr; + memcpy(arr.data, + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = offset, .end = offset + (size_t)8U })).ptr, + (size_t)8U * sizeof (uint8_t)); + Eurydice_array_u8x8 + uu____0 = + core_result_unwrap_26_e0(( + KRML_CLITERAL(core_result_Result_8e){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + )); + state_flat.data[i0] = core_num__u64__from_le_bytes(uu____0); + } + for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) + { + size_t i0 = i; + libcrux_sha3_traits_set_ij_71(state, + i0 / (size_t)5U, + i0 % (size_t)5U, + libcrux_sha3_traits_get_ij_71(state, i0 / (size_t)5U, i0 % (size_t)5U)[0U] ^ + state_flat.data[i0]); + } +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 +with const generics +- RATE= 104 +*/ +static inline void +libcrux_sha3_simd_portable_load_block_a1_53( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_53(self, input->data[0U], start); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 104 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_block_80_e93( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start +) +{ + libcrux_sha3_simd_portable_load_block_a1_53(self, input, start); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last +with const generics +- RATE= 104 +- DELIMITER= 6 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_load_last_dc0( + Eurydice_arr_7c *state, + Eurydice_borrow_slice_u8 blocks, + size_t start, + size_t len +) +{ + Eurydice_arr_c4 buffer = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d45(&buffer, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = len })), + Eurydice_slice_subslice_shared_c8(blocks, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = start, .end = start + len })), + uint8_t); + buffer.data[len] = 6U; + size_t uu____0 = (size_t)104U - (size_t)1U; + buffer.data[uu____0] = (uint32_t)buffer.data[uu____0] | 128U; + libcrux_sha3_simd_portable_load_block_53(state, + Eurydice_array_to_slice_shared_72(&buffer), + (size_t)0U); +} + +/** +This function found in impl {libcrux_sha3::traits::Absorb<1usize> for libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 +with const generics +- RATE= 104 +- DELIMITER= 6 +*/ +static inline void +libcrux_sha3_simd_portable_load_last_a1_dc0( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_dc0(self, input->data[0U], start, len); +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 +with types uint64_t +with const generics +- N= 1 +- RATE= 104 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_absorb_final_80_bd4( + Eurydice_arr_7c *self, + const Eurydice_arr_dc *input, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_load_last_a1_dc0(self, input, start, len); + libcrux_sha3_generic_keccak_keccakf1600_80_71(self); +} + +/** +A monomorphic instance of libcrux_sha3.simd.portable.store_block +with const generics +- RATE= 104 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_simd_portable_store_block_53( + const Eurydice_arr_7c *s, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + size_t octets = len / (size_t)8U; + for (size_t i = (size_t)0U; i < octets; i++) + { + size_t i0 = i; + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + i0 / (size_t)5U, + i0 % (size_t)5U)[0U]); + size_t out_pos = start + (size_t)8U * i0; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + (size_t)8U })), + Eurydice_array_to_slice_shared_6e(&bytes), + uint8_t); + } + size_t remaining = len % (size_t)8U; + if (remaining > (size_t)0U) + { + Eurydice_array_u8x8 + bytes = + core_num__u64__to_le_bytes(libcrux_sha3_traits_get_ij_71(s, + octets / (size_t)5U, + octets % (size_t)5U)[0U]); + size_t out_pos = start + len - remaining; + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_slice_subslice_mut_c8(out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = out_pos, .end = out_pos + remaining })); + Eurydice_slice_copy(uu____0, + Eurydice_array_to_subslice_to_shared_21(&bytes, remaining), + uint8_t); + } +} + +/** +This function found in impl {libcrux_sha3::traits::Squeeze for libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for u64}]} +*/ +/** +A monomorphic instance of libcrux_sha3.simd.portable.squeeze_9b +with const generics +- RATE= 104 +*/ +static inline void +libcrux_sha3_simd_portable_squeeze_9b_53( + const Eurydice_arr_7c *self, + Eurydice_mut_borrow_slice_u8 out, + size_t start, + size_t len +) +{ + libcrux_sha3_simd_portable_store_block_53(self, out, start, len); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 +with const generics +- RATE= 104 +- DELIM= 6 +*/ +static inline void +libcrux_sha3_generic_keccak_portable_keccak1_dc0( + Eurydice_borrow_slice_u8 input, + Eurydice_mut_borrow_slice_u8 output +) +{ + Eurydice_arr_7c s = libcrux_sha3_generic_keccak_new_80_71(); + size_t input_len = input.meta; + size_t input_blocks = input_len / (size_t)104U; + size_t input_rem = input_len % (size_t)104U; + for (size_t i = (size_t)0U; i < input_blocks; i++) + { + size_t i0 = i; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_block_80_e93(&s, &lvalue, i0 * (size_t)104U); + } + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_absorb_final_80_bd4(&s, &lvalue, input_len - input_rem, input_rem); + size_t output_len = output.meta; + size_t output_blocks = output_len / (size_t)104U; + size_t output_rem = output_len % (size_t)104U; + if (output_blocks == (size_t)0U) + { + libcrux_sha3_simd_portable_squeeze_9b_53(&s, output, (size_t)0U, output_len); + } + else + { + libcrux_sha3_simd_portable_squeeze_9b_53(&s, output, (size_t)0U, (size_t)104U); + for (size_t i = (size_t)1U; i < output_blocks; i++) + { + size_t i0 = i; + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_53(&s, output, i0 * (size_t)104U, (size_t)104U); + } + if (output_rem != (size_t)0U) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&s); + libcrux_sha3_simd_portable_squeeze_9b_53(&s, output, output_len - output_rem, output_rem); + } + } +} + +/** + A portable SHA3 384 implementation. +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_sha384( + Eurydice_mut_borrow_slice_u8 digest, + Eurydice_borrow_slice_u8 data +) +{ + libcrux_sha3_generic_keccak_portable_keccak1_dc0(data, digest); +} + +/** + SHA3 224 + + Preconditions: + - `digest.len() == 28` +*/ +static inline void +libcrux_sha3_sha224_ema(Eurydice_mut_borrow_slice_u8 digest, Eurydice_borrow_slice_u8 payload) +{ + libcrux_sha3_portable_sha224(digest, payload); +} + +/** + SHA3 224 +*/ +static inline Eurydice_arr_a2 libcrux_sha3_sha224(Eurydice_borrow_slice_u8 data) +{ + Eurydice_arr_a2 out = { .data = { 0U } }; + libcrux_sha3_sha224_ema(Eurydice_array_to_slice_mut_5e(&out), data); + return out; +} + +/** + SHA3 256 +*/ +static inline void +libcrux_sha3_sha256_ema(Eurydice_mut_borrow_slice_u8 digest, Eurydice_borrow_slice_u8 payload) +{ + libcrux_sha3_portable_sha256(digest, payload); +} + +/** + SHA3 256 +*/ +static inline Eurydice_arr_ec libcrux_sha3_sha256(Eurydice_borrow_slice_u8 data) +{ + Eurydice_arr_ec out = { .data = { 0U } }; + libcrux_sha3_sha256_ema(Eurydice_array_to_slice_mut_01(&out), data); + return out; +} + +/** + SHA3 384 +*/ +static inline void +libcrux_sha3_sha384_ema(Eurydice_mut_borrow_slice_u8 digest, Eurydice_borrow_slice_u8 payload) +{ + libcrux_sha3_portable_sha384(digest, payload); +} + +/** + SHA3 384 +*/ +static inline Eurydice_arr_65 libcrux_sha3_sha384(Eurydice_borrow_slice_u8 data) +{ + Eurydice_arr_65 out = { .data = { 0U } }; + libcrux_sha3_sha384_ema(Eurydice_array_to_slice_mut_9f(&out), data); + return out; +} + +/** + SHA3 512 +*/ +static inline void +libcrux_sha3_sha512_ema(Eurydice_mut_borrow_slice_u8 digest, Eurydice_borrow_slice_u8 payload) +{ + libcrux_sha3_portable_sha512(digest, payload); +} + +/** + SHA3 512 +*/ +static inline Eurydice_arr_c7 libcrux_sha3_sha512(Eurydice_borrow_slice_u8 data) +{ + Eurydice_arr_c7 out = { .data = { 0U } }; + libcrux_sha3_sha512_ema(Eurydice_array_to_slice_mut_17(&out), data); + return out; +} + +/** + SHAKE 128 + + Writes `out.len()` bytes. +*/ +static inline void +libcrux_sha3_shake128_ema(Eurydice_mut_borrow_slice_u8 out, Eurydice_borrow_slice_u8 data) +{ + libcrux_sha3_portable_shake128(out, data); +} + +/** + SHAKE 256 + + Writes `out.len()` bytes. +*/ +static inline void +libcrux_sha3_shake256_ema(Eurydice_mut_borrow_slice_u8 out, Eurydice_borrow_slice_u8 data) +{ + libcrux_sha3_portable_shake256(out, data); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.KeccakXofState +with types uint64_t +with const generics +- $1size_t +- $168size_t +*/ +typedef struct libcrux_sha3_generic_keccak_xof_KeccakXofState_55_s +{ + Eurydice_arr_7c inner; + Eurydice_arr_88 buf; + size_t buf_len; + bool sponge; +} +libcrux_sha3_generic_keccak_xof_KeccakXofState_55; + +typedef libcrux_sha3_generic_keccak_xof_KeccakXofState_55 +libcrux_sha3_portable_incremental_Shake128Xof; + +/** + Try to complete the internal partial buffer by consuming the minimum required + number of bytes from the provided `inputs` so that `self.buf` becomes exactly + one full block of size `RATE`. + + Behaviour: + - If `self.buf_len` is 0 (no buffered bytes) or already equal to `RATE` + (already a full block), or if the combined available bytes in `inputs` are + not enough to reach `RATE`, the function does nothing and returns 0. + - If `0 < self.buf_len < RATE` and `inputs[..]` contain at least + `RATE - self.buf_len` bytes, the function copies exactly + `consumed = RATE - self.buf_len` bytes from each lane `inputs[i]` into + `self.buf[i]` starting at the current `self.buf_len` offset, sets + `self.buf_len = RATE`, and returns `consumed`. + + Returns the `consumed` bytes from `inputs` if there's enough buffered + content to consume, and `0` otherwise. + If `consumed > 0` is returned, `self.buf` contains a full block to be + loaded. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.fill_buffer_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static inline size_t +libcrux_sha3_generic_keccak_xof_fill_buffer_35_e90( + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 *self, + const Eurydice_arr_dc *inputs +) +{ + size_t input_len = inputs->data->meta; + size_t uu____0; + if (self->buf_len != (size_t)0U) + { + if (input_len >= (size_t)168U - self->buf_len) + { + size_t consumed = (size_t)168U - self->buf_len; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) + { + size_t i0 = i; + Eurydice_slice_copy(Eurydice_array_to_subslice_from_mut_5f0(&self->buf.data[i0], + self->buf_len), + Eurydice_slice_subslice_to_shared_72(inputs->data[i0], consumed), + uint8_t); + } + self->buf_len = (size_t)168U; + uu____0 = consumed; + } + else + { + uu____0 = (size_t)0U; + } + } + else + { + uu____0 = (size_t)0U; + } + return uu____0; +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.buf_to_slices.closure +with const generics +- $1size_t +- $168size_t +*/ +typedef const Eurydice_arr_88 *libcrux_sha3_generic_keccak_xof_buf_to_slices_closure_48; + +/** +This function found in impl {core::ops::function::FnMut<(usize), &'_ ([u8])> for libcrux_sha3::generic_keccak::xof::buf_to_slices::closure<0, PARALLEL_LANES, RATE>} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.buf_to_slices.call_mut_2a +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static inline Eurydice_borrow_slice_u8 +libcrux_sha3_generic_keccak_xof_buf_to_slices_call_mut_2a_810( + const Eurydice_arr_88 **_, + size_t tupled_args +) +{ + size_t i = tupled_args; + return + core_array___T__N___as_slice((size_t)168U, + &_[0U]->data[i], + uint8_t, + Eurydice_borrow_slice_u8); +} + +/** +This function found in impl {core::ops::function::FnOnce<(usize), &'_ ([u8])> for libcrux_sha3::generic_keccak::xof::buf_to_slices::closure<0, PARALLEL_LANES, RATE>} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.buf_to_slices.call_once_fa +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static inline Eurydice_borrow_slice_u8 +libcrux_sha3_generic_keccak_xof_buf_to_slices_call_once_fa_810( + const Eurydice_arr_88 *_, + size_t _0 +) +{ + return libcrux_sha3_generic_keccak_xof_buf_to_slices_call_mut_2a_810(&_, _0); +} + +/** + Note: This function exists to work around a hax bug where `core::array::from_fn` + is extracted with an incorrect explicit type parameter `#(usize -> t_Slice u8)` + instead of using the typeclass-based implicit parameter `#v_F` from + `Core_models.Array.from_fn`. + See: https://github.com/cryspen/hax/issues/1920 +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.buf_to_slices +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static KRML_MUSTINLINE Eurydice_arr_dc +libcrux_sha3_generic_keccak_xof_buf_to_slices_810(const Eurydice_arr_88 *buf) +{ + Eurydice_arr_dc arr_struct; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) + { + arr_struct.data[i] = libcrux_sha3_generic_keccak_xof_buf_to_slices_call_mut_2a_810(&buf, i); + } + return arr_struct; +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_full_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static inline size_t +libcrux_sha3_generic_keccak_xof_absorb_full_35_e90( + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 *self, + const Eurydice_arr_dc *inputs +) +{ + size_t consumed = libcrux_sha3_generic_keccak_xof_fill_buffer_35_e90(self, inputs); + if (self->buf_len == (size_t)168U) + { + Eurydice_arr_dc borrowed = libcrux_sha3_generic_keccak_xof_buf_to_slices_810(&self->buf); + libcrux_sha3_simd_portable_load_block_a1_60(&self->inner, &borrowed, (size_t)0U); + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + self->buf_len = (size_t)0U; + } + size_t input_to_consume = inputs->data->meta - consumed; + size_t num_blocks = input_to_consume / (size_t)168U; + size_t remainder = input_to_consume % (size_t)168U; + for (size_t i = (size_t)0U; i < num_blocks; i++) + { + size_t i0 = i; + size_t start = i0 * (size_t)168U + consumed; + libcrux_sha3_simd_portable_load_block_a1_60(&self->inner, inputs, start); + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + } + return remainder; +} + +/** + Absorb + + This function takes any number of bytes to absorb and buffers if it's not enough. + The function assumes that all input slices in `inputs` have the same length. + + Only a multiple of `RATE` blocks are absorbed. + For the remaining bytes [`absorb_final`] needs to be called. + + This works best with relatively small `inputs`. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_xof_absorb_35_e90( + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 *self, + const Eurydice_arr_dc *inputs +) +{ + size_t remainder = libcrux_sha3_generic_keccak_xof_absorb_full_35_e90(self, inputs); + if (remainder > (size_t)0U) + { + size_t input_len = inputs->data->meta; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) + { + size_t i0 = i; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d41(&self->buf.data[i0], + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = self->buf_len, + .end = self->buf_len + remainder + } + )), + Eurydice_slice_subslice_shared_c8(inputs->data[i0], + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = input_len - remainder, + .end = input_len + } + )), + uint8_t); + } + self->buf_len += remainder; + } +} + +/** +This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize> for libcrux_sha3::portable::incremental::Shake128Xof} +*/ +static inline void +libcrux_sha3_portable_incremental_absorb_26( + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 *self, + Eurydice_borrow_slice_u8 input +) +{ + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_xof_absorb_35_e90(self, &lvalue); +} + +/** + Absorb a final block. + + The `inputs` block may be empty. Everything in the `inputs` block beyond + `RATE` bytes is ignored. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_final_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +- DELIMITER= 31 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_xof_absorb_final_35_bd0( + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 *self, + const Eurydice_arr_dc *inputs +) +{ + libcrux_sha3_generic_keccak_xof_absorb_35_e90(self, inputs); + Eurydice_arr_dc borrowed = libcrux_sha3_generic_keccak_xof_buf_to_slices_810(&self->buf); + libcrux_sha3_simd_portable_load_last_a1_37(&self->inner, &borrowed, (size_t)0U, self->buf_len); + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); +} + +/** +This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize> for libcrux_sha3::portable::incremental::Shake128Xof} +*/ +static inline void +libcrux_sha3_portable_incremental_absorb_final_26( + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 *self, + Eurydice_borrow_slice_u8 input +) +{ + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_dc lvalue = { .data = { input } }; + libcrux_sha3_generic_keccak_xof_absorb_final_35_bd0(self, &lvalue); +} + +/** + An all zero block +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.zero_block_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static inline Eurydice_arr_c5 libcrux_sha3_generic_keccak_xof_zero_block_35_e90(void) +{ + return (KRML_CLITERAL(Eurydice_arr_c5){ .data = { 0U } }); +} + +/** + Generate a new keccak xof state. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.new_35 +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_55 +libcrux_sha3_generic_keccak_xof_new_35_e90(void) +{ + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 lit; + lit.inner = libcrux_sha3_generic_keccak_new_80_71(); + Eurydice_arr_c5 repeat_expression[1U]; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) + { + repeat_expression[i] = libcrux_sha3_generic_keccak_xof_zero_block_35_e90(); + } + memcpy(lit.buf.data, repeat_expression, (size_t)1U * sizeof (Eurydice_arr_c5)); + lit.buf_len = (size_t)0U; + lit.sponge = false; + return lit; +} + +/** +This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize> for libcrux_sha3::portable::incremental::Shake128Xof} +*/ +static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_55 +libcrux_sha3_portable_incremental_new_26(void) +{ + return libcrux_sha3_generic_keccak_xof_new_35_e90(); +} + +/** + Squeeze `N` x `LEN` bytes. Only `N = 1` for now. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.xof.squeeze_85 +with types uint64_t +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_xof_squeeze_85_2a( + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 *self, + Eurydice_mut_borrow_slice_u8 out +) +{ + size_t out_len = out.meta; + if (!(out_len == (size_t)0U)) + { + if (self->sponge) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + } + if (out_len > (size_t)0U) + { + size_t blocks = out_len / (size_t)168U; + size_t last = out_len - out_len % (size_t)168U; + if (blocks == (size_t)0U) + { + libcrux_sha3_simd_portable_squeeze_9b_60(&self->inner, out, (size_t)0U, out_len); + } + else + { + libcrux_sha3_simd_portable_squeeze_9b_60(&self->inner, out, (size_t)0U, (size_t)168U); + for (size_t i = (size_t)1U; i < blocks; i++) + { + size_t i0 = i; + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + libcrux_sha3_simd_portable_squeeze_9b_60(&self->inner, + out, + i0 * (size_t)168U, + (size_t)168U); + } + if (last < out_len) + { + libcrux_sha3_generic_keccak_keccakf1600_80_71(&self->inner); + libcrux_sha3_simd_portable_squeeze_9b_60(&self->inner, out, last, out_len - last); + } + } + } + self->sponge = true; + } +} + +/** + Shake128 squeeze +*/ +/** +This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize> for libcrux_sha3::portable::incremental::Shake128Xof} +*/ +static inline void +libcrux_sha3_portable_incremental_squeeze_26( + libcrux_sha3_generic_keccak_xof_KeccakXofState_55 *self, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_generic_keccak_xof_squeeze_85_2a(self, out); +} + +/** +This function found in impl {core::clone::Clone for libcrux_sha3::portable::KeccakState} +*/ +static inline Eurydice_arr_7c libcrux_sha3_portable_clone_fe(const Eurydice_arr_7c *self) +{ + return self[0U]; +} + +/** +This function found in impl {core::clone::Clone for libcrux_sha3::Algorithm} +*/ +static inline libcrux_sha3_Algorithm libcrux_sha3_clone_e6(const libcrux_sha3_Algorithm *self) +{ + return self[0U]; +} + +/** +This function found in impl {core::convert::From for u32} +*/ +static inline uint32_t libcrux_sha3_from_6c(libcrux_sha3_Algorithm v) +{ + switch (v) + { + case libcrux_sha3_Algorithm_Sha224: + { + break; + } + case libcrux_sha3_Algorithm_Sha256: + { + return 2U; + } + case libcrux_sha3_Algorithm_Sha384: + { + return 3U; + } + case libcrux_sha3_Algorithm_Sha512: + { + return 4U; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, __LINE__); + KRML_HOST_EXIT(253U); + } + } + return 1U; +} + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_sha3_portable_KeccakState +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_1b0_s { Eurydice_arr_7c data[3U]; } Eurydice_arr_1b0; + +#if defined(__cplusplus) +} +#endif + +#define libcrux_sha3_portable_H_DEFINED +#endif /* libcrux_sha3_portable_H */ + +/* from libcrux/combined_extraction/generated/libcrux_mlkem_core.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_mlkem_core_H +#define libcrux_mlkem_core_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +#define LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE ((size_t)32U) + +#define LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT ((size_t)12U) + +#define LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT ((size_t)256U) + +#define LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * (size_t)12U) + +#define LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT (LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U) + +#define LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE ((size_t)32U) + +#define LIBCRUX_ML_KEM_CONSTANTS_G_DIGEST_SIZE ((size_t)64U) + +#define LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE ((size_t)32U) + +/** + K * BITS_PER_RING_ELEMENT / 8 + + [eurydice] Note that we can't use const generics here because that breaks + C extraction with eurydice. +*/ +static inline size_t libcrux_ml_kem_constants_ranked_bytes_per_ring_element(size_t rank) +{ + return rank * LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U; +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for i16} +*/ +static KRML_MUSTINLINE uint8_t libcrux_secrets_int_as_u8_f5(int16_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_90((uint8_t)libcrux_secrets_int_public_integers_declassify_d8_39(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for u8} +*/ +static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_59(uint8_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_39((int16_t)(uint32_t)libcrux_secrets_int_public_integers_declassify_d8_90(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for i16} +*/ +static KRML_MUSTINLINE int32_t libcrux_secrets_int_as_i32_f5(int16_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_a8((int32_t)libcrux_secrets_int_public_integers_declassify_d8_39(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for i32} +*/ +static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_36(int32_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_39((int16_t)libcrux_secrets_int_public_integers_declassify_d8_a8(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for u32} +*/ +static KRML_MUSTINLINE int32_t libcrux_secrets_int_as_i32_b8(uint32_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_a8((int32_t)libcrux_secrets_int_public_integers_declassify_d8_df(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for i16} +*/ +static KRML_MUSTINLINE uint16_t libcrux_secrets_int_as_u16_f5(int16_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_de((uint16_t)libcrux_secrets_int_public_integers_declassify_d8_39(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for u16} +*/ +static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_ca(uint16_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_39((int16_t)(uint32_t)libcrux_secrets_int_public_integers_declassify_d8_de(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for u16} +*/ +static KRML_MUSTINLINE uint64_t libcrux_secrets_int_as_u64_ca(uint16_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_49((uint64_t)(uint32_t)libcrux_secrets_int_public_integers_declassify_d8_de(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for u64} +*/ +static KRML_MUSTINLINE uint32_t libcrux_secrets_int_as_u32_a3(uint64_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_df((uint32_t)libcrux_secrets_int_public_integers_declassify_d8_49(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for u32} +*/ +static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_b8(uint32_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_39((int16_t)libcrux_secrets_int_public_integers_declassify_d8_df(self)); +} + +/** +This function found in impl {libcrux_secrets::int::CastOps for i16} +*/ +static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_f5(int16_t self) +{ + return + libcrux_secrets_int_public_integers_classify_27_39(libcrux_secrets_int_public_integers_declassify_d8_39(self)); +} + +/** + Pad the `slice` with `0`s at the end. +*/ +/** +A monomorphic instance of libcrux_ml_kem.utils.into_padded_array +with const generics +- LEN= 32 +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_utils_into_padded_array_ce(Eurydice_borrow_slice_u8 slice) +{ + Eurydice_arr_ec out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d46(&out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = slice.meta })), + slice, + uint8_t); + return out; +} + +/** +This function found in impl {core::default::Default for libcrux_ml_kem::types::MlKemPrivateKey} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.default_d3 +with const generics +- SIZE= 2400 +*/ +static inline Eurydice_arr_7d libcrux_ml_kem_types_default_d3_79(void) +{ + return (KRML_CLITERAL(Eurydice_arr_7d){ .data = { 0U } }); +} + +/** +This function found in impl {core::convert::From<[u8; SIZE]> for libcrux_ml_kem::types::MlKemPublicKey} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.from_51 +with const generics +- SIZE= 1184 +*/ +static inline Eurydice_arr_5f libcrux_ml_kem_types_from_51_3d(Eurydice_arr_5f value) +{ + return value; +} + +typedef struct libcrux_ml_kem_mlkem768_MlKem768KeyPair_s +{ + Eurydice_arr_7d sk; + Eurydice_arr_5f pk; +} +libcrux_ml_kem_mlkem768_MlKem768KeyPair; + +/** + Create a new [`MlKemKeyPair`] from the secret and public key. +*/ +/** +This function found in impl {libcrux_ml_kem::types::MlKemKeyPair} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.from_17 +with const generics +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +*/ +static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair +libcrux_ml_kem_types_from_17_bc(Eurydice_arr_7d sk, Eurydice_arr_5f pk) +{ + return (KRML_CLITERAL(libcrux_ml_kem_mlkem768_MlKem768KeyPair){ .sk = sk, .pk = pk }); +} + +/** +This function found in impl {core::convert::From<[u8; SIZE]> for libcrux_ml_kem::types::MlKemPrivateKey} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.from_b2 +with const generics +- SIZE= 2400 +*/ +static inline Eurydice_arr_7d libcrux_ml_kem_types_from_b2_79(Eurydice_arr_7d value) +{ + return value; +} + +/** +A monomorphic instance of n-tuple +with types libcrux_ml_kem_mlkem768_MlKem768Ciphertext, Eurydice_arr_ec + +*/ +typedef struct tuple_f4_s +{ + Eurydice_arr_2b fst; + Eurydice_arr_ec snd; +} +tuple_f4; + +/** +This function found in impl {core::convert::From<[u8; SIZE]> for libcrux_ml_kem::types::MlKemCiphertext} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.from_19 +with const generics +- SIZE= 1088 +*/ +static inline Eurydice_arr_2b libcrux_ml_kem_types_from_19_52(Eurydice_arr_2b value) +{ + return value; +} + +/** + A reference to the raw byte slice. +*/ +/** +This function found in impl {libcrux_ml_kem::types::MlKemPublicKey} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.as_slice_e6 +with const generics +- SIZE= 1184 +*/ +static inline const +Eurydice_arr_5f +*libcrux_ml_kem_types_as_slice_e6_3d(const Eurydice_arr_5f *self) +{ + return self; +} + +/** + A reference to the raw byte slice. +*/ +/** +This function found in impl {libcrux_ml_kem::types::MlKemCiphertext} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.as_slice_a9 +with const generics +- SIZE= 1088 +*/ +static inline const +Eurydice_arr_2b +*libcrux_ml_kem_types_as_slice_a9_52(const Eurydice_arr_2b *self) +{ + return self; +} + +/** +A monomorphic instance of libcrux_ml_kem.utils.prf_input_inc +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE uint8_t +libcrux_ml_kem_utils_prf_input_inc_78(Eurydice_arr_fd *prf_inputs, uint8_t domain_separator) +{ + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + prf_inputs->data[i0].data[32U] = domain_separator; + domain_separator = (uint32_t)domain_separator + 1U; + } + return domain_separator; +} + +/** + Pad the `slice` with `0`s at the end. +*/ +/** +A monomorphic instance of libcrux_ml_kem.utils.into_padded_array +with const generics +- LEN= 33 +*/ +static KRML_MUSTINLINE Eurydice_arr_fa0 +libcrux_ml_kem_utils_into_padded_array_29(Eurydice_borrow_slice_u8 slice) +{ + Eurydice_arr_fa0 out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d412(&out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = slice.meta })), + slice, + uint8_t); + return out; +} + +/** + Pad the `slice` with `0`s at the end. +*/ +/** +A monomorphic instance of libcrux_ml_kem.utils.into_padded_array +with const generics +- LEN= 34 +*/ +static KRML_MUSTINLINE Eurydice_arr_31 +libcrux_ml_kem_utils_into_padded_array_de(Eurydice_borrow_slice_u8 slice) +{ + Eurydice_arr_31 out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d40(&out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = slice.meta })), + slice, + uint8_t); + return out; +} + +/** +This function found in impl {core::convert::AsRef<[u8]> for libcrux_ml_kem::types::MlKemCiphertext} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.as_ref_c1 +with const generics +- SIZE= 1088 +*/ +static inline Eurydice_borrow_slice_u8 +libcrux_ml_kem_types_as_ref_c1_52(const Eurydice_arr_2b *self) +{ + return Eurydice_array_to_slice_shared_06(self); +} + +/** + Pad the `slice` with `0`s at the end. +*/ +/** +A monomorphic instance of libcrux_ml_kem.utils.into_padded_array +with const generics +- LEN= 1120 +*/ +static KRML_MUSTINLINE Eurydice_arr_af +libcrux_ml_kem_utils_into_padded_array_66(Eurydice_borrow_slice_u8 slice) +{ + Eurydice_arr_af out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d411(&out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = slice.meta })), + slice, + uint8_t); + return out; +} + +/** + Pad the `slice` with `0`s at the end. +*/ +/** +A monomorphic instance of libcrux_ml_kem.utils.into_padded_array +with const generics +- LEN= 64 +*/ +static KRML_MUSTINLINE Eurydice_arr_c7 +libcrux_ml_kem_utils_into_padded_array_c9(Eurydice_borrow_slice_u8 slice) +{ + Eurydice_arr_c7 out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d410(&out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = slice.meta })), + slice, + uint8_t); + return out; +} + +typedef struct Eurydice_borrow_slice_u8_x4_s +{ + Eurydice_borrow_slice_u8 fst; + Eurydice_borrow_slice_u8 snd; + Eurydice_borrow_slice_u8 thd; + Eurydice_borrow_slice_u8 f3; +} +Eurydice_borrow_slice_u8_x4; + +typedef struct Eurydice_borrow_slice_u8_x2_s +{ + Eurydice_borrow_slice_u8 fst; + Eurydice_borrow_slice_u8 snd; +} +Eurydice_borrow_slice_u8_x2; + +/** + Unpack an incoming private key into it's different parts. + + We have this here in types to extract into a common core for C. +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.unpack_private_key +with const generics +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +*/ +static inline Eurydice_borrow_slice_u8_x4 +libcrux_ml_kem_types_unpack_private_key_64(Eurydice_borrow_slice_u8 private_key) +{ + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(private_key, + (size_t)1152U, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 ind_cpa_secret_key = uu____0.fst; + Eurydice_borrow_slice_u8 secret_key0 = uu____0.snd; + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(secret_key0, + (size_t)1184U, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 ind_cpa_public_key = uu____1.fst; + Eurydice_borrow_slice_u8 secret_key = uu____1.snd; + Eurydice_borrow_slice_u8_x2 + uu____2 = + Eurydice_slice_split_at(secret_key, + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 ind_cpa_public_key_hash = uu____2.fst; + Eurydice_borrow_slice_u8 implicit_rejection_value = uu____2.snd; + return + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8_x4){ + .fst = ind_cpa_secret_key, + .snd = ind_cpa_public_key, + .thd = ind_cpa_public_key_hash, + .f3 = implicit_rejection_value + } + ); +} + +#if defined(__cplusplus) +} +#endif + +#define libcrux_mlkem_core_H_DEFINED +#endif /* libcrux_mlkem_core_H */ + +/* from libcrux/combined_extraction/generated/libcrux_mldsa_core.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_mldsa_core_H +#define libcrux_mldsa_core_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +#define libcrux_ml_dsa_constants_Eta_Two 2 +#define libcrux_ml_dsa_constants_Eta_Four 4 + +typedef uint8_t libcrux_ml_dsa_constants_Eta; + +#define LIBCRUX_ML_DSA_SIMD_TRAITS_COEFFICIENTS_IN_SIMD_UNIT ((size_t)8U) + +#define LIBCRUX_ML_DSA_SIMD_TRAITS_SIMD_UNITS_IN_RING_ELEMENT ((size_t)32U) + +#define LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T ((size_t)13U) + +#define LIBCRUX_ML_DSA_CONSTANTS_FIELD_MODULUS_MINUS_ONE_BIT_LENGTH ((size_t)23U) + +#define LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_UPPER_PART_OF_T (LIBCRUX_ML_DSA_CONSTANTS_FIELD_MODULUS_MINUS_ONE_BIT_LENGTH - LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T) + +#define LIBCRUX_ML_DSA_CONSTANTS_BYTES_FOR_VERIFICATION_KEY_HASH ((size_t)64U) + +#define LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT ((size_t)256U) + +#define LIBCRUX_ML_DSA_CONSTANTS_CONTEXT_MAX_LEN ((size_t)255U) + +#define LIBCRUX_ML_DSA_CONSTANTS_FIELD_MODULUS (8380417) + +#define LIBCRUX_ML_DSA_CONSTANTS_GAMMA2_V261_888 (261888) + +#define LIBCRUX_ML_DSA_CONSTANTS_GAMMA2_V95_232 (95232) + +typedef int32_t libcrux_ml_dsa_constants_Gamma2; + +#define LIBCRUX_ML_DSA_CONSTANTS_KEY_GENERATION_RANDOMNESS_SIZE ((size_t)32U) + +#define LIBCRUX_ML_DSA_CONSTANTS_MASK_SEED_SIZE ((size_t)64U) + +#define LIBCRUX_ML_DSA_CONSTANTS_MESSAGE_REPRESENTATIVE_SIZE ((size_t)64U) + +#define LIBCRUX_ML_DSA_CONSTANTS_REJECTION_SAMPLE_BOUND_SIGN ((size_t)814U) + +#define LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T0S_SIZE (LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T * LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / (size_t)8U) + +#define LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T1S_SIZE (LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_UPPER_PART_OF_T * LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / (size_t)8U) + +#define LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE ((size_t)32U) + +#define LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_ERROR_VECTORS_SIZE ((size_t)64U) + +#define LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_SIGNING_SIZE ((size_t)32U) + +#define LIBCRUX_ML_DSA_CONSTANTS_SIGNING_RANDOMNESS_SIZE ((size_t)32U) + +static inline int32_t +libcrux_ml_dsa_constants_beta( + size_t ones_in_verifier_challenge, + libcrux_ml_dsa_constants_Eta eta +) +{ + size_t eta_val; + switch (eta) + { + case libcrux_ml_dsa_constants_Eta_Two: + { + eta_val = (size_t)2U; + break; + } + case libcrux_ml_dsa_constants_Eta_Four: + { + eta_val = (size_t)4U; + break; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, __LINE__); + KRML_HOST_EXIT(253U); + } + } + return (int32_t)(ones_in_verifier_challenge * eta_val); +} + +static inline size_t +libcrux_ml_dsa_constants_commitment_ring_element_size(size_t bits_per_commitment_coefficient) +{ + return + bits_per_commitment_coefficient * LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / + (size_t)8U; +} + +static inline size_t +libcrux_ml_dsa_constants_commitment_vector_size( + size_t bits_per_commitment_coefficient, + size_t rows_in_a +) +{ + return + libcrux_ml_dsa_constants_commitment_ring_element_size(bits_per_commitment_coefficient) * + rows_in_a; +} + +static inline size_t +libcrux_ml_dsa_constants_error_ring_element_size(size_t bits_per_error_coefficient) +{ + return + bits_per_error_coefficient * LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / (size_t)8U; +} + +static inline size_t +libcrux_ml_dsa_constants_gamma1_ring_element_size(size_t bits_per_gamma1_coefficient) +{ + return + bits_per_gamma1_coefficient * LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / + (size_t)8U; +} + +static inline size_t +libcrux_ml_dsa_constants_signature_size( + size_t rows_in_a, + size_t columns_in_a, + size_t max_ones_in_hint, + size_t commitment_hash_size, + size_t bits_per_gamma1_coefficient +) +{ + return + commitment_hash_size + + columns_in_a * libcrux_ml_dsa_constants_gamma1_ring_element_size(bits_per_gamma1_coefficient) + + max_ones_in_hint + + rows_in_a; +} + +static inline size_t +libcrux_ml_dsa_constants_signing_key_size( + size_t rows_in_a, + size_t columns_in_a, + size_t error_ring_element_size +) +{ + return + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_SIGNING_SIZE + + LIBCRUX_ML_DSA_CONSTANTS_BYTES_FOR_VERIFICATION_KEY_HASH + + (rows_in_a + columns_in_a) * error_ring_element_size + + rows_in_a * LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T0S_SIZE; +} + +static inline size_t libcrux_ml_dsa_constants_verification_key_size(size_t rows_in_a) +{ + return + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE + + LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * rows_in_a * + (LIBCRUX_ML_DSA_CONSTANTS_FIELD_MODULUS_MINUS_ONE_BIT_LENGTH - + LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T) + / (size_t)8U; +} + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_BITS_PER_COMMITMENT_COEFFICIENT ((size_t)6U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_BITS_PER_ERROR_COEFFICIENT ((size_t)3U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_BITS_PER_GAMMA1_COEFFICIENT ((size_t)18U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A ((size_t)4U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COMMITMENT_HASH_SIZE ((size_t)32U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ETA (libcrux_ml_dsa_constants_Eta_Two) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA1_EXPONENT ((size_t)17U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA2 ((LIBCRUX_ML_DSA_CONSTANTS_FIELD_MODULUS - 1) / 88) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_MAX_ONES_IN_HINT ((size_t)80U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ONES_IN_VERIFIER_CHALLENGE ((size_t)39U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A ((size_t)4U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_BITS_PER_COMMITMENT_COEFFICIENT ((size_t)4U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_BITS_PER_ERROR_COEFFICIENT ((size_t)4U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_BITS_PER_GAMMA1_COEFFICIENT ((size_t)20U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A ((size_t)5U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COMMITMENT_HASH_SIZE ((size_t)48U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ETA (libcrux_ml_dsa_constants_Eta_Four) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA1_EXPONENT ((size_t)19U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA2 ((LIBCRUX_ML_DSA_CONSTANTS_FIELD_MODULUS - 1) / 32) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_MAX_ONES_IN_HINT ((size_t)55U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ONES_IN_VERIFIER_CHALLENGE ((size_t)49U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A ((size_t)6U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_BITS_PER_COMMITMENT_COEFFICIENT ((size_t)4U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_BITS_PER_ERROR_COEFFICIENT ((size_t)3U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_BITS_PER_GAMMA1_COEFFICIENT ((size_t)20U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A ((size_t)7U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COMMITMENT_HASH_SIZE ((size_t)64U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ETA (libcrux_ml_dsa_constants_Eta_Two) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA1_EXPONENT ((size_t)19U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA2 ((LIBCRUX_ML_DSA_CONSTANTS_FIELD_MODULUS - 1) / 32) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_MAX_ONES_IN_HINT ((size_t)75U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ONES_IN_VERIFIER_CHALLENGE ((size_t)60U) + +#define LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A ((size_t)8U) + +/** +This function found in impl {core::clone::Clone for libcrux_ml_dsa::constants::Eta} +*/ +static inline libcrux_ml_dsa_constants_Eta +libcrux_ml_dsa_constants_clone_54(const libcrux_ml_dsa_constants_Eta *self) +{ + return self[0U]; +} + +static KRML_MUSTINLINE size_t +libcrux_ml_dsa_encoding_error_chunk_size(libcrux_ml_dsa_constants_Eta eta) +{ + switch (eta) + { + case libcrux_ml_dsa_constants_Eta_Two: + { + break; + } + case libcrux_ml_dsa_constants_Eta_Four: + { + return (size_t)4U; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, __LINE__); + KRML_HOST_EXIT(253U); + } + } + return (size_t)3U; +} + +#define libcrux_ml_dsa_types_VerificationError_MalformedHintError 0 +#define libcrux_ml_dsa_types_VerificationError_SignerResponseExceedsBoundError 1 +#define libcrux_ml_dsa_types_VerificationError_CommitmentHashesDontMatchError 2 +#define libcrux_ml_dsa_types_VerificationError_VerificationContextTooLongError 3 + +typedef uint8_t libcrux_ml_dsa_types_VerificationError; + +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_signature_set_hint( + Eurydice_dst_ref_mut_20 out_hint, + size_t i, + size_t j +) +{ + out_hint.ptr[i].data[j] = 1; +} + +#define LIBCRUX_ML_DSA_ENCODING_T0_OUTPUT_BYTES_PER_SIMD_UNIT ((size_t)13U) + +#define LIBCRUX_ML_DSA_ENCODING_T1_DESERIALIZE_WINDOW ((size_t)10U) + +#define LIBCRUX_ML_DSA_ENCODING_T1_SERIALIZE_OUTPUT_BYTES_PER_SIMD_UNIT ((size_t)10U) + +#define LIBCRUX_ML_DSA_HASH_FUNCTIONS_SHAKE128_BLOCK_SIZE ((size_t)168U) + +#define LIBCRUX_ML_DSA_HASH_FUNCTIONS_SHAKE128_FIVE_BLOCKS_SIZE (LIBCRUX_ML_DSA_HASH_FUNCTIONS_SHAKE128_BLOCK_SIZE * (size_t)5U) + +#define LIBCRUX_ML_DSA_HASH_FUNCTIONS_SHAKE256_BLOCK_SIZE ((size_t)136U) + +static KRML_MUSTINLINE Eurydice_arr_91 +libcrux_ml_dsa_sample_add_error_domain_separator( + Eurydice_borrow_slice_u8 slice, + uint16_t domain_separator +) +{ + Eurydice_arr_91 out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d4(&out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = slice.meta })), + slice, + uint8_t); + out.data[64U] = (uint8_t)(uint32_t)domain_separator; + out.data[65U] = (uint8_t)((uint32_t)domain_separator >> 8U & 0xFFFFU); + return out; +} + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ERROR_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_error_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_BITS_PER_ERROR_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_SIMD_TRAITS_FIELD_MODULUS (8380417) + +#define LIBCRUX_ML_DSA_SIMD_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R (58728449ULL) + +static inline uint8_t_x2 +libcrux_ml_dsa_sample_sample_up_to_four_ring_elements_flat_xy(size_t index, size_t width) +{ + return + (KRML_CLITERAL(uint8_t_x2){ .fst = (uint8_t)(index / width), .snd = (uint8_t)(index % width) }); +} + +static KRML_MUSTINLINE uint16_t libcrux_ml_dsa_sample_generate_domain_separator(uint8_t_x2 _) +{ + uint8_t row = _.fst; + uint8_t column = _.snd; + return (uint32_t)(uint16_t)(uint32_t)column | (uint32_t)(uint16_t)(uint32_t)row << 8U; +} + +static KRML_MUSTINLINE Eurydice_arr_31 +libcrux_ml_dsa_sample_add_domain_separator(Eurydice_borrow_slice_u8 slice, uint8_t_x2 indices) +{ + Eurydice_arr_31 out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d40(&out, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = slice.meta })), + slice, + uint8_t); + uint16_t domain_separator = libcrux_ml_dsa_sample_generate_domain_separator(indices); + out.data[32U] = (uint8_t)(uint32_t)domain_separator; + out.data[33U] = (uint8_t)((uint32_t)domain_separator >> 8U & 0xFFFFU); + return out; +} + +#define libcrux_ml_dsa_types_SigningError_RejectionSamplingError 0 +#define libcrux_ml_dsa_types_SigningError_ContextTooLongError 1 + +typedef uint8_t libcrux_ml_dsa_types_SigningError; + +typedef struct libcrux_ml_dsa_pre_hash_DomainSeparationContext_s +{ + Eurydice_borrow_slice_u8 context; + core_option_Option_57 pre_hash_oid; +} +libcrux_ml_dsa_pre_hash_DomainSeparationContext; + +#define libcrux_ml_dsa_pre_hash_DomainSeparationError_ContextTooLongError 0 + +typedef uint8_t libcrux_ml_dsa_pre_hash_DomainSeparationError; + +/** +A monomorphic instance of core.result.Result +with types libcrux_ml_dsa_pre_hash_DomainSeparationContext, libcrux_ml_dsa_pre_hash_DomainSeparationError + +*/ +typedef struct core_result_Result_a8_s +{ + core_result_Result_57_tags tag; + union { + libcrux_ml_dsa_pre_hash_DomainSeparationContext case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationError case_Err; + } + val; +} +core_result_Result_a8; + +/** + `context` must be at most 255 bytes long. +*/ +/** +This function found in impl {libcrux_ml_dsa::pre_hash::DomainSeparationContext<'a>} +*/ +static inline core_result_Result_a8 +libcrux_ml_dsa_pre_hash_new_88( + Eurydice_borrow_slice_u8 context, + core_option_Option_57 pre_hash_oid +) +{ + if (!(context.meta > LIBCRUX_ML_DSA_CONSTANTS_CONTEXT_MAX_LEN)) + { + return + ( + KRML_CLITERAL(core_result_Result_a8){ + .tag = core_result_Ok, + .val = { .case_Ok = { .context = context, .pre_hash_oid = pre_hash_oid } } + } + ); + } + return + ( + KRML_CLITERAL(core_result_Result_a8){ + .tag = core_result_Err, + .val = { .case_Err = libcrux_ml_dsa_pre_hash_DomainSeparationError_ContextTooLongError } + } + ); +} + +/** + Returns the pre-hash OID, if any. +*/ +/** +This function found in impl {libcrux_ml_dsa::pre_hash::DomainSeparationContext<'a>} +*/ +static inline const +core_option_Option_57 +*libcrux_ml_dsa_pre_hash_pre_hash_oid_88( + const libcrux_ml_dsa_pre_hash_DomainSeparationContext *self +) +{ + return &self->pre_hash_oid; +} + +/** + Returns the context, guaranteed to be at most 255 bytes long. +*/ +/** +This function found in impl {libcrux_ml_dsa::pre_hash::DomainSeparationContext<'a>} +*/ +static inline Eurydice_borrow_slice_u8 +libcrux_ml_dsa_pre_hash_context_88(const libcrux_ml_dsa_pre_hash_DomainSeparationContext *self) +{ + return self->context; +} + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_COMMITMENT_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_commitment_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_BITS_PER_COMMITMENT_COEFFICIENT)) + +static KRML_MUSTINLINE bool +libcrux_ml_dsa_sample_inside_out_shuffle( + Eurydice_borrow_slice_u8 randomness, + size_t *out_index, + uint64_t *signs, + Eurydice_arr_6c *result +) +{ + bool done = false; + for (size_t i = (size_t)0U; i < randomness.meta; i++) + { + size_t _cloop_j = i; + const uint8_t *byte = &randomness.ptr[_cloop_j]; + if (!done) + { + size_t sample_at = (size_t)(uint32_t)byte[0U]; + if (sample_at <= out_index[0U]) + { + result->data[out_index[0U]] = result->data[sample_at]; + out_index[0U]++; + result->data[sample_at] = 1 - 2 * (int32_t)(signs[0U] & 1ULL); + signs[0U] >>= 1U; + } + done = out_index[0U] == (size_t)256U; + } + } + return done; +} + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_BETA (libcrux_ml_dsa_constants_beta(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ONES_IN_VERIFIER_CHALLENGE, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ETA)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_GAMMA1_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_gamma1_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_BITS_PER_GAMMA1_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_PRE_HASH_SHAKE128_OID ((KRML_CLITERAL(Eurydice_arr_c9){ .data = { 6U, 9U, 96U, 134U, 72U, 1U, 101U, 3U, 4U, 2U, 11U } })) + +/** +This function found in impl {libcrux_ml_dsa::pre_hash::PreHash for libcrux_ml_dsa::pre_hash::SHAKE128_PH} +*/ +static inline Eurydice_arr_c9 libcrux_ml_dsa_pre_hash_oid_30(void) +{ + return LIBCRUX_ML_DSA_PRE_HASH_SHAKE128_OID; +} + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_VERIFICATION_KEY_SIZE (libcrux_ml_dsa_constants_verification_key_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_SIGNATURE_SIZE (libcrux_ml_dsa_constants_signature_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_MAX_ONES_IN_HINT, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COMMITMENT_HASH_SIZE, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_BITS_PER_GAMMA1_COEFFICIENT)) + +typedef Eurydice_arr_4d libcrux_ml_dsa_simd_portable_vector_type_Coefficients; + +static KRML_MUSTINLINE Eurydice_arr_4d libcrux_ml_dsa_simd_portable_vector_type_zero(void) +{ + return (KRML_CLITERAL(Eurydice_arr_4d){ .data = { 0U } }); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline Eurydice_arr_4d libcrux_ml_dsa_simd_portable_zero_65(void) +{ + return libcrux_ml_dsa_simd_portable_vector_type_zero(); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_vector_type_from_coefficient_array( + Eurydice_dst_ref_shared_83 array, + Eurydice_arr_4d *out +) +{ + Eurydice_slice_copy(Eurydice_array_to_slice_mut_fd(out), + Eurydice_slice_subslice_shared_47(array, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = LIBCRUX_ML_DSA_SIMD_TRAITS_COEFFICIENTS_IN_SIMD_UNIT + } + )), + int32_t); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_from_coefficient_array_65( + Eurydice_dst_ref_shared_83 array, + Eurydice_arr_4d *out +) +{ + libcrux_ml_dsa_simd_portable_vector_type_from_coefficient_array(array, out); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_vector_type_to_coefficient_array( + const Eurydice_arr_4d *value, + Eurydice_dst_ref_mut_83 out +) +{ + Eurydice_slice_copy(out, Eurydice_array_to_slice_shared_fd(value), int32_t); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_to_coefficient_array_65( + const Eurydice_arr_4d *value, + Eurydice_dst_ref_mut_83 out +) +{ + libcrux_ml_dsa_simd_portable_vector_type_to_coefficient_array(value, out); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_arithmetic_add(Eurydice_arr_4d *lhs, const Eurydice_arr_4d *rhs) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + size_t uu____0 = i0; + lhs->data[uu____0] += rhs->data[i0]; + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_add_65(Eurydice_arr_4d *lhs, const Eurydice_arr_4d *rhs) +{ + libcrux_ml_dsa_simd_portable_arithmetic_add(lhs, rhs); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_arithmetic_subtract( + Eurydice_arr_4d *lhs, + const Eurydice_arr_4d *rhs +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + size_t uu____0 = i0; + lhs->data[uu____0] -= rhs->data[i0]; + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_subtract_65(Eurydice_arr_4d *lhs, const Eurydice_arr_4d *rhs) +{ + libcrux_ml_dsa_simd_portable_arithmetic_subtract(lhs, rhs); +} + +static KRML_MUSTINLINE bool +libcrux_ml_dsa_simd_portable_arithmetic_infinity_norm_exceeds( + const Eurydice_arr_4d *simd_unit, + int32_t bound +) +{ + bool result = false; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + int32_t coefficient = simd_unit->data[i0]; + int32_t sign = coefficient >> 31U; + int32_t normalized = coefficient - (sign & 2 * coefficient); + bool uu____0; + if (result) + { + uu____0 = true; + } + else + { + uu____0 = normalized >= bound; + } + result = uu____0; + } + return result; +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline bool +libcrux_ml_dsa_simd_portable_infinity_norm_exceeds_65( + const Eurydice_arr_4d *simd_unit, + int32_t bound +) +{ + return libcrux_ml_dsa_simd_portable_arithmetic_infinity_norm_exceeds(simd_unit, bound); +} + +static KRML_MUSTINLINE int32_t_x2 +libcrux_ml_dsa_simd_portable_arithmetic_decompose_element(int32_t gamma2, int32_t r) +{ + int32_t r0 = r + (r >> 31U & LIBCRUX_ML_DSA_SIMD_TRAITS_FIELD_MODULUS); + int32_t ceil_of_r_by_128 = (r0 + 127) >> 7U; + int32_t r1; + switch (gamma2) + { + case 95232: + { + int32_t result = (ceil_of_r_by_128 * 11275 + (int32_t)((uint32_t)1 << 23U)) >> 24U; + int32_t result_0 = (result ^ (43 - result) >> 31U) & result; + r1 = result_0; + break; + } + case 261888: + { + int32_t result = (ceil_of_r_by_128 * 1025 + (int32_t)((uint32_t)1 << 21U)) >> 22U; + int32_t result_0 = result & 15; + r1 = result_0; + break; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "panic!"); + KRML_HOST_EXIT(255U); + } + } + int32_t alpha = gamma2 * 2; + int32_t r00 = r0 - r1 * alpha; + r00 -= + ((LIBCRUX_ML_DSA_SIMD_TRAITS_FIELD_MODULUS - 1) / 2 - r00) >> 31U & + LIBCRUX_ML_DSA_SIMD_TRAITS_FIELD_MODULUS; + return (KRML_CLITERAL(int32_t_x2){ .fst = r00, .snd = r1 }); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_arithmetic_decompose( + int32_t gamma2, + const Eurydice_arr_4d *simd_unit, + Eurydice_arr_4d *low, + Eurydice_arr_4d *high +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + int32_t_x2 + uu____0 = + libcrux_ml_dsa_simd_portable_arithmetic_decompose_element(gamma2, + simd_unit->data[i0]); + int32_t uu____1 = uu____0.snd; + low->data[i0] = uu____0.fst; + high->data[i0] = uu____1; + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_decompose_65( + int32_t gamma2, + const Eurydice_arr_4d *simd_unit, + Eurydice_arr_4d *low, + Eurydice_arr_4d *high +) +{ + libcrux_ml_dsa_simd_portable_arithmetic_decompose(gamma2, simd_unit, low, high); +} + +static KRML_MUSTINLINE int32_t +libcrux_ml_dsa_simd_portable_arithmetic_compute_one_hint( + int32_t low, + int32_t high, + int32_t gamma2 +) +{ + int32_t uu____0; + if (low > gamma2) + { + uu____0 = 1; + } + else if (low < -gamma2) + { + uu____0 = 1; + } + else if (low == -gamma2) + { + if (high != 0) + { + uu____0 = 1; + } + else + { + uu____0 = 0; + } + } + else + { + uu____0 = 0; + } + return uu____0; +} + +static KRML_MUSTINLINE size_t +libcrux_ml_dsa_simd_portable_arithmetic_compute_hint( + const Eurydice_arr_4d *low, + const Eurydice_arr_4d *high, + int32_t gamma2, + Eurydice_arr_4d *hint +) +{ + size_t one_hints_count = (size_t)0U; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + hint->data[i0] = + libcrux_ml_dsa_simd_portable_arithmetic_compute_one_hint(low->data[i0], + high->data[i0], + gamma2); + one_hints_count += (size_t)hint->data[i0]; + } + return one_hints_count; +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline size_t +libcrux_ml_dsa_simd_portable_compute_hint_65( + const Eurydice_arr_4d *low, + const Eurydice_arr_4d *high, + int32_t gamma2, + Eurydice_arr_4d *hint +) +{ + return libcrux_ml_dsa_simd_portable_arithmetic_compute_hint(low, high, gamma2, hint); +} + +static KRML_MUSTINLINE int32_t +libcrux_ml_dsa_simd_portable_arithmetic_use_one_hint(int32_t gamma2, int32_t r, int32_t hint) +{ + int32_t_x2 uu____0 = libcrux_ml_dsa_simd_portable_arithmetic_decompose_element(gamma2, r); + int32_t r0 = uu____0.fst; + int32_t r1 = uu____0.snd; + int32_t uu____1; + if (!(hint == 0)) + { + switch (gamma2) + { + case 95232: + { + if (r0 > 0) + { + if (r1 == 43) + { + uu____1 = 0; + } + else + { + uu____1 = r1 + hint; + } + } + else if (r1 == 0) + { + uu____1 = 43; + } + else + { + uu____1 = r1 - hint; + } + break; + } + case 261888: + { + if (r0 > 0) + { + uu____1 = (r1 + hint) & 15; + } + else + { + uu____1 = (r1 - hint) & 15; + } + break; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "panic!"); + KRML_HOST_EXIT(255U); + } + } + return uu____1; + } + return r1; +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_arithmetic_use_hint( + int32_t gamma2, + const Eurydice_arr_4d *simd_unit, + Eurydice_arr_4d *hint +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + int32_t + uu____0 = + libcrux_ml_dsa_simd_portable_arithmetic_use_one_hint(gamma2, + simd_unit->data[i0], + hint->data[i0]); + hint->data[i0] = uu____0; + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_use_hint_65( + int32_t gamma2, + const Eurydice_arr_4d *simd_unit, + Eurydice_arr_4d *hint +) +{ + libcrux_ml_dsa_simd_portable_arithmetic_use_hint(gamma2, simd_unit, hint); +} + +static KRML_MUSTINLINE uint64_t +libcrux_ml_dsa_simd_portable_arithmetic_get_n_least_significant_bits(uint8_t n, uint64_t value) +{ + return value & ((1ULL << (uint32_t)n) - 1ULL); +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT (32U) + +static KRML_MUSTINLINE int32_t +libcrux_ml_dsa_simd_portable_arithmetic_montgomery_reduce_element(int64_t value) +{ + uint64_t + t = + libcrux_ml_dsa_simd_portable_arithmetic_get_n_least_significant_bits(LIBCRUX_ML_DSA_SIMD_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT, + (uint64_t)value) + * LIBCRUX_ML_DSA_SIMD_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R; + int32_t + k = + (int32_t)libcrux_ml_dsa_simd_portable_arithmetic_get_n_least_significant_bits(LIBCRUX_ML_DSA_SIMD_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT, + t); + int64_t k_times_modulus = (int64_t)k * (int64_t)LIBCRUX_ML_DSA_SIMD_TRAITS_FIELD_MODULUS; + int32_t + c = + (int32_t)(k_times_modulus >> (uint32_t)LIBCRUX_ML_DSA_SIMD_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT); + int32_t + value_high = + (int32_t)(value >> (uint32_t)LIBCRUX_ML_DSA_SIMD_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT); + return value_high - c; +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply( + Eurydice_arr_4d *lhs, + const Eurydice_arr_4d *rhs +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + lhs->data[i0] = + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_reduce_element((int64_t)lhs->data[i0] * + (int64_t)rhs->data[i0]); + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_montgomery_multiply_65( + Eurydice_arr_4d *lhs, + const Eurydice_arr_4d *rhs +) +{ + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply(lhs, rhs); +} + +static KRML_MUSTINLINE int32_t +libcrux_ml_dsa_simd_portable_arithmetic_barrett_reduce_element(int32_t fe) +{ + int32_t quotient = (fe + (int32_t)((uint32_t)1 << 22U)) >> 23U; + return fe - quotient * LIBCRUX_ML_DSA_SIMD_TRAITS_FIELD_MODULUS; +} + +static inline void +libcrux_ml_dsa_simd_portable_arithmetic_barrett_reduce_simd_unit(Eurydice_arr_4d *simd_unit) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + simd_unit->data[i0] = + libcrux_ml_dsa_simd_portable_arithmetic_barrett_reduce_element(simd_unit->data[i0]); + } +} + +static KRML_MUSTINLINE int32_t_x2 +libcrux_ml_dsa_simd_portable_arithmetic_power2round_element(int32_t t) +{ + int32_t t2 = t + (t >> 31U & LIBCRUX_ML_DSA_SIMD_TRAITS_FIELD_MODULUS); + int32_t + t1 = + (t2 - 1 + + (int32_t)((uint32_t)1 << + (uint32_t)(LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T - (size_t)1U))) + >> (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T; + int32_t + t0 = t2 - (int32_t)((uint32_t)t1 << (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T); + return (KRML_CLITERAL(int32_t_x2){ .fst = t0, .snd = t1 }); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_arithmetic_power2round(Eurydice_arr_4d *t0, Eurydice_arr_4d *t1) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + int32_t_x2 uu____0 = libcrux_ml_dsa_simd_portable_arithmetic_power2round_element(t0->data[i0]); + int32_t uu____1 = uu____0.snd; + t0->data[i0] = uu____0.fst; + t1->data[i0] = uu____1; + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_power2round_65(Eurydice_arr_4d *t0, Eurydice_arr_4d *t1) +{ + libcrux_ml_dsa_simd_portable_arithmetic_power2round(t0, t1); +} + +static KRML_MUSTINLINE size_t +libcrux_ml_dsa_simd_portable_sample_rejection_sample_less_than_field_modulus( + Eurydice_borrow_slice_u8 randomness, + Eurydice_dst_ref_mut_83 out +) +{ + size_t sampled = (size_t)0U; + for (size_t i = (size_t)0U; i < randomness.meta / (size_t)3U; i++) + { + size_t i0 = i; + int32_t b0 = (int32_t)(uint32_t)randomness.ptr[i0 * (size_t)3U]; + int32_t b1 = (int32_t)(uint32_t)randomness.ptr[i0 * (size_t)3U + (size_t)1U]; + int32_t b2 = (int32_t)(uint32_t)randomness.ptr[i0 * (size_t)3U + (size_t)2U]; + int32_t + coefficient = (((int32_t)((uint32_t)b2 << 16U) | (int32_t)((uint32_t)b1 << 8U)) | b0) & 8388607; + if (coefficient < LIBCRUX_ML_DSA_CONSTANTS_FIELD_MODULUS) + { + out.ptr[sampled] = coefficient; + sampled++; + } + } + return sampled; +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline size_t +libcrux_ml_dsa_simd_portable_rejection_sample_less_than_field_modulus_65( + Eurydice_borrow_slice_u8 randomness, + Eurydice_dst_ref_mut_83 out +) +{ + return + libcrux_ml_dsa_simd_portable_sample_rejection_sample_less_than_field_modulus(randomness, + out); +} + +static KRML_MUSTINLINE size_t +libcrux_ml_dsa_simd_portable_sample_rejection_sample_less_than_eta_equals_2( + Eurydice_borrow_slice_u8 randomness, + Eurydice_dst_ref_mut_83 out +) +{ + size_t sampled = (size_t)0U; + for (size_t i = (size_t)0U; i < randomness.meta; i++) + { + size_t i0 = i; + uint8_t byte = randomness.ptr[i0]; + uint8_t try_0 = (uint32_t)byte & 15U; + uint8_t try_1 = (uint32_t)byte >> 4U; + bool try_0_comp = try_0 < 15U; + bool try_1_comp = try_1 < 15U; + if (try_0_comp) + { + int32_t try_00 = (int32_t)(uint32_t)try_0; + int32_t try_0_mod_5 = try_00 - (try_00 * 26 >> 7U) * 5; + out.ptr[sampled] = 2 - try_0_mod_5; + sampled++; + } + if (try_1_comp) + { + int32_t try_10 = (int32_t)(uint32_t)try_1; + int32_t try_1_mod_5 = try_10 - (try_10 * 26 >> 7U) * 5; + out.ptr[sampled] = 2 - try_1_mod_5; + sampled++; + } + } + return sampled; +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline size_t +libcrux_ml_dsa_simd_portable_rejection_sample_less_than_eta_equals_2_65( + Eurydice_borrow_slice_u8 randomness, + Eurydice_dst_ref_mut_83 out +) +{ + return + libcrux_ml_dsa_simd_portable_sample_rejection_sample_less_than_eta_equals_2(randomness, + out); +} + +static KRML_MUSTINLINE size_t +libcrux_ml_dsa_simd_portable_sample_rejection_sample_less_than_eta_equals_4( + Eurydice_borrow_slice_u8 randomness, + Eurydice_dst_ref_mut_83 out +) +{ + size_t sampled = (size_t)0U; + for (size_t i = (size_t)0U; i < randomness.meta; i++) + { + size_t i0 = i; + uint8_t byte = randomness.ptr[i0]; + uint8_t try_0 = (uint32_t)byte & 15U; + uint8_t try_1 = (uint32_t)byte >> 4U; + bool try_0_comp = try_0 < 9U; + bool try_1_comp = try_1 < 9U; + if (try_0_comp) + { + out.ptr[sampled] = 4 - (int32_t)(uint32_t)try_0; + sampled++; + } + if (try_1_comp) + { + out.ptr[sampled] = 4 - (int32_t)(uint32_t)try_1; + sampled++; + } + } + return sampled; +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline size_t +libcrux_ml_dsa_simd_portable_rejection_sample_less_than_eta_equals_4_65( + Eurydice_borrow_slice_u8 randomness, + Eurydice_dst_ref_mut_83 out +) +{ + return + libcrux_ml_dsa_simd_portable_sample_rejection_sample_less_than_eta_equals_4(randomness, + out); +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_SERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1 ((int32_t)((uint32_t)1 << 19U)) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_gamma1_serialize_when_gamma1_is_2_pow_19( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U / (size_t)2U; i++) + { + size_t i0 = i; + Eurydice_dst_ref_shared_83 + coefficients = + Eurydice_array_to_subslice_shared_44(simd_unit, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)2U, + .end = i0 * (size_t)2U + (size_t)2U + } + )); + int32_t + coefficient0 = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_SERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1 - + coefficients.ptr[0U]; + int32_t + coefficient1 = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_SERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1 - + coefficients.ptr[1U]; + serialized.ptr[(size_t)5U * i0] = (uint8_t)coefficient0; + serialized.ptr[(size_t)5U * i0 + (size_t)1U] = (uint8_t)(coefficient0 >> 8U); + serialized.ptr[(size_t)5U * i0 + (size_t)2U] = (uint8_t)(coefficient0 >> 16U); + size_t uu____0 = (size_t)5U * i0 + (size_t)2U; + serialized.ptr[uu____0] = + (uint32_t)serialized.ptr[uu____0] | (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient1 << 4U); + serialized.ptr[(size_t)5U * i0 + (size_t)3U] = (uint8_t)(coefficient1 >> 4U); + serialized.ptr[(size_t)5U * i0 + (size_t)4U] = (uint8_t)(coefficient1 >> 12U); + } +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_SERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 ((int32_t)((uint32_t)1 << 17U)) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_gamma1_serialize_when_gamma1_is_2_pow_17( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U / (size_t)4U; i++) + { + size_t i0 = i; + Eurydice_dst_ref_shared_83 + coefficients = + Eurydice_array_to_subslice_shared_44(simd_unit, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)4U, + .end = i0 * (size_t)4U + (size_t)4U + } + )); + int32_t + coefficient0 = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_SERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 - + coefficients.ptr[0U]; + int32_t + coefficient1 = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_SERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 - + coefficients.ptr[1U]; + int32_t + coefficient2 = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_SERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 - + coefficients.ptr[2U]; + int32_t + coefficient3 = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_SERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 - + coefficients.ptr[3U]; + serialized.ptr[(size_t)9U * i0] = (uint8_t)coefficient0; + serialized.ptr[(size_t)9U * i0 + (size_t)1U] = (uint8_t)(coefficient0 >> 8U); + serialized.ptr[(size_t)9U * i0 + (size_t)2U] = (uint8_t)(coefficient0 >> 16U); + size_t uu____0 = (size_t)9U * i0 + (size_t)2U; + serialized.ptr[uu____0] = + (uint32_t)serialized.ptr[uu____0] | (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient1 << 2U); + serialized.ptr[(size_t)9U * i0 + (size_t)3U] = (uint8_t)(coefficient1 >> 6U); + serialized.ptr[(size_t)9U * i0 + (size_t)4U] = (uint8_t)(coefficient1 >> 14U); + size_t uu____1 = (size_t)9U * i0 + (size_t)4U; + serialized.ptr[uu____1] = + (uint32_t)serialized.ptr[uu____1] | (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient2 << 4U); + serialized.ptr[(size_t)9U * i0 + (size_t)5U] = (uint8_t)(coefficient2 >> 4U); + serialized.ptr[(size_t)9U * i0 + (size_t)6U] = (uint8_t)(coefficient2 >> 12U); + size_t uu____2 = (size_t)9U * i0 + (size_t)6U; + serialized.ptr[uu____2] = + (uint32_t)serialized.ptr[uu____2] | (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient3 << 6U); + serialized.ptr[(size_t)9U * i0 + (size_t)7U] = (uint8_t)(coefficient3 >> 2U); + serialized.ptr[(size_t)9U * i0 + (size_t)8U] = (uint8_t)(coefficient3 >> 10U); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_gamma1_serialize( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized, + size_t gamma1_exponent +) +{ + switch (gamma1_exponent) + { + case 17U: + { + break; + } + case 19U: + { + libcrux_ml_dsa_simd_portable_encoding_gamma1_serialize_when_gamma1_is_2_pow_19(simd_unit, + serialized); + return; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "panic!"); + KRML_HOST_EXIT(255U); + } + } + libcrux_ml_dsa_simd_portable_encoding_gamma1_serialize_when_gamma1_is_2_pow_17(simd_unit, + serialized); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_gamma1_serialize_65( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized, + size_t gamma1_exponent +) +{ + libcrux_ml_dsa_simd_portable_encoding_gamma1_serialize(simd_unit, serialized, gamma1_exponent); +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1 ((int32_t)((uint32_t)1 << 19U)) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1_TIMES_2_BITMASK ((int32_t)((uint32_t)LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1 << 1U) - 1) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_gamma1_deserialize_when_gamma1_is_2_pow_19( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *simd_unit +) +{ + for (size_t i = (size_t)0U; i < serialized.meta / (size_t)5U; i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)5U, + .end = i0 * (size_t)5U + (size_t)5U + } + )); + int32_t coefficient0 = (int32_t)(uint32_t)bytes.ptr[0U]; + coefficient0 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[1U] << 8U); + coefficient0 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[2U] << 16U); + coefficient0 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1_TIMES_2_BITMASK; + int32_t coefficient1 = (int32_t)(uint32_t)bytes.ptr[2U] >> 4U; + coefficient1 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[3U] << 4U); + coefficient1 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[4U] << 12U); + simd_unit->data[(size_t)2U * i0] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1 - + coefficient0; + simd_unit->data[(size_t)2U * i0 + (size_t)1U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_19_GAMMA1 - + coefficient1; + } +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 ((int32_t)((uint32_t)1 << 17U)) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1_TIMES_2_BITMASK ((int32_t)((uint32_t)LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 << 1U) - 1) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_gamma1_deserialize_when_gamma1_is_2_pow_17( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *simd_unit +) +{ + for (size_t i = (size_t)0U; i < serialized.meta / (size_t)9U; i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)9U, + .end = i0 * (size_t)9U + (size_t)9U + } + )); + int32_t coefficient0 = (int32_t)(uint32_t)bytes.ptr[0U]; + coefficient0 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[1U] << 8U); + coefficient0 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[2U] << 16U); + coefficient0 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1_TIMES_2_BITMASK; + int32_t coefficient1 = (int32_t)(uint32_t)bytes.ptr[2U] >> 2U; + coefficient1 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[3U] << 6U); + coefficient1 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[4U] << 14U); + coefficient1 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1_TIMES_2_BITMASK; + int32_t coefficient2 = (int32_t)(uint32_t)bytes.ptr[4U] >> 4U; + coefficient2 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[5U] << 4U); + coefficient2 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[6U] << 12U); + coefficient2 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1_TIMES_2_BITMASK; + int32_t coefficient3 = (int32_t)(uint32_t)bytes.ptr[6U] >> 6U; + coefficient3 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[7U] << 2U); + coefficient3 |= (int32_t)((uint32_t)(int32_t)(uint32_t)bytes.ptr[8U] << 10U); + coefficient3 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1_TIMES_2_BITMASK; + simd_unit->data[(size_t)4U * i0] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 - + coefficient0; + simd_unit->data[(size_t)4U * i0 + (size_t)1U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 - + coefficient1; + simd_unit->data[(size_t)4U * i0 + (size_t)2U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 - + coefficient2; + simd_unit->data[(size_t)4U * i0 + (size_t)3U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_GAMMA1_DESERIALIZE_WHEN_GAMMA1_IS_2_POW_17_GAMMA1 - + coefficient3; + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_gamma1_deserialize( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *out, + size_t gamma1_exponent +) +{ + switch (gamma1_exponent) + { + case 17U: + { + break; + } + case 19U: + { + libcrux_ml_dsa_simd_portable_encoding_gamma1_deserialize_when_gamma1_is_2_pow_19(serialized, + out); + return; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "panic!"); + KRML_HOST_EXIT(255U); + } + } + libcrux_ml_dsa_simd_portable_encoding_gamma1_deserialize_when_gamma1_is_2_pow_17(serialized, + out); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_gamma1_deserialize_65( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *out, + size_t gamma1_exponent +) +{ + libcrux_ml_dsa_simd_portable_encoding_gamma1_deserialize(serialized, out, gamma1_exponent); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_commitment_serialize_4( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + uint8_t coefficient0 = (uint8_t)simd_unit->data[0U]; + uint8_t coefficient1 = (uint8_t)simd_unit->data[1U]; + uint8_t coefficient2 = (uint8_t)simd_unit->data[2U]; + uint8_t coefficient3 = (uint8_t)simd_unit->data[3U]; + uint8_t coefficient4 = (uint8_t)simd_unit->data[4U]; + uint8_t coefficient5 = (uint8_t)simd_unit->data[5U]; + uint8_t coefficient6 = (uint8_t)simd_unit->data[6U]; + uint8_t coefficient7 = (uint8_t)simd_unit->data[7U]; + uint8_t byte0 = (uint32_t)coefficient1 << 4U | (uint32_t)coefficient0; + uint8_t byte1 = (uint32_t)coefficient3 << 4U | (uint32_t)coefficient2; + uint8_t byte2 = (uint32_t)coefficient5 << 4U | (uint32_t)coefficient4; + uint8_t byte3 = (uint32_t)coefficient7 << 4U | (uint32_t)coefficient6; + serialized.ptr[0U] = byte0; + serialized.ptr[1U] = byte1; + serialized.ptr[2U] = byte2; + serialized.ptr[3U] = byte3; +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_commitment_serialize_6( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + uint8_t coefficient0 = (uint8_t)simd_unit->data[0U]; + uint8_t coefficient1 = (uint8_t)simd_unit->data[1U]; + uint8_t coefficient2 = (uint8_t)simd_unit->data[2U]; + uint8_t coefficient3 = (uint8_t)simd_unit->data[3U]; + uint8_t coefficient4 = (uint8_t)simd_unit->data[4U]; + uint8_t coefficient5 = (uint8_t)simd_unit->data[5U]; + uint8_t coefficient6 = (uint8_t)simd_unit->data[6U]; + uint8_t coefficient7 = (uint8_t)simd_unit->data[7U]; + uint8_t byte0 = (uint32_t)coefficient1 << 6U | (uint32_t)coefficient0; + uint8_t byte1 = (uint32_t)coefficient2 << 4U | (uint32_t)coefficient1 >> 2U; + uint8_t byte2 = (uint32_t)coefficient3 << 2U | (uint32_t)coefficient2 >> 4U; + uint8_t byte3 = (uint32_t)coefficient5 << 6U | (uint32_t)coefficient4; + uint8_t byte4 = (uint32_t)coefficient6 << 4U | (uint32_t)coefficient5 >> 2U; + uint8_t byte5 = (uint32_t)coefficient7 << 2U | (uint32_t)coefficient6 >> 4U; + serialized.ptr[0U] = byte0; + serialized.ptr[1U] = byte1; + serialized.ptr[2U] = byte2; + serialized.ptr[3U] = byte3; + serialized.ptr[4U] = byte4; + serialized.ptr[5U] = byte5; +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_commitment_serialize( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + switch ((uint32_t)(uint8_t)serialized.meta) + { + case 4U: + { + libcrux_ml_dsa_simd_portable_encoding_commitment_serialize_4(simd_unit, serialized); + break; + } + case 6U: + { + libcrux_ml_dsa_simd_portable_encoding_commitment_serialize_6(simd_unit, serialized); + break; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "panic!"); + KRML_HOST_EXIT(255U); + } + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_commitment_serialize_65( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + libcrux_ml_dsa_simd_portable_encoding_commitment_serialize(simd_unit, serialized); +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_4_ETA (4) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_error_serialize_when_eta_is_4( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U / (size_t)2U; i++) + { + size_t i0 = i; + Eurydice_dst_ref_shared_83 + coefficients = + Eurydice_array_to_subslice_shared_44(simd_unit, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)2U, + .end = i0 * (size_t)2U + (size_t)2U + } + )); + uint8_t + coefficient0 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_4_ETA - + coefficients.ptr[0U]); + uint8_t + coefficient1 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_4_ETA - + coefficients.ptr[1U]); + serialized.ptr[i0] = (uint32_t)coefficient1 << 4U | (uint32_t)coefficient0; + } +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA (2) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_error_serialize_when_eta_is_2( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + uint8_t + coefficient0 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA - + simd_unit->data[0U]); + uint8_t + coefficient1 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA - + simd_unit->data[1U]); + uint8_t + coefficient2 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA - + simd_unit->data[2U]); + uint8_t + coefficient3 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA - + simd_unit->data[3U]); + uint8_t + coefficient4 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA - + simd_unit->data[4U]); + uint8_t + coefficient5 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA - + simd_unit->data[5U]); + uint8_t + coefficient6 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA - + simd_unit->data[6U]); + uint8_t + coefficient7 = + (uint8_t)(LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_SERIALIZE_WHEN_ETA_IS_2_ETA - + simd_unit->data[7U]); + serialized.ptr[0U] = + ((uint32_t)coefficient2 << 6U | (uint32_t)coefficient1 << 3U) | (uint32_t)coefficient0; + serialized.ptr[1U] = + (((uint32_t)coefficient5 << 7U | (uint32_t)coefficient4 << 4U) | (uint32_t)coefficient3 << 1U) + | (uint32_t)coefficient2 >> 2U; + serialized.ptr[2U] = + ((uint32_t)coefficient7 << 5U | (uint32_t)coefficient6 << 2U) | (uint32_t)coefficient5 >> 1U; +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_error_serialize( + libcrux_ml_dsa_constants_Eta eta, + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + switch (eta) + { + case libcrux_ml_dsa_constants_Eta_Two: + { + break; + } + case libcrux_ml_dsa_constants_Eta_Four: + { + libcrux_ml_dsa_simd_portable_encoding_error_serialize_when_eta_is_4(simd_unit, serialized); + return; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, __LINE__); + KRML_HOST_EXIT(253U); + } + } + libcrux_ml_dsa_simd_portable_encoding_error_serialize_when_eta_is_2(simd_unit, serialized); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_error_serialize_65( + libcrux_ml_dsa_constants_Eta eta, + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + libcrux_ml_dsa_simd_portable_encoding_error_serialize(eta, simd_unit, serialized); +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_4_ETA (4) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_error_deserialize_when_eta_is_4( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *simd_units +) +{ + for (size_t i = (size_t)0U; i < serialized.meta; i++) + { + size_t i0 = i; + const uint8_t *byte = &serialized.ptr[i0]; + uint8_t uu____0 = core_ops_bit__core__ops__bit__BitAnd_u8__u8__for__0__u8___bitand(byte, 15U); + simd_units->data[(size_t)2U * i0] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_4_ETA - + (int32_t)(uint32_t)uu____0; + uint8_t uu____1 = core_ops_bit__core__ops__bit__Shr_i32__u8__for__0__u8___shr(byte, 4); + simd_units->data[(size_t)2U * i0 + (size_t)1U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_4_ETA - + (int32_t)(uint32_t)uu____1; + } +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA (2) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_error_deserialize_when_eta_is_2( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *simd_unit +) +{ + int32_t byte0 = (int32_t)(uint32_t)serialized.ptr[0U]; + int32_t byte1 = (int32_t)(uint32_t)serialized.ptr[1U]; + int32_t byte2 = (int32_t)(uint32_t)serialized.ptr[2U]; + simd_unit->data[0U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA - (byte0 & 7); + simd_unit->data[1U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA - (byte0 >> 3U & 7); + simd_unit->data[2U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA - + ((byte0 >> 6U | (int32_t)((uint32_t)byte1 << 2U)) & 7); + simd_unit->data[3U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA - (byte1 >> 1U & 7); + simd_unit->data[4U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA - (byte1 >> 4U & 7); + simd_unit->data[5U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA - + ((byte1 >> 7U | (int32_t)((uint32_t)byte2 << 1U)) & 7); + simd_unit->data[6U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA - (byte2 >> 2U & 7); + simd_unit->data[7U] = + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_ERROR_DESERIALIZE_WHEN_ETA_IS_2_ETA - (byte2 >> 5U & 7); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_error_deserialize( + libcrux_ml_dsa_constants_Eta eta, + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *out +) +{ + switch (eta) + { + case libcrux_ml_dsa_constants_Eta_Two: + { + break; + } + case libcrux_ml_dsa_constants_Eta_Four: + { + libcrux_ml_dsa_simd_portable_encoding_error_deserialize_when_eta_is_4(serialized, out); + return; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, __LINE__); + KRML_HOST_EXIT(253U); + } + } + libcrux_ml_dsa_simd_portable_encoding_error_deserialize_when_eta_is_2(serialized, out); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_error_deserialize_65( + libcrux_ml_dsa_constants_Eta eta, + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *out +) +{ + libcrux_ml_dsa_simd_portable_encoding_error_deserialize(eta, serialized, out); +} + +static KRML_MUSTINLINE int32_t +libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(int32_t t0) +{ + return + (int32_t)((uint32_t)1 << + (uint32_t)(LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T - (size_t)1U)) + - t0; +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_t0_serialize( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + int32_t + coefficient0 = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(simd_unit->data[0U]); + int32_t + coefficient1 = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(simd_unit->data[1U]); + int32_t + coefficient2 = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(simd_unit->data[2U]); + int32_t + coefficient3 = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(simd_unit->data[3U]); + int32_t + coefficient4 = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(simd_unit->data[4U]); + int32_t + coefficient5 = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(simd_unit->data[5U]); + int32_t + coefficient6 = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(simd_unit->data[6U]); + int32_t + coefficient7 = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(simd_unit->data[7U]); + serialized.ptr[0U] = (uint8_t)coefficient0; + serialized.ptr[1U] = + (uint32_t)(uint8_t)(coefficient0 >> 8U) | + (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient1 << 5U); + serialized.ptr[2U] = (uint8_t)(coefficient1 >> 3U); + serialized.ptr[3U] = + (uint32_t)(uint8_t)(coefficient1 >> 11U) | + (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient2 << 2U); + serialized.ptr[4U] = + (uint32_t)(uint8_t)(coefficient2 >> 6U) | + (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient3 << 7U); + serialized.ptr[5U] = (uint8_t)(coefficient3 >> 1U); + serialized.ptr[6U] = + (uint32_t)(uint8_t)(coefficient3 >> 9U) | + (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient4 << 4U); + serialized.ptr[7U] = (uint8_t)(coefficient4 >> 4U); + serialized.ptr[8U] = + (uint32_t)(uint8_t)(coefficient4 >> 12U) | + (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient5 << 1U); + serialized.ptr[9U] = + (uint32_t)(uint8_t)(coefficient5 >> 7U) | + (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient6 << 6U); + serialized.ptr[10U] = (uint8_t)(coefficient6 >> 2U); + serialized.ptr[11U] = + (uint32_t)(uint8_t)(coefficient6 >> 10U) | + (uint32_t)(uint8_t)(int32_t)((uint32_t)coefficient7 << 3U); + serialized.ptr[12U] = (uint8_t)(coefficient7 >> 5U); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_t0_serialize_65( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_ml_dsa_simd_portable_encoding_t0_serialize(simd_unit, out); +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK ((int32_t)((uint32_t)1 << (uint32_t)(int32_t)LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_LOWER_PART_OF_T) - 1) + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_t0_deserialize( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *simd_unit +) +{ + int32_t byte0 = (int32_t)(uint32_t)serialized.ptr[0U]; + int32_t byte1 = (int32_t)(uint32_t)serialized.ptr[1U]; + int32_t byte2 = (int32_t)(uint32_t)serialized.ptr[2U]; + int32_t byte3 = (int32_t)(uint32_t)serialized.ptr[3U]; + int32_t byte4 = (int32_t)(uint32_t)serialized.ptr[4U]; + int32_t byte5 = (int32_t)(uint32_t)serialized.ptr[5U]; + int32_t byte6 = (int32_t)(uint32_t)serialized.ptr[6U]; + int32_t byte7 = (int32_t)(uint32_t)serialized.ptr[7U]; + int32_t byte8 = (int32_t)(uint32_t)serialized.ptr[8U]; + int32_t byte9 = (int32_t)(uint32_t)serialized.ptr[9U]; + int32_t byte10 = (int32_t)(uint32_t)serialized.ptr[10U]; + int32_t byte11 = (int32_t)(uint32_t)serialized.ptr[11U]; + int32_t byte12 = (int32_t)(uint32_t)serialized.ptr[12U]; + int32_t coefficient0 = byte0; + coefficient0 |= (int32_t)((uint32_t)byte1 << 8U); + coefficient0 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK; + int32_t coefficient1 = byte1 >> 5U; + coefficient1 |= (int32_t)((uint32_t)byte2 << 3U); + coefficient1 |= (int32_t)((uint32_t)byte3 << 11U); + coefficient1 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK; + int32_t coefficient2 = byte3 >> 2U; + coefficient2 |= (int32_t)((uint32_t)byte4 << 6U); + coefficient2 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK; + int32_t coefficient3 = byte4 >> 7U; + coefficient3 |= (int32_t)((uint32_t)byte5 << 1U); + coefficient3 |= (int32_t)((uint32_t)byte6 << 9U); + coefficient3 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK; + int32_t coefficient4 = byte6 >> 4U; + coefficient4 |= (int32_t)((uint32_t)byte7 << 4U); + coefficient4 |= (int32_t)((uint32_t)byte8 << 12U); + coefficient4 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK; + int32_t coefficient5 = byte8 >> 1U; + coefficient5 |= (int32_t)((uint32_t)byte9 << 7U); + coefficient5 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK; + int32_t coefficient6 = byte9 >> 6U; + coefficient6 |= (int32_t)((uint32_t)byte10 << 2U); + coefficient6 |= (int32_t)((uint32_t)byte11 << 10U); + coefficient6 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK; + int32_t coefficient7 = byte11 >> 3U; + coefficient7 |= (int32_t)((uint32_t)byte12 << 5U); + coefficient7 &= + LIBCRUX_ML_DSA_SIMD_PORTABLE_ENCODING_T0_DESERIALIZE_BITS_IN_LOWER_PART_OF_T_MASK; + simd_unit->data[0U] = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(coefficient0); + simd_unit->data[1U] = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(coefficient1); + simd_unit->data[2U] = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(coefficient2); + simd_unit->data[3U] = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(coefficient3); + simd_unit->data[4U] = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(coefficient4); + simd_unit->data[5U] = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(coefficient5); + simd_unit->data[6U] = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(coefficient6); + simd_unit->data[7U] = libcrux_ml_dsa_simd_portable_encoding_t0_change_t0_interval(coefficient7); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_t0_deserialize_65( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *out +) +{ + libcrux_ml_dsa_simd_portable_encoding_t0_deserialize(serialized, out); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_t1_serialize( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U / (size_t)4U; i++) + { + size_t i0 = i; + Eurydice_dst_ref_shared_83 + coefficients = + Eurydice_array_to_subslice_shared_44(simd_unit, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)4U, + .end = i0 * (size_t)4U + (size_t)4U + } + )); + serialized.ptr[(size_t)5U * i0] = (uint8_t)(coefficients.ptr[0U] & 255); + serialized.ptr[(size_t)5U * i0 + (size_t)1U] = + (uint32_t)(uint8_t)(coefficients.ptr[1U] & 63) << 2U | + (uint32_t)(uint8_t)(coefficients.ptr[0U] >> 8U & 3); + serialized.ptr[(size_t)5U * i0 + (size_t)2U] = + (uint32_t)(uint8_t)(coefficients.ptr[2U] & 15) << 4U | + (uint32_t)(uint8_t)(coefficients.ptr[1U] >> 6U & 15); + serialized.ptr[(size_t)5U * i0 + (size_t)3U] = + (uint32_t)(uint8_t)(coefficients.ptr[3U] & 3) << 6U | + (uint32_t)(uint8_t)(coefficients.ptr[2U] >> 4U & 63); + serialized.ptr[(size_t)5U * i0 + (size_t)4U] = (uint8_t)(coefficients.ptr[3U] >> 2U & 255); + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_t1_serialize_65( + const Eurydice_arr_4d *simd_unit, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_ml_dsa_simd_portable_encoding_t1_serialize(simd_unit, out); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_encoding_t1_deserialize( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *simd_unit +) +{ + int32_t + mask = (int32_t)((uint32_t)1 << (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_BITS_IN_UPPER_PART_OF_T) - 1; + for (size_t i = (size_t)0U; i < serialized.meta / (size_t)5U; i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)5U, + .end = i0 * (size_t)5U + (size_t)5U + } + )); + int32_t byte0 = (int32_t)(uint32_t)bytes.ptr[0U]; + int32_t byte1 = (int32_t)(uint32_t)bytes.ptr[1U]; + int32_t byte2 = (int32_t)(uint32_t)bytes.ptr[2U]; + int32_t byte3 = (int32_t)(uint32_t)bytes.ptr[3U]; + int32_t byte4 = (int32_t)(uint32_t)bytes.ptr[4U]; + simd_unit->data[(size_t)4U * i0] = (byte0 | (int32_t)((uint32_t)byte1 << 8U)) & mask; + simd_unit->data[(size_t)4U * i0 + (size_t)1U] = + (byte1 >> 2U | (int32_t)((uint32_t)byte2 << 6U)) & mask; + simd_unit->data[(size_t)4U * i0 + (size_t)2U] = + (byte2 >> 4U | (int32_t)((uint32_t)byte3 << 4U)) & mask; + simd_unit->data[(size_t)4U * i0 + (size_t)3U] = + (byte3 >> 6U | (int32_t)((uint32_t)byte4 << 2U)) & mask; + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_t1_deserialize_65( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_4d *out +) +{ + libcrux_ml_dsa_simd_portable_encoding_t1_deserialize(serialized, out); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant( + Eurydice_arr_4d *simd_unit, + int32_t c +) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + simd_unit->data[i0] = + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_reduce_element((int64_t)simd_unit->data[i0] + * (int64_t)c); + } +} + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- $32size_t +*/ +typedef struct Eurydice_arr_a3_s { Eurydice_arr_4d data[32U]; } Eurydice_arr_a3; + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round( + Eurydice_arr_a3 *re, + size_t index, + size_t step_by, + int32_t zeta +) +{ + Eurydice_arr_4d tmp = re->data[index + step_by]; + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&tmp, zeta); + re->data[index + step_by] = re->data[index]; + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[index + step_by], &tmp); + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[index], &tmp); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 16 +- ZETA= 25847 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_30(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)16U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)16U, 25847); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_7(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_30(re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 8 +- ZETA= -2608894 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_300(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)8U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)8U, -2608894); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 16 +- STEP_BY= 8 +- ZETA= -518909 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_42(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)16U; i < (size_t)16U + (size_t)8U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)8U, -518909); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_6(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_300(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_42(re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 4 +- ZETA= 237124 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_301(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)4U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)4U, 237124); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 8 +- STEP_BY= 4 +- ZETA= -777960 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_82(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)8U; i < (size_t)8U + (size_t)4U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)4U, -777960); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 16 +- STEP_BY= 4 +- ZETA= -876248 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_420(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)16U; i < (size_t)16U + (size_t)4U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)4U, -876248); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 24 +- STEP_BY= 4 +- ZETA= 466468 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_fe(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)24U; i < (size_t)24U + (size_t)4U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)4U, 466468); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_5(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_301(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_82(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_420(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_fe(re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 2 +- ZETA= 1826347 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_302(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)2U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)2U, 1826347); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 4 +- STEP_BY= 2 +- ZETA= 2353451 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_43(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)4U; i < (size_t)4U + (size_t)2U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)2U, 2353451); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 8 +- STEP_BY= 2 +- ZETA= -359251 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_820(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)8U; i < (size_t)8U + (size_t)2U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)2U, -359251); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 12 +- STEP_BY= 2 +- ZETA= -2091905 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_ea(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)12U; i < (size_t)12U + (size_t)2U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)2U, -2091905); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 16 +- STEP_BY= 2 +- ZETA= 3119733 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_421(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)16U; i < (size_t)16U + (size_t)2U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)2U, 3119733); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 20 +- STEP_BY= 2 +- ZETA= -2884855 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_61(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)20U; i < (size_t)20U + (size_t)2U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)2U, -2884855); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 24 +- STEP_BY= 2 +- ZETA= 3111497 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_fe0(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)24U; i < (size_t)24U + (size_t)2U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)2U, 3111497); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 28 +- STEP_BY= 2 +- ZETA= 2680103 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_38(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)28U; i < (size_t)28U + (size_t)2U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)2U, 2680103); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_4(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_302(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_43(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_820(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_ea(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_421(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_61(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_fe0(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_38(re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 1 +- ZETA= 2725464 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_303(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, 2725464); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 2 +- STEP_BY= 1 +- ZETA= 1024112 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_25(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)2U; i < (size_t)2U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, 1024112); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 4 +- STEP_BY= 1 +- ZETA= -1079900 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_430(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)4U; i < (size_t)4U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -1079900); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 6 +- STEP_BY= 1 +- ZETA= 3585928 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_f4(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)6U; i < (size_t)6U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, 3585928); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 8 +- STEP_BY= 1 +- ZETA= -549488 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_821(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)8U; i < (size_t)8U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -549488); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 10 +- STEP_BY= 1 +- ZETA= -1119584 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_1d(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)10U; i < (size_t)10U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -1119584); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 12 +- STEP_BY= 1 +- ZETA= 2619752 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_ea0(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)12U; i < (size_t)12U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, 2619752); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 14 +- STEP_BY= 1 +- ZETA= -2108549 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_d8(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)14U; i < (size_t)14U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -2108549); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 16 +- STEP_BY= 1 +- ZETA= -2118186 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_422(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)16U; i < (size_t)16U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -2118186); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 18 +- STEP_BY= 1 +- ZETA= -3859737 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_60(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)18U; i < (size_t)18U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -3859737); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 20 +- STEP_BY= 1 +- ZETA= -1399561 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_610(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)20U; i < (size_t)20U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -1399561); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 22 +- STEP_BY= 1 +- ZETA= -3277672 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_29(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)22U; i < (size_t)22U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -3277672); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 24 +- STEP_BY= 1 +- ZETA= 1757237 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_fe1(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)24U; i < (size_t)24U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, 1757237); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 26 +- STEP_BY= 1 +- ZETA= -19422 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_9d(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)26U; i < (size_t)26U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, -19422); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 28 +- STEP_BY= 1 +- ZETA= 4010497 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_380(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)28U; i < (size_t)28U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, 4010497); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.ntt.outer_3_plus +with const generics +- OFFSET= 30 +- STEP_BY= 1 +- ZETA= 280005 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_5f(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)30U; i < (size_t)30U + (size_t)1U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_round(re, j, (size_t)1U, 280005); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_3(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_303(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_25(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_430(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_f4(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_821(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_1d(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_ea0(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_d8(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_422(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_60(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_610(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_29(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_fe1(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_9d(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_380(re); + libcrux_ml_dsa_simd_portable_ntt_outer_3_plus_5f(re); +} + +static KRML_MUSTINLINE int32_t +libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_fe_by_fer(int32_t fe, int32_t fer) +{ + return + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_reduce_element((int64_t)fe * (int64_t)fer); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step( + Eurydice_arr_4d *simd_unit, + int32_t zeta, + size_t index, + size_t step +) +{ + int32_t + t = + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_fe_by_fer(simd_unit->data[index + + step], + zeta); + simd_unit->data[index + step] = simd_unit->data[index] - t; + simd_unit->data[index] += t; +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_at_layer_2( + Eurydice_arr_4d *simd_unit, + int32_t zeta +) +{ + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta, (size_t)0U, (size_t)4U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta, (size_t)1U, (size_t)4U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta, (size_t)2U, (size_t)4U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta, (size_t)3U, (size_t)4U); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round( + Eurydice_arr_a3 *re, + size_t index, + int32_t zeta +) +{ + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_at_layer_2(&re->data[index], zeta); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)0U, 2706023); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)1U, 95776); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)2U, 3077325); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)3U, 3530437); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)4U, -1661693); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)5U, -3592148); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)6U, -2537516); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)7U, 3915439); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)8U, -3861115); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)9U, -3043716); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)10U, 3574422); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)11U, -2867647); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)12U, 3539968); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)13U, -300467); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)14U, 2348700); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)15U, -539299); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)16U, -1699267); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)17U, -1643818); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)18U, 3505694); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)19U, -3821735); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)20U, 3507263); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)21U, -2140649); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)22U, -1600420); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)23U, 3699596); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)24U, 811944); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)25U, 531354); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)26U, 954230); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)27U, 3881043); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)28U, 3900724); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)29U, -2556880); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)30U, 2071892); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2_round(re, (size_t)31U, -2797779); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_at_layer_1( + Eurydice_arr_4d *simd_unit, + int32_t zeta1, + int32_t zeta2 +) +{ + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta1, (size_t)0U, (size_t)2U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta1, (size_t)1U, (size_t)2U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta2, (size_t)4U, (size_t)2U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta2, (size_t)5U, (size_t)2U); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round( + Eurydice_arr_a3 *re, + size_t index, + int32_t zeta_0, + int32_t zeta_1 +) +{ + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_at_layer_1(&re->data[index], zeta_0, zeta_1); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)0U, -3930395, -1528703); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)1U, -3677745, -3041255); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)2U, -1452451, 3475950); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)3U, 2176455, -1585221); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)4U, -1257611, 1939314); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)5U, -4083598, -1000202); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)6U, -3190144, -3157330); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)7U, -3632928, 126922); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)8U, 3412210, -983419); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)9U, 2147896, 2715295); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)10U, -2967645, -3693493); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)11U, -411027, -2477047); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)12U, -671102, -1228525); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)13U, -22981, -1308169); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)14U, -381987, 1349076); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)15U, 1852771, -1430430); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)16U, -3343383, 264944); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)17U, 508951, 3097992); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)18U, 44288, -1100098); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)19U, 904516, 3958618); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)20U, -3724342, -8578); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)21U, 1653064, -3249728); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)22U, 2389356, -210977); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)23U, 759969, -1316856); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)24U, 189548, -3553272); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)25U, 3159746, -1851402); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)26U, -2409325, -177440); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)27U, 1315589, 1341330); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)28U, 1285669, -1584928); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)29U, -812732, -1439742); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)30U, -3019102, -3881060); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1_round(re, (size_t)31U, -3628969, 3839961); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_at_layer_0( + Eurydice_arr_4d *simd_unit, + int32_t zeta0, + int32_t zeta1, + int32_t zeta2, + int32_t zeta3 +) +{ + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta0, (size_t)0U, (size_t)1U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta1, (size_t)2U, (size_t)1U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta2, (size_t)4U, (size_t)1U); + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_step(simd_unit, zeta3, (size_t)6U, (size_t)1U); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round( + Eurydice_arr_a3 *re, + size_t index, + int32_t zeta_0, + int32_t zeta_1, + int32_t zeta_2, + int32_t zeta_3 +) +{ + libcrux_ml_dsa_simd_portable_ntt_simd_unit_ntt_at_layer_0(&re->data[index], + zeta_0, + zeta_1, + zeta_2, + zeta_3); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)0U, + 2091667, + 3407706, + 2316500, + 3817976); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)1U, + -3342478, + 2244091, + -2446433, + -3562462); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)2U, + 266997, + 2434439, + -1235728, + 3513181); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)3U, + -3520352, + -3759364, + -1197226, + -3193378); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)4U, + 900702, + 1859098, + 909542, + 819034); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)5U, + 495491, + -1613174, + -43260, + -522500); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)6U, + -655327, + -3122442, + 2031748, + 3207046); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)7U, + -3556995, + -525098, + -768622, + -3595838); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)8U, + 342297, + 286988, + -2437823, + 4108315); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)9U, + 3437287, + -3342277, + 1735879, + 203044); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)10U, + 2842341, + 2691481, + -2590150, + 1265009); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)11U, + 4055324, + 1247620, + 2486353, + 1595974); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)12U, + -3767016, + 1250494, + 2635921, + -3548272); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)13U, + -2994039, + 1869119, + 1903435, + -1050970); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)14U, + -1333058, + 1237275, + -3318210, + -1430225); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)15U, + -451100, + 1312455, + 3306115, + -1962642); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)16U, + -1279661, + 1917081, + -2546312, + -1374803); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)17U, + 1500165, + 777191, + 2235880, + 3406031); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)18U, + -542412, + -2831860, + -1671176, + -1846953); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)19U, + -2584293, + -3724270, + 594136, + -3776993); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)20U, + -2013608, + 2432395, + 2454455, + -164721); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)21U, + 1957272, + 3369112, + 185531, + -1207385); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)22U, + -3183426, + 162844, + 1616392, + 3014001); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)23U, + 810149, + 1652634, + -3694233, + -1799107); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)24U, + -3038916, + 3523897, + 3866901, + 269760); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)25U, + 2213111, + -975884, + 1717735, + 472078); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)26U, + -426683, + 1723600, + -1803090, + 1910376); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)27U, + -1667432, + -1104333, + -260646, + -3833893); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)28U, + -2939036, + -2235985, + -420899, + -2286327); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)29U, + 183443, + -976891, + 1612842, + -3545687); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)30U, + -554416, + 3919660, + -48306, + -1362209); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0_round(re, + (size_t)31U, + 3937738, + 1400424, + -846154, + 1976782); +} + +static KRML_MUSTINLINE void libcrux_ml_dsa_simd_portable_ntt_ntt(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_7(re); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_6(re); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_5(re); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_4(re); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_3(re); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_2(re); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_1(re); + libcrux_ml_dsa_simd_portable_ntt_ntt_at_layer_0(re); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void libcrux_ml_dsa_simd_portable_ntt_65(Eurydice_arr_a3 *simd_units) +{ + libcrux_ml_dsa_simd_portable_ntt_ntt(simd_units); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step( + Eurydice_arr_4d *simd_unit, + int32_t zeta, + size_t index, + size_t step +) +{ + int32_t a_minus_b = simd_unit->data[index + step] - simd_unit->data[index]; + simd_unit->data[index] += simd_unit->data[index + step]; + simd_unit->data[index + step] = + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_fe_by_fer(a_minus_b, + zeta); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_simd_unit_invert_ntt_at_layer_0( + Eurydice_arr_4d *simd_unit, + int32_t zeta0, + int32_t zeta1, + int32_t zeta2, + int32_t zeta3 +) +{ + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta0, + (size_t)0U, + (size_t)1U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta1, + (size_t)2U, + (size_t)1U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta2, + (size_t)4U, + (size_t)1U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta3, + (size_t)6U, + (size_t)1U); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round( + Eurydice_arr_a3 *re, + size_t index, + int32_t zeta0, + int32_t zeta1, + int32_t zeta2, + int32_t zeta3 +) +{ + libcrux_ml_dsa_simd_portable_invntt_simd_unit_invert_ntt_at_layer_0(&re->data[index], + zeta0, + zeta1, + zeta2, + zeta3); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)0U, + 1976782, + -846154, + 1400424, + 3937738); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)1U, + -1362209, + -48306, + 3919660, + -554416); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)2U, + -3545687, + 1612842, + -976891, + 183443); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)3U, + -2286327, + -420899, + -2235985, + -2939036); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)4U, + -3833893, + -260646, + -1104333, + -1667432); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)5U, + 1910376, + -1803090, + 1723600, + -426683); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)6U, + 472078, + 1717735, + -975884, + 2213111); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)7U, + 269760, + 3866901, + 3523897, + -3038916); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)8U, + -1799107, + -3694233, + 1652634, + 810149); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)9U, + 3014001, + 1616392, + 162844, + -3183426); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)10U, + -1207385, + 185531, + 3369112, + 1957272); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)11U, + -164721, + 2454455, + 2432395, + -2013608); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)12U, + -3776993, + 594136, + -3724270, + -2584293); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)13U, + -1846953, + -1671176, + -2831860, + -542412); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)14U, + 3406031, + 2235880, + 777191, + 1500165); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)15U, + -1374803, + -2546312, + 1917081, + -1279661); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)16U, + -1962642, + 3306115, + 1312455, + -451100); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)17U, + -1430225, + -3318210, + 1237275, + -1333058); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)18U, + -1050970, + 1903435, + 1869119, + -2994039); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)19U, + -3548272, + 2635921, + 1250494, + -3767016); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)20U, + 1595974, + 2486353, + 1247620, + 4055324); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)21U, + 1265009, + -2590150, + 2691481, + 2842341); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)22U, + 203044, + 1735879, + -3342277, + 3437287); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)23U, + 4108315, + -2437823, + 286988, + 342297); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)24U, + -3595838, + -768622, + -525098, + -3556995); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)25U, + 3207046, + 2031748, + -3122442, + -655327); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)26U, + -522500, + -43260, + -1613174, + 495491); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)27U, + 819034, + 909542, + 1859098, + 900702); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)28U, + -3193378, + -1197226, + -3759364, + -3520352); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)29U, + 3513181, + -1235728, + 2434439, + 266997); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)30U, + -3562462, + -2446433, + 2244091, + -3342478); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0_round(re, + (size_t)31U, + 3817976, + 2316500, + 3407706, + 2091667); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_simd_unit_invert_ntt_at_layer_1( + Eurydice_arr_4d *simd_unit, + int32_t zeta0, + int32_t zeta1 +) +{ + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta0, + (size_t)0U, + (size_t)2U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta0, + (size_t)1U, + (size_t)2U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta1, + (size_t)4U, + (size_t)2U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta1, + (size_t)5U, + (size_t)2U); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round( + Eurydice_arr_a3 *re, + size_t index, + int32_t zeta_00, + int32_t zeta_01 +) +{ + libcrux_ml_dsa_simd_portable_invntt_simd_unit_invert_ntt_at_layer_1(&re->data[index], + zeta_00, + zeta_01); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)0U, + 3839961, + -3628969); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)1U, + -3881060, + -3019102); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)2U, + -1439742, + -812732); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)3U, + -1584928, + 1285669); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)4U, + 1341330, + 1315589); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)5U, + -177440, + -2409325); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)6U, + -1851402, + 3159746); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)7U, + -3553272, + 189548); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)8U, + -1316856, + 759969); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)9U, + -210977, + 2389356); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)10U, + -3249728, + 1653064); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)11U, + -8578, + -3724342); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)12U, + 3958618, + 904516); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)13U, + -1100098, + 44288); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)14U, + 3097992, + 508951); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)15U, + 264944, + -3343383); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)16U, + -1430430, + 1852771); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)17U, + 1349076, + -381987); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)18U, + -1308169, + -22981); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)19U, + -1228525, + -671102); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)20U, + -2477047, + -411027); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)21U, + -3693493, + -2967645); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)22U, + 2715295, + 2147896); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)23U, + -983419, + 3412210); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)24U, + 126922, + -3632928); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)25U, + -3157330, + -3190144); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)26U, + -1000202, + -4083598); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)27U, + 1939314, + -1257611); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)28U, + -1585221, + 2176455); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)29U, + 3475950, + -1452451); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)30U, + -3041255, + -3677745); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1_round(re, + (size_t)31U, + -1528703, + -3930395); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_simd_unit_invert_ntt_at_layer_2( + Eurydice_arr_4d *simd_unit, + int32_t zeta +) +{ + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta, + (size_t)0U, + (size_t)4U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta, + (size_t)1U, + (size_t)4U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta, + (size_t)2U, + (size_t)4U); + libcrux_ml_dsa_simd_portable_invntt_simd_unit_inv_ntt_step(simd_unit, + zeta, + (size_t)3U, + (size_t)4U); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round( + Eurydice_arr_a3 *re, + size_t index, + int32_t zeta1 +) +{ + libcrux_ml_dsa_simd_portable_invntt_simd_unit_invert_ntt_at_layer_2(&re->data[index], zeta1); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)0U, -2797779); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)1U, 2071892); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)2U, -2556880); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)3U, 3900724); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)4U, 3881043); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)5U, 954230); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)6U, 531354); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)7U, 811944); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)8U, 3699596); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)9U, -1600420); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)10U, -2140649); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)11U, 3507263); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)12U, -3821735); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)13U, 3505694); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)14U, -1643818); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)15U, -1699267); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)16U, -539299); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)17U, 2348700); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)18U, -300467); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)19U, 3539968); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)20U, -2867647); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)21U, 3574422); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)22U, -3043716); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)23U, -3861115); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)24U, 3915439); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)25U, -2537516); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)26U, -3592148); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)27U, -1661693); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)28U, 3530437); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)29U, 3077325); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)30U, 95776); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2_round(re, (size_t)31U, 2706023); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 1 +- ZETA= 280005 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_30(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + 280005); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 2 +- STEP_BY= 1 +- ZETA= 4010497 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_25(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)2U; i < (size_t)2U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + 4010497); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 4 +- STEP_BY= 1 +- ZETA= -19422 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_43(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)4U; i < (size_t)4U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -19422); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 6 +- STEP_BY= 1 +- ZETA= 1757237 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_f4(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)6U; i < (size_t)6U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + 1757237); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 8 +- STEP_BY= 1 +- ZETA= -3277672 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_82(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)8U; i < (size_t)8U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -3277672); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 10 +- STEP_BY= 1 +- ZETA= -1399561 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_1d(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)10U; i < (size_t)10U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -1399561); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 12 +- STEP_BY= 1 +- ZETA= -3859737 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_ea(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)12U; i < (size_t)12U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -3859737); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 14 +- STEP_BY= 1 +- ZETA= -2118186 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_d8(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)14U; i < (size_t)14U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -2118186); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 16 +- STEP_BY= 1 +- ZETA= -2108549 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_42(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)16U; i < (size_t)16U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -2108549); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 18 +- STEP_BY= 1 +- ZETA= 2619752 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_60(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)18U; i < (size_t)18U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + 2619752); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 20 +- STEP_BY= 1 +- ZETA= -1119584 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_61(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)20U; i < (size_t)20U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -1119584); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 22 +- STEP_BY= 1 +- ZETA= -549488 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_29(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)22U; i < (size_t)22U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -549488); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 24 +- STEP_BY= 1 +- ZETA= 3585928 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_fe(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)24U; i < (size_t)24U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + 3585928); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 26 +- STEP_BY= 1 +- ZETA= -1079900 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_9d(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)26U; i < (size_t)26U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + -1079900); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 28 +- STEP_BY= 1 +- ZETA= 1024112 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_38(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)28U; i < (size_t)28U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + 1024112); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 30 +- STEP_BY= 1 +- ZETA= 2725464 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_5f(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)30U; i < (size_t)30U + (size_t)1U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)1U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)1U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)1U], + 2725464); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_3(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_30(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_25(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_43(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_f4(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_82(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_1d(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_ea(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_d8(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_42(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_60(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_61(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_29(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_fe(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_9d(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_38(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_5f(re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 2 +- ZETA= 2680103 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_300(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)2U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)2U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)2U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)2U], + 2680103); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 4 +- STEP_BY= 2 +- ZETA= 3111497 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_430(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)4U; i < (size_t)4U + (size_t)2U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)2U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)2U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)2U], + 3111497); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 8 +- STEP_BY= 2 +- ZETA= -2884855 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_820(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)8U; i < (size_t)8U + (size_t)2U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)2U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)2U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)2U], + -2884855); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 12 +- STEP_BY= 2 +- ZETA= 3119733 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_ea0(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)12U; i < (size_t)12U + (size_t)2U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)2U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)2U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)2U], + 3119733); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 16 +- STEP_BY= 2 +- ZETA= -2091905 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_420(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)16U; i < (size_t)16U + (size_t)2U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)2U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)2U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)2U], + -2091905); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 20 +- STEP_BY= 2 +- ZETA= -359251 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_610(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)20U; i < (size_t)20U + (size_t)2U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)2U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)2U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)2U], + -359251); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 24 +- STEP_BY= 2 +- ZETA= 2353451 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_fe0(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)24U; i < (size_t)24U + (size_t)2U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)2U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)2U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)2U], + 2353451); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 28 +- STEP_BY= 2 +- ZETA= 1826347 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_380(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)28U; i < (size_t)28U + (size_t)2U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)2U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)2U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)2U], + 1826347); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_4(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_300(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_430(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_820(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_ea0(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_420(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_610(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_fe0(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_380(re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 4 +- ZETA= 466468 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_301(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)4U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)4U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)4U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)4U], + 466468); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 8 +- STEP_BY= 4 +- ZETA= -876248 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_821(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)8U; i < (size_t)8U + (size_t)4U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)4U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)4U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)4U], + -876248); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 16 +- STEP_BY= 4 +- ZETA= -777960 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_421(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)16U; i < (size_t)16U + (size_t)4U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)4U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)4U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)4U], + -777960); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 24 +- STEP_BY= 4 +- ZETA= 237124 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_fe1(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)24U; i < (size_t)24U + (size_t)4U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)4U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)4U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)4U], + 237124); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_5(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_301(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_821(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_421(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_fe1(re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 8 +- ZETA= -518909 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_302(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)8U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)8U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)8U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)8U], + -518909); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 16 +- STEP_BY= 8 +- ZETA= -2608894 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_422(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)16U; i < (size_t)16U + (size_t)8U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)8U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)8U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)8U], + -2608894); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_6(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_302(re); + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_422(re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.invntt.outer_3_plus +with const generics +- OFFSET= 0 +- STEP_BY= 16 +- ZETA= 25847 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_303(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)0U + (size_t)16U; i++) + { + size_t j = i; + Eurydice_arr_4d rej = re->data[j]; + Eurydice_arr_4d rejs = re->data[j + (size_t)16U]; + libcrux_ml_dsa_simd_portable_arithmetic_add(&re->data[j], &rejs); + libcrux_ml_dsa_simd_portable_arithmetic_subtract(&re->data[j + (size_t)16U], &rej); + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[j + + (size_t)16U], + 25847); + } +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_7(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_outer_3_plus_303(re); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_invntt_invert_ntt_montgomery(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_0(re); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_1(re); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_2(re); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_3(re); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_4(re); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_5(re); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_6(re); + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_at_layer_7(re); + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_arithmetic_montgomery_multiply_by_constant(&re->data[i0], 41978); + } +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_invert_ntt_montgomery_65(Eurydice_arr_a3 *simd_units) +{ + libcrux_ml_dsa_simd_portable_invntt_invert_ntt_montgomery(simd_units); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline void +libcrux_ml_dsa_simd_portable_barrett_reduce_simd_unit_65(Eurydice_arr_4d *simd_unit) +{ + libcrux_ml_dsa_simd_portable_arithmetic_barrett_reduce_simd_unit(simd_unit); +} + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ERROR_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_error_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_BITS_PER_ERROR_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_COMMITMENT_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_commitment_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_BITS_PER_COMMITMENT_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_BETA (libcrux_ml_dsa_constants_beta(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ONES_IN_VERIFIER_CHALLENGE, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ETA)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_GAMMA1_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_gamma1_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_BITS_PER_GAMMA1_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_VERIFICATION_KEY_SIZE (libcrux_ml_dsa_constants_verification_key_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_SIGNATURE_SIZE (libcrux_ml_dsa_constants_signature_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_MAX_ONES_IN_HINT, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COMMITMENT_HASH_SIZE, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_BITS_PER_GAMMA1_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ERROR_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_error_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_BITS_PER_ERROR_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_COMMITMENT_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_commitment_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_BITS_PER_COMMITMENT_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_BETA (libcrux_ml_dsa_constants_beta(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ONES_IN_VERIFIER_CHALLENGE, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ETA)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_GAMMA1_RING_ELEMENT_SIZE (libcrux_ml_dsa_constants_gamma1_ring_element_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_BITS_PER_GAMMA1_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_VERIFICATION_KEY_SIZE (libcrux_ml_dsa_constants_verification_key_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_SIGNATURE_SIZE (libcrux_ml_dsa_constants_signature_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_MAX_ONES_IN_HINT, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COMMITMENT_HASH_SIZE, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_BITS_PER_GAMMA1_COEFFICIENT)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_COMMITMENT_VECTOR_SIZE (libcrux_ml_dsa_constants_commitment_vector_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_BITS_PER_COMMITMENT_COEFFICIENT, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A)) + +/** +A monomorphic instance of libcrux_ml_dsa.types.MLDSASigningKey +with const generics +- $2560size_t +*/ +typedef Eurydice_arr_10 libcrux_ml_dsa_types_MLDSASigningKey_11; + +typedef Eurydice_arr_10 libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44SigningKey; + +/** +A monomorphic instance of libcrux_ml_dsa.types.MLDSAVerificationKey +with const generics +- $1312size_t +*/ +typedef Eurydice_arr_02 libcrux_ml_dsa_types_MLDSAVerificationKey_1d; + +typedef Eurydice_arr_02 libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44VerificationKey; + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ROW_COLUMN (LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ROW_X_COLUMN (LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A * LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_SIGNING_KEY_SIZE (libcrux_ml_dsa_constants_signing_key_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ERROR_RING_ELEMENT_SIZE)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_COMMITMENT_VECTOR_SIZE (libcrux_ml_dsa_constants_commitment_vector_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_BITS_PER_COMMITMENT_COEFFICIENT, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A)) + +/** +A monomorphic instance of libcrux_ml_dsa.types.MLDSASigningKey +with const generics +- $4032size_t +*/ +typedef Eurydice_arr_24 libcrux_ml_dsa_types_MLDSASigningKey_8e; + +typedef Eurydice_arr_24 libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65SigningKey; + +/** +A monomorphic instance of libcrux_ml_dsa.types.MLDSAVerificationKey +with const generics +- $1952size_t +*/ +typedef Eurydice_arr_29 libcrux_ml_dsa_types_MLDSAVerificationKey_c8; + +typedef Eurydice_arr_29 libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65VerificationKey; + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ROW_COLUMN (LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ROW_X_COLUMN (LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A * LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_SIGNING_KEY_SIZE (libcrux_ml_dsa_constants_signing_key_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ERROR_RING_ELEMENT_SIZE)) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_COMMITMENT_VECTOR_SIZE (libcrux_ml_dsa_constants_commitment_vector_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_BITS_PER_COMMITMENT_COEFFICIENT, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A)) + +/** +A monomorphic instance of libcrux_ml_dsa.types.MLDSASigningKey +with const generics +- $4896size_t +*/ +typedef Eurydice_arr_e2 libcrux_ml_dsa_types_MLDSASigningKey_b8; + +typedef Eurydice_arr_e2 libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87SigningKey; + +/** +A monomorphic instance of libcrux_ml_dsa.types.MLDSAVerificationKey +with const generics +- $2592size_t +*/ +typedef Eurydice_arr_43 libcrux_ml_dsa_types_MLDSAVerificationKey_e9; + +typedef Eurydice_arr_43 libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87VerificationKey; + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ROW_COLUMN (LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ROW_X_COLUMN (LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A * LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A) + +#define LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_SIGNING_KEY_SIZE (libcrux_ml_dsa_constants_signing_key_size(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ERROR_RING_ELEMENT_SIZE)) + +#define LIBCRUX_ML_DSA_PRE_HASH_PRE_HASH_OID_LEN ((size_t)11U) + +typedef Eurydice_arr_c9 libcrux_ml_dsa_pre_hash_PreHashOID; + +typedef core_result_Result_a8 libcrux_ml_dsa_pre_hash_PreHashResult; + +/** +This function found in impl {core::convert::From for libcrux_ml_dsa::types::SigningError} +*/ +static inline libcrux_ml_dsa_types_SigningError +libcrux_ml_dsa_pre_hash_from_96(libcrux_ml_dsa_pre_hash_DomainSeparationError e) +{ + return libcrux_ml_dsa_types_SigningError_ContextTooLongError; +} + +/** +This function found in impl {core::convert::From for libcrux_ml_dsa::types::VerificationError} +*/ +static inline libcrux_ml_dsa_types_VerificationError +libcrux_ml_dsa_pre_hash_from_bf(libcrux_ml_dsa_pre_hash_DomainSeparationError e) +{ + return libcrux_ml_dsa_types_VerificationError_VerificationContextTooLongError; +} + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_3_STEP ((size_t)8U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_3_STEP_BY ((size_t)1U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_4_STEP ((size_t)16U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_4_STEP_BY ((size_t)2U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_5_STEP ((size_t)32U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_5_STEP_BY ((size_t)4U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_6_STEP ((size_t)64U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_6_STEP_BY ((size_t)8U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_7_STEP ((size_t)128U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_INVNTT_INVERT_NTT_AT_LAYER_7_STEP_BY ((size_t)16U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_3_STEP ((size_t)8U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_3_STEP_BY ((size_t)1U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_4_STEP ((size_t)16U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_4_STEP_BY ((size_t)2U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_5_STEP ((size_t)32U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_5_STEP_BY ((size_t)4U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_6_STEP ((size_t)64U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_6_STEP_BY ((size_t)8U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_7_STEP ((size_t)128U) + +#define LIBCRUX_ML_DSA_SIMD_PORTABLE_NTT_NTT_AT_LAYER_7_STEP_BY ((size_t)16U) + +typedef int32_t libcrux_ml_dsa_simd_portable_vector_type_FieldElement; + +/** +This function found in impl {core::clone::Clone for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +static inline Eurydice_arr_4d +libcrux_ml_dsa_simd_portable_vector_type_clone_a5(const Eurydice_arr_4d *self) +{ + return self[0U]; +} + +typedef int32_t libcrux_ml_dsa_simd_traits_FieldElementTimesMontgomeryR; + +typedef Eurydice_arr_93 libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87Signature; + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASignature} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_c5 +with const generics +- SIZE= 4627 +*/ +static inline const +Eurydice_arr_93 +*libcrux_ml_dsa_types_as_ref_c5_f1(const Eurydice_arr_93 *self) +{ + return self; +} + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSAVerificationKey} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_7f +with const generics +- SIZE= 2592 +*/ +static inline const +Eurydice_arr_43 +*libcrux_ml_dsa_types_as_ref_7f_c6(const Eurydice_arr_43 *self) +{ + return self; +} + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASigningKey} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_9b +with const generics +- SIZE= 4896 +*/ +static inline const +Eurydice_arr_e2 +*libcrux_ml_dsa_types_as_ref_9b_72(const Eurydice_arr_e2 *self) +{ + return self; +} + +/** + Build +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSAVerificationKey} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.new_7f +with const generics +- SIZE= 2592 +*/ +static inline Eurydice_arr_43 libcrux_ml_dsa_types_new_7f_c6(Eurydice_arr_43 value) +{ + return value; +} + +/** + Build +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASigningKey} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.new_9b +with const generics +- SIZE= 4896 +*/ +static inline Eurydice_arr_e2 libcrux_ml_dsa_types_new_9b_72(Eurydice_arr_e2 value) +{ + return value; +} + +typedef Eurydice_arr_85 libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44Signature; + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASignature} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_c5 +with const generics +- SIZE= 2420 +*/ +static inline const +Eurydice_arr_85 +*libcrux_ml_dsa_types_as_ref_c5_37(const Eurydice_arr_85 *self) +{ + return self; +} + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSAVerificationKey} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_7f +with const generics +- SIZE= 1312 +*/ +static inline const +Eurydice_arr_02 +*libcrux_ml_dsa_types_as_ref_7f_7d(const Eurydice_arr_02 *self) +{ + return self; +} + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASigningKey} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_9b +with const generics +- SIZE= 2560 +*/ +static inline const +Eurydice_arr_10 +*libcrux_ml_dsa_types_as_ref_9b_ab(const Eurydice_arr_10 *self) +{ + return self; +} + +/** + Build +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSAVerificationKey} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.new_7f +with const generics +- SIZE= 1312 +*/ +static inline Eurydice_arr_02 libcrux_ml_dsa_types_new_7f_7d(Eurydice_arr_02 value) +{ + return value; +} + +/** + Build +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASigningKey} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.new_9b +with const generics +- SIZE= 2560 +*/ +static inline Eurydice_arr_10 libcrux_ml_dsa_types_new_9b_ab(Eurydice_arr_10 value) +{ + return value; +} + +typedef Eurydice_arr_0c libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65Signature; + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASignature} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_c5 +with const generics +- SIZE= 3309 +*/ +static inline const +Eurydice_arr_0c +*libcrux_ml_dsa_types_as_ref_c5_5c(const Eurydice_arr_0c *self) +{ + return self; +} + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSAVerificationKey} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_7f +with const generics +- SIZE= 1952 +*/ +static inline const +Eurydice_arr_29 +*libcrux_ml_dsa_types_as_ref_7f_a2(const Eurydice_arr_29 *self) +{ + return self; +} + +/** + A reference to the raw byte array. +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASigningKey} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.as_ref_9b +with const generics +- SIZE= 4032 +*/ +static inline const +Eurydice_arr_24 +*libcrux_ml_dsa_types_as_ref_9b_e5(const Eurydice_arr_24 *self) +{ + return self; +} + +/** + Build +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSAVerificationKey} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.new_7f +with const generics +- SIZE= 1952 +*/ +static inline Eurydice_arr_29 libcrux_ml_dsa_types_new_7f_a2(Eurydice_arr_29 value) +{ + return value; +} + +/** + Build +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASigningKey} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.new_9b +with const generics +- SIZE= 4032 +*/ +static inline Eurydice_arr_24 libcrux_ml_dsa_types_new_9b_e5(Eurydice_arr_24 value) +{ + return value; +} + +/** +A monomorphic instance of core.result.Result +with types libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87Signature, libcrux_ml_dsa_types_SigningError + +*/ +typedef struct core_result_Result_8b_s +{ + core_result_Result_57_tags tag; + union { + Eurydice_arr_93 case_Ok; + libcrux_ml_dsa_types_SigningError case_Err; + } + val; +} +core_result_Result_8b; + +/** +A monomorphic instance of libcrux_ml_dsa.polynomial.PolynomialRingElement +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients + +*/ +typedef Eurydice_arr_a3 libcrux_ml_dsa_polynomial_PolynomialRingElement_e8; + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $7size_t +*/ +typedef struct Eurydice_arr_bb_s { Eurydice_arr_a3 data[7U]; } Eurydice_arr_bb; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_bb + +*/ +typedef struct core_option_Option_2d_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_bb f0; +} +core_option_Option_2d; + +/** +A monomorphic instance of Eurydice.dst_ref_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8, size_t + +*/ +typedef struct Eurydice_dst_ref_shared_44_s +{ + const Eurydice_arr_a3 *ptr; + size_t meta; +} +Eurydice_dst_ref_shared_44; + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $56size_t +*/ +typedef struct Eurydice_arr_0f_s { Eurydice_arr_a3 data[56U]; } Eurydice_arr_0f; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 56 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_208(const Eurydice_arr_0f *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)56U; + return lit; +} + +/** + Init with zero +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASignature} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.zero_c5 +with const generics +- SIZE= 4627 +*/ +static inline Eurydice_arr_93 libcrux_ml_dsa_types_zero_c5_f1(void) +{ + return (KRML_CLITERAL(Eurydice_arr_93){ .data = { 0U } }); +} + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $8size_t +*/ +typedef struct Eurydice_arr_8f_s { Eurydice_arr_a3 data[8U]; } Eurydice_arr_8f; + +/** + Declassify secret memory. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_declassify +with types Eurydice_arr libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients[[$8size_t]] + +*/ +static KRML_MUSTINLINE void +libcrux_secrets_mem_requests_ct_declassify_6a(const Eurydice_arr_8f *val) +{ + +} + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $15size_t +*/ +typedef struct Eurydice_arr_92_s { Eurydice_arr_a3 data[15U]; } Eurydice_arr_92; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 15 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_207(const Eurydice_arr_92 *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)15U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 7 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_206(const Eurydice_arr_bb *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)7U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients, core_ops_range_Range size_t, Eurydice_derefed_slice libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 15 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_subslice_shared_251(const Eurydice_arr_92 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_dst_ref_shared_44){ .ptr = a->data + r.start, .meta = r.end - r.start } + ); +} + +/** +A monomorphic instance of Eurydice.dst_ref_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8, size_t + +*/ +typedef struct Eurydice_dst_ref_mut_44_s +{ + Eurydice_arr_a3 *ptr; + size_t meta; +} +Eurydice_dst_ref_mut_44; + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 7 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_208(Eurydice_arr_bb *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)7U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 56 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_207(Eurydice_arr_0f *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)56U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 15 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_206(Eurydice_arr_92 *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)15U; + return lit; +} + +/** +A monomorphic instance of core.result.Result +with types libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65Signature, libcrux_ml_dsa_types_SigningError + +*/ +typedef struct core_result_Result_8c_s +{ + core_result_Result_57_tags tag; + union { + Eurydice_arr_0c case_Ok; + libcrux_ml_dsa_types_SigningError case_Err; + } + val; +} +core_result_Result_8c; + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $5size_t +*/ +typedef struct Eurydice_arr_5d_s { Eurydice_arr_a3 data[5U]; } Eurydice_arr_5d; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_5d + +*/ +typedef struct core_option_Option_1e_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_5d f0; +} +core_option_Option_1e; + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $30size_t +*/ +typedef struct Eurydice_arr_5a_s { Eurydice_arr_a3 data[30U]; } Eurydice_arr_5a; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 30 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_205(const Eurydice_arr_5a *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)30U; + return lit; +} + +/** + Init with zero +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASignature} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.zero_c5 +with const generics +- SIZE= 3309 +*/ +static inline Eurydice_arr_0c libcrux_ml_dsa_types_zero_c5_5c(void) +{ + return (KRML_CLITERAL(Eurydice_arr_0c){ .data = { 0U } }); +} + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $6size_t +*/ +typedef struct Eurydice_arr_dc1_s { Eurydice_arr_a3 data[6U]; } Eurydice_arr_dc1; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 6 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_204(const Eurydice_arr_dc1 *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)6U; + return lit; +} + +/** + Declassify secret memory. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_declassify +with types Eurydice_arr libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients[[$6size_t]] + +*/ +static KRML_MUSTINLINE void +libcrux_secrets_mem_requests_ct_declassify_b2(const Eurydice_arr_dc1 *val) +{ + +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 6 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_205(Eurydice_arr_dc1 *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)6U; + return lit; +} + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $11size_t +*/ +typedef struct Eurydice_arr_47_s { Eurydice_arr_a3 data[11U]; } Eurydice_arr_47; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 11 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_203(const Eurydice_arr_47 *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)11U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 5 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_202(const Eurydice_arr_5d *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)5U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients, core_ops_range_Range size_t, Eurydice_derefed_slice libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 11 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_subslice_shared_250(const Eurydice_arr_47 *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_dst_ref_shared_44){ .ptr = a->data + r.start, .meta = r.end - r.start } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 5 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_204(Eurydice_arr_5d *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)5U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 30 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_203(Eurydice_arr_5a *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)30U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 11 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_202(Eurydice_arr_47 *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)11U; + return lit; +} + +/** +This function found in impl {libcrux_ml_dsa::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.polynomial.zero_ff +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static inline Eurydice_arr_a3 libcrux_ml_dsa_polynomial_zero_ff_37(void) +{ + Eurydice_arr_a3 lit; + Eurydice_arr_4d repeat_expression[32U]; + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_simd_portable_zero_65(); + } + memcpy(lit.data, repeat_expression, (size_t)32U * sizeof (Eurydice_arr_4d)); + return lit; +} + +/** +This function found in impl {libcrux_ml_dsa::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.polynomial.from_i32_array_ff +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static inline void +libcrux_ml_dsa_polynomial_from_i32_array_ff_37( + Eurydice_dst_ref_shared_83 array, + Eurydice_arr_a3 *result +) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_DSA_SIMD_TRAITS_SIMD_UNITS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_from_coefficient_array_65(Eurydice_slice_subslice_shared_47(array, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_DSA_SIMD_TRAITS_COEFFICIENTS_IN_SIMD_UNIT, + .end = (i0 + (size_t)1U) * LIBCRUX_ML_DSA_SIMD_TRAITS_COEFFICIENTS_IN_SIMD_UNIT + } + )), + &result->data[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.arithmetic.use_hint +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_arithmetic_use_hint_37( + int32_t gamma2, + Eurydice_dst_ref_shared_20 hint, + Eurydice_dst_ref_mut_44 re_vector +) +{ + for (size_t i0 = (size_t)0U; i0 < re_vector.meta; i0++) + { + size_t i1 = i0; + Eurydice_arr_a3 tmp = libcrux_ml_dsa_polynomial_zero_ff_37(); + libcrux_ml_dsa_polynomial_from_i32_array_ff_37(Eurydice_array_to_slice_shared_af(&hint.ptr[i1]), + &tmp); + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_use_hint_65(gamma2, &re_vector.ptr[i1].data[j], &tmp.data[j]); + } + re_vector.ptr[i1] = tmp; + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.ntt.ntt_multiply_montgomery +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_ntt_ntt_multiply_montgomery_37(Eurydice_arr_a3 *lhs, const Eurydice_arr_a3 *rhs) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_montgomery_multiply_65(&lhs->data[i0], &rhs->data[i0]); + } +} + +/** +This function found in impl {libcrux_ml_dsa::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.polynomial.add_ff +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_polynomial_add_ff_37(Eurydice_arr_a3 *self, const Eurydice_arr_a3 *rhs) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_add_65(&self->data[i0], &rhs->data[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.arithmetic.shift_left_then_reduce +with const generics +- SHIFT_BY= 13 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_simd_portable_arithmetic_shift_left_then_reduce_84(Eurydice_arr_4d *simd_unit) +{ + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + size_t i0 = i; + simd_unit->data[i0] = (int32_t)((uint32_t)simd_unit->data[i0] << (uint32_t)13); + } + libcrux_ml_dsa_simd_portable_arithmetic_barrett_reduce_simd_unit(simd_unit); +} + +/** +This function found in impl {libcrux_ml_dsa::simd::traits::Operations for libcrux_ml_dsa::simd::portable::vector_type::Coefficients} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.simd.portable.shift_left_then_reduce_65 +with const generics +- SHIFT_BY= 13 +*/ +static inline void +libcrux_ml_dsa_simd_portable_shift_left_then_reduce_65_84(Eurydice_arr_4d *simd_unit) +{ + libcrux_ml_dsa_simd_portable_arithmetic_shift_left_then_reduce_84(simd_unit); +} + +/** +A monomorphic instance of libcrux_ml_dsa.arithmetic.shift_left_then_reduce +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- SHIFT_BY= 13 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_arithmetic_shift_left_then_reduce_68(Eurydice_arr_a3 *re) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_shift_left_then_reduce_65_84(&re->data[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.ntt.ntt +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void libcrux_ml_dsa_ntt_ntt_37(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_ntt_65(re); +} + +/** +This function found in impl {libcrux_ml_dsa::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.polynomial.subtract_ff +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_polynomial_subtract_ff_37(Eurydice_arr_a3 *self, const Eurydice_arr_a3 *rhs) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_subtract_65(&self->data[i0], &rhs->data[i0]); + } +} + +/** +This function found in impl {libcrux_ml_dsa::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.polynomial.barrett_reduce_ff +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_polynomial_barrett_reduce_ff_37(Eurydice_arr_a3 *self) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_barrett_reduce_simd_unit_65(&self->data[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.ntt.invert_ntt_montgomery +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void libcrux_ml_dsa_ntt_invert_ntt_montgomery_37(Eurydice_arr_a3 *re) +{ + libcrux_ml_dsa_simd_portable_invert_ntt_montgomery_65(re); +} + +/** + Compute InvertNTT( ◦ ẑ - ĉ ◦ NTT(t₁2ᵈ)) +*/ +/** +A monomorphic instance of libcrux_ml_dsa.matrix.compute_w_approx +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_matrix_compute_w_approx_37( + size_t rows_in_a, + size_t columns_in_a, + Eurydice_dst_ref_shared_44 matrix, + Eurydice_dst_ref_shared_44 signer_response, + const Eurydice_arr_a3 *verifier_challenge_as_ntt, + Eurydice_dst_ref_mut_44 t1 +) +{ + for (size_t i0 = (size_t)0U; i0 < rows_in_a; i0++) + { + size_t i1 = i0; + Eurydice_arr_a3 inner_result = libcrux_ml_dsa_polynomial_zero_ff_37(); + for (size_t i = (size_t)0U; i < columns_in_a; i++) + { + size_t j = i; + Eurydice_arr_a3 product = matrix.ptr[i1 * columns_in_a + j]; + libcrux_ml_dsa_ntt_ntt_multiply_montgomery_37(&product, &signer_response.ptr[j]); + libcrux_ml_dsa_polynomial_add_ff_37(&inner_result, &product); + } + libcrux_ml_dsa_arithmetic_shift_left_then_reduce_68(&t1.ptr[i1]); + libcrux_ml_dsa_ntt_ntt_37(&t1.ptr[i1]); + libcrux_ml_dsa_ntt_ntt_multiply_montgomery_37(&t1.ptr[i1], verifier_challenge_as_ntt); + libcrux_ml_dsa_polynomial_subtract_ff_37(&inner_result, &t1.ptr[i1]); + t1.ptr[i1] = inner_result; + libcrux_ml_dsa_polynomial_barrett_reduce_ff_37(&t1.ptr[i1]); + libcrux_ml_dsa_ntt_invert_ntt_montgomery_37(&t1.ptr[i1]); + } +} + +/** +A monomorphic instance of core.result.Result +with types (), libcrux_ml_dsa_types_VerificationError + +*/ +typedef struct core_result_Result_41_s +{ + core_result_Result_57_tags tag; + libcrux_ml_dsa_types_VerificationError f0; +} +core_result_Result_41; + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.gamma1.deserialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_gamma1_deserialize_37( + size_t gamma1_exponent, + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_a3 *result +) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_gamma1_deserialize_65(Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (gamma1_exponent + (size_t)1U), + .end = (i0 + (size_t)1U) * (gamma1_exponent + (size_t)1U) + } + )), + &result->data[i0], + gamma1_exponent); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.signature.deserialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_encoding_signature_deserialize_37( + size_t columns_in_a, + size_t rows_in_a, + size_t commitment_hash_size, + size_t gamma1_exponent, + size_t gamma1_ring_element_size, + size_t max_ones_in_hint, + size_t signature_size, + Eurydice_borrow_slice_u8 serialized, + Eurydice_mut_borrow_slice_u8 out_commitment_hash, + Eurydice_dst_ref_mut_44 out_signer_response, + Eurydice_dst_ref_mut_20 out_hint +) +{ + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(serialized, + commitment_hash_size, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 commitment_hash = uu____0.fst; + Eurydice_borrow_slice_u8 rest_of_serialized = uu____0.snd; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(out_commitment_hash, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = commitment_hash_size })), + commitment_hash, + uint8_t); + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(rest_of_serialized, + gamma1_ring_element_size * columns_in_a, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 signer_response_serialized = uu____1.fst; + Eurydice_borrow_slice_u8 hint_serialized = uu____1.snd; + for (size_t i = (size_t)0U; i < columns_in_a; i++) + { + size_t i0 = i; + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_slice_subslice_shared_c8(signer_response_serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * gamma1_ring_element_size, + .end = (i0 + (size_t)1U) * gamma1_ring_element_size + } + )), + &out_signer_response.ptr[i0]); + } + size_t previous_true_hints_seen = (size_t)0U; + bool malformed_hint = false; + for (size_t i0 = (size_t)0U; i0 < rows_in_a; i0++) + { + size_t i1 = i0; + size_t current_true_hints_seen = (size_t)(uint32_t)hint_serialized.ptr[max_ones_in_hint + i1]; + if (current_true_hints_seen < previous_true_hints_seen) + { + malformed_hint = true; + break; + } + if (current_true_hints_seen > max_ones_in_hint) + { + malformed_hint = true; + break; + } + for (size_t i = previous_true_hints_seen; i < current_true_hints_seen; i++) + { + size_t j = i; + if (j > previous_true_hints_seen) + { + if (hint_serialized.ptr[j] <= hint_serialized.ptr[j - (size_t)1U]) + { + malformed_hint = true; + break; + } + } + libcrux_ml_dsa_encoding_signature_set_hint(out_hint, + i1, + (size_t)(uint32_t)hint_serialized.ptr[j]); + } + if (malformed_hint) + { + break; + } + previous_true_hints_seen = current_true_hints_seen; + } + for (size_t i = previous_true_hints_seen; i < max_ones_in_hint; i++) + { + size_t j = i; + if (hint_serialized.ptr[j] != 0U) + { + malformed_hint = true; + break; + } + } + core_result_Result_41 uu____2; + if (malformed_hint) + { + uu____2 = + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_MalformedHintError + } + ); + } + else + { + uu____2 = (KRML_CLITERAL(core_result_Result_41){ .tag = core_result_Ok }); + } + return uu____2; +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.t1.deserialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static inline void +libcrux_ml_dsa_encoding_t1_deserialize_37( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_a3 *result +) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_t1_deserialize_65(Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_DSA_ENCODING_T1_DESERIALIZE_WINDOW, + .end = (i0 + (size_t)1U) * LIBCRUX_ML_DSA_ENCODING_T1_DESERIALIZE_WINDOW + } + )), + &result->data[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.verification_key.deserialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_verification_key_deserialize_37( + size_t rows_in_a, + size_t verification_key_size, + Eurydice_borrow_slice_u8 serialized, + Eurydice_dst_ref_mut_44 t1 +) +{ + for (size_t i = (size_t)0U; i < rows_in_a; i++) + { + size_t i0 = i; + libcrux_ml_dsa_encoding_t1_deserialize_37(Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T1S_SIZE, + .end = (i0 + (size_t)1U) * LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T1S_SIZE + } + )), + &t1.ptr[i0]); + } +} + +/** +A monomorphic instance of core.result.Result +with types libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44Signature, libcrux_ml_dsa_types_SigningError + +*/ +typedef struct core_result_Result_48_s +{ + core_result_Result_57_tags tag; + union { + Eurydice_arr_85 case_Ok; + libcrux_ml_dsa_types_SigningError case_Err; + } + val; +} +core_result_Result_48; + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $4size_t +*/ +typedef struct Eurydice_arr_9d_s { Eurydice_arr_a3 data[4U]; } Eurydice_arr_9d; + +/** +A monomorphic instance of core.option.Option +with types Eurydice_arr_9d + +*/ +typedef struct core_option_Option_d9_s +{ + core_option_Option_45_tags tag; + Eurydice_arr_9d f0; +} +core_option_Option_d9; + +/** +A monomorphic instance of core.result.Result +with types (), libcrux_ml_dsa_types_SigningError + +*/ +typedef struct core_result_Result_53_s +{ + core_result_Result_57_tags tag; + libcrux_ml_dsa_types_SigningError f0; +} +core_result_Result_53; + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.gamma1.serialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_gamma1_serialize_37( + const Eurydice_arr_a3 *re, + Eurydice_mut_borrow_slice_u8 serialized, + size_t gamma1_exponent +) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + const Eurydice_arr_4d *simd_unit = &re->data[i0]; + libcrux_ml_dsa_simd_portable_gamma1_serialize_65(simd_unit, + Eurydice_slice_subslice_mut_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (gamma1_exponent + (size_t)1U), + .end = (i0 + (size_t)1U) * (gamma1_exponent + (size_t)1U) + } + )), + gamma1_exponent); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.signature.serialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_signature_serialize_37( + Eurydice_borrow_slice_u8 commitment_hash, + Eurydice_dst_ref_shared_44 signer_response, + Eurydice_dst_ref_shared_20 hint, + size_t commitment_hash_size, + size_t columns_in_a, + size_t rows_in_a, + size_t gamma1_exponent, + size_t gamma1_ring_element_size, + size_t max_ones_in_hint, + Eurydice_mut_borrow_slice_u8 signature +) +{ + size_t offset = (size_t)0U; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(signature, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + commitment_hash_size + } + )), + commitment_hash, + uint8_t); + offset += commitment_hash_size; + for (size_t i = (size_t)0U; i < columns_in_a; i++) + { + size_t i0 = i; + libcrux_ml_dsa_encoding_gamma1_serialize_37(&signer_response.ptr[i0], + Eurydice_slice_subslice_mut_c8(signature, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + gamma1_ring_element_size + } + )), + gamma1_exponent); + offset += gamma1_ring_element_size; + } + size_t true_hints_seen = (size_t)0U; + for (size_t i0 = (size_t)0U; i0 < rows_in_a; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)256U; i++) + { + size_t j = i; + if (hint.ptr[i1].data[j] == 1) + { + signature.ptr[offset + true_hints_seen] = (uint8_t)j; + true_hints_seen++; + } + } + signature.ptr[offset + max_ones_in_hint + i1] = (uint8_t)true_hints_seen; + } +} + +/** +This function found in impl {libcrux_ml_dsa::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.polynomial.to_i32_array_ff +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static inline Eurydice_arr_6c +libcrux_ml_dsa_polynomial_to_i32_array_ff_37(const Eurydice_arr_a3 *self) +{ + Eurydice_arr_6c result = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_to_coefficient_array_65(&self->data[i0], + Eurydice_array_to_subslice_mut_44(&result, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_DSA_SIMD_TRAITS_COEFFICIENTS_IN_SIMD_UNIT, + .end = (i0 + (size_t)1U) * LIBCRUX_ML_DSA_SIMD_TRAITS_COEFFICIENTS_IN_SIMD_UNIT + } + ))); + } + return result; +} + +/** +A monomorphic instance of libcrux_ml_dsa.arithmetic.make_hint +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE size_t +libcrux_ml_dsa_arithmetic_make_hint_37( + Eurydice_dst_ref_shared_44 low, + Eurydice_dst_ref_shared_44 high, + int32_t gamma2, + Eurydice_dst_ref_mut_20 hint +) +{ + size_t true_hints = (size_t)0U; + Eurydice_arr_a3 hint_simd = libcrux_ml_dsa_polynomial_zero_ff_37(); + for (size_t i0 = (size_t)0U; i0 < low.meta; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t j = i; + size_t + one_hints_count = + libcrux_ml_dsa_simd_portable_compute_hint_65(&low.ptr[i1].data[j], + &high.ptr[i1].data[j], + gamma2, + &hint_simd.data[j]); + true_hints += one_hints_count; + } + Eurydice_arr_6c uu____0 = libcrux_ml_dsa_polynomial_to_i32_array_ff_37(&hint_simd); + hint.ptr[i1] = uu____0; + } + return true_hints; +} + +/** + CAUTION: This function must only be called with inputs for + which it is safe to leak the index of a violating coefficient. + + For all norm checks during ML-DSA signature generation it is + safe to leak the index of a violating coefficient. +*/ +/** +This function found in impl {libcrux_ml_dsa::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.polynomial.infinity_norm_exceeds_ff +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE bool +libcrux_ml_dsa_polynomial_infinity_norm_exceeds_ff_37( + const Eurydice_arr_a3 *self, + int32_t bound +) +{ + bool result = false; + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + bool + coeff_exceeds = libcrux_ml_dsa_simd_portable_infinity_norm_exceeds_65(&self->data[i0], bound); + bool uu____0; + if (result) + { + uu____0 = true; + } + else + { + uu____0 = coeff_exceeds; + } + result = uu____0; + } + return result; +} + +/** + CAUTION: This function must only be called with inputs for + which it is safe to leak the index of a violating coefficient. + + For all norm checks during ML-DSA signature generation it is + safe to leak the index of a violating coefficient. +*/ +/** +A monomorphic instance of libcrux_ml_dsa.arithmetic.vector_infinity_norm_exceeds +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE bool +libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37( + Eurydice_dst_ref_shared_44 vector, + int32_t bound +) +{ + bool result = false; + for (size_t i = (size_t)0U; i < vector.meta; i++) + { + size_t i0 = i; + bool uu____0; + if (result) + { + uu____0 = true; + } + else + { + uu____0 = libcrux_ml_dsa_polynomial_infinity_norm_exceeds_ff_37(&vector.ptr[i0], bound); + } + result = uu____0; + } + return result; +} + +/** +A monomorphic instance of libcrux_ml_dsa.matrix.subtract_vectors +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_matrix_subtract_vectors_37( + size_t dimension, + Eurydice_dst_ref_mut_44 lhs, + Eurydice_dst_ref_shared_44 rhs +) +{ + for (size_t i = (size_t)0U; i < dimension; i++) + { + size_t i0 = i; + libcrux_ml_dsa_polynomial_subtract_ff_37(&lhs.ptr[i0], &rhs.ptr[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.matrix.add_vectors +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_matrix_add_vectors_37( + size_t dimension, + Eurydice_dst_ref_mut_44 lhs, + Eurydice_dst_ref_shared_44 rhs +) +{ + for (size_t i = (size_t)0U; i < dimension; i++) + { + size_t i0 = i; + libcrux_ml_dsa_polynomial_add_ff_37(&lhs.ptr[i0], &rhs.ptr[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.matrix.vector_times_ring_element +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_matrix_vector_times_ring_element_37( + Eurydice_dst_ref_mut_44 vector, + const Eurydice_arr_a3 *ring_element +) +{ + for (size_t i = (size_t)0U; i < vector.meta; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_multiply_montgomery_37(&vector.ptr[i0], ring_element); + libcrux_ml_dsa_ntt_invert_ntt_montgomery_37(&vector.ptr[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.commitment.serialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_commitment_serialize_37( + const Eurydice_arr_a3 *re, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + size_t output_bytes_per_simd_unit = serialized.meta / ((size_t)8U * (size_t)4U); + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + const Eurydice_arr_4d *simd_unit = &re->data[i0]; + libcrux_ml_dsa_simd_portable_commitment_serialize_65(simd_unit, + Eurydice_slice_subslice_mut_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * output_bytes_per_simd_unit, + .end = (i0 + (size_t)1U) * output_bytes_per_simd_unit + } + ))); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.commitment.serialize_vector +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_commitment_serialize_vector_37( + size_t ring_element_size, + Eurydice_dst_ref_shared_44 vector, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + size_t offset = (size_t)0U; + for (size_t i = (size_t)0U; i < vector.meta; i++) + { + size_t _cloop_j = i; + const Eurydice_arr_a3 *ring_element = &vector.ptr[_cloop_j]; + libcrux_ml_dsa_encoding_commitment_serialize_37(ring_element, + Eurydice_slice_subslice_mut_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + ring_element_size + } + ))); + offset += ring_element_size; + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.arithmetic.decompose_vector +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_arithmetic_decompose_vector_37( + size_t dimension, + int32_t gamma2, + Eurydice_dst_ref_shared_44 t, + Eurydice_dst_ref_mut_44 low, + Eurydice_dst_ref_mut_44 high +) +{ + for (size_t i0 = (size_t)0U; i0 < dimension; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_decompose_65(gamma2, + &t.ptr[i1].data[j], + &low.ptr[i1].data[j], + &high.ptr[i1].data[j]); + } + } +} + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_dsa_polynomial_PolynomialRingElement_e8 +with const generics +- $16size_t +*/ +typedef struct Eurydice_arr_2f_s { Eurydice_arr_a3 data[16U]; } Eurydice_arr_2f; + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 16 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_201(const Eurydice_arr_2f *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)16U; + return lit; +} + +/** + Compute InvertNTT( ◦ ŷ) +*/ +/** +A monomorphic instance of libcrux_ml_dsa.matrix.compute_matrix_x_mask +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_matrix_compute_matrix_x_mask_37( + size_t rows_in_a, + size_t columns_in_a, + Eurydice_dst_ref_shared_44 matrix, + Eurydice_dst_ref_shared_44 mask, + Eurydice_dst_ref_mut_44 result +) +{ + for (size_t i0 = (size_t)0U; i0 < rows_in_a; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < columns_in_a; i++) + { + size_t j = i; + Eurydice_arr_a3 product = mask.ptr[j]; + libcrux_ml_dsa_ntt_ntt_multiply_montgomery_37(&product, &matrix.ptr[i1 * columns_in_a + j]); + libcrux_ml_dsa_polynomial_add_ff_37(&result.ptr[i1], &product); + } + libcrux_ml_dsa_polynomial_barrett_reduce_ff_37(&result.ptr[i1]); + libcrux_ml_dsa_ntt_invert_ntt_montgomery_37(&result.ptr[i1]); + } +} + +/** +A monomorphic instance of core.option.Option +with types libcrux_ml_dsa_pre_hash_DomainSeparationContext + +*/ +typedef struct core_option_Option_84_s +{ + core_option_Option_45_tags tag; + libcrux_ml_dsa_pre_hash_DomainSeparationContext f0; +} +core_option_Option_84; + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.t0.deserialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_t0_deserialize_37( + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_a3 *result +) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_t0_deserialize_65(Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_DSA_ENCODING_T0_OUTPUT_BYTES_PER_SIMD_UNIT, + .end = (i0 + (size_t)1U) * LIBCRUX_ML_DSA_ENCODING_T0_OUTPUT_BYTES_PER_SIMD_UNIT + } + )), + &result->data[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.t0.deserialize_to_vector_then_ntt +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_t0_deserialize_to_vector_then_ntt_37( + Eurydice_borrow_slice_u8 serialized, + Eurydice_dst_ref_mut_44 ring_elements +) +{ + for + (size_t + i = (size_t)0U; + i < serialized.meta / LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T0S_SIZE; + i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T0S_SIZE, + .end = i0 * LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T0S_SIZE + + LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T0S_SIZE + } + )); + libcrux_ml_dsa_encoding_t0_deserialize_37(bytes, &ring_elements.ptr[i0]); + libcrux_ml_dsa_ntt_ntt_37(&ring_elements.ptr[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.error.deserialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_error_deserialize_37( + libcrux_ml_dsa_constants_Eta eta, + Eurydice_borrow_slice_u8 serialized, + Eurydice_arr_a3 *result +) +{ + size_t chunk_size = libcrux_ml_dsa_encoding_error_chunk_size(eta); + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_simd_portable_error_deserialize_65(eta, + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * chunk_size, + .end = (i0 + (size_t)1U) * chunk_size + } + )), + &result->data[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.error.deserialize_to_vector_then_ntt +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_error_deserialize_to_vector_then_ntt_37( + libcrux_ml_dsa_constants_Eta eta, + size_t ring_element_size, + Eurydice_borrow_slice_u8 serialized, + Eurydice_dst_ref_mut_44 ring_elements +) +{ + for (size_t i = (size_t)0U; i < serialized.meta / ring_element_size; i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * ring_element_size, + .end = i0 * ring_element_size + ring_element_size + } + )); + libcrux_ml_dsa_encoding_error_deserialize_37(eta, bytes, &ring_elements.ptr[i0]); + libcrux_ml_dsa_ntt_ntt_37(&ring_elements.ptr[i0]); + } +} + +/** + Init with zero +*/ +/** +This function found in impl {libcrux_ml_dsa::types::MLDSASignature} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.types.zero_c5 +with const generics +- SIZE= 2420 +*/ +static inline Eurydice_arr_85 libcrux_ml_dsa_types_zero_c5_37(void) +{ + return (KRML_CLITERAL(Eurydice_arr_85){ .data = { 0U } }); +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.t0.serialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_t0_serialize_37( + const Eurydice_arr_a3 *re, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + const Eurydice_arr_4d *simd_unit = &re->data[i0]; + libcrux_ml_dsa_simd_portable_t0_serialize_65(simd_unit, + Eurydice_slice_subslice_mut_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_DSA_ENCODING_T0_OUTPUT_BYTES_PER_SIMD_UNIT, + .end = (i0 + (size_t)1U) * LIBCRUX_ML_DSA_ENCODING_T0_OUTPUT_BYTES_PER_SIMD_UNIT + } + ))); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.error.serialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_error_serialize_37( + libcrux_ml_dsa_constants_Eta eta, + const Eurydice_arr_a3 *re, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + size_t output_bytes_per_simd_unit = libcrux_ml_dsa_encoding_error_chunk_size(eta); + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + const Eurydice_arr_4d *simd_unit = &re->data[i0]; + libcrux_ml_dsa_simd_portable_error_serialize_65(eta, + simd_unit, + Eurydice_slice_subslice_mut_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * output_bytes_per_simd_unit, + .end = (i0 + (size_t)1U) * output_bytes_per_simd_unit + } + ))); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.t1.serialize +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_t1_serialize_37( + const Eurydice_arr_a3 *re, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t i0 = i; + const Eurydice_arr_4d *simd_unit = &re->data[i0]; + libcrux_ml_dsa_simd_portable_t1_serialize_65(simd_unit, + Eurydice_slice_subslice_mut_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_DSA_ENCODING_T1_SERIALIZE_OUTPUT_BYTES_PER_SIMD_UNIT, + .end = (i0 + (size_t)1U) * + LIBCRUX_ML_DSA_ENCODING_T1_SERIALIZE_OUTPUT_BYTES_PER_SIMD_UNIT + } + ))); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.verification_key.generate_serialized +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_verification_key_generate_serialized_37( + Eurydice_borrow_slice_u8 seed, + Eurydice_dst_ref_shared_44 t1, + Eurydice_mut_borrow_slice_u8 verification_key_serialized +) +{ + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(verification_key_serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE + } + )), + seed, + uint8_t); + for (size_t i = (size_t)0U; i < t1.meta; i++) + { + size_t i0 = i; + const Eurydice_arr_a3 *ring_element = &t1.ptr[i0]; + size_t + offset = + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE + + i0 * LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T1S_SIZE; + libcrux_ml_dsa_encoding_t1_serialize_37(ring_element, + Eurydice_slice_subslice_mut_c8(verification_key_serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T1S_SIZE + } + ))); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.arithmetic.power2round_vector +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_arithmetic_power2round_vector_37( + Eurydice_dst_ref_mut_44 t, + Eurydice_dst_ref_mut_44 t1 +) +{ + for (size_t i0 = (size_t)0U; i0 < t.meta; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)32U; i++) + { + size_t j = i; + libcrux_ml_dsa_simd_portable_power2round_65(&t.ptr[i1].data[j], &t1.ptr[i1].data[j]); + } + } +} + +/** + Declassify secret memory. + + No-op if `valgrind_ct_test` cfg is not enabled. +*/ +/** +A monomorphic instance of libcrux_secrets.mem_requests.ct_declassify +with types Eurydice_arr libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients[[$4size_t]] + +*/ +static KRML_MUSTINLINE void +libcrux_secrets_mem_requests_ct_declassify_f5(const Eurydice_arr_9d *val) +{ + +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 8 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_200(const Eurydice_arr_8f *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)8U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 4 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_slice_shared_20(const Eurydice_arr_9d *a) +{ + Eurydice_dst_ref_shared_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)4U; + return lit; +} + +/** + Compute InvertNTT( ◦ ŝ₁) + s₂ +*/ +/** +A monomorphic instance of libcrux_ml_dsa.matrix.compute_as1_plus_s2 +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_matrix_compute_as1_plus_s2_37( + size_t rows_in_a, + size_t columns_in_a, + Eurydice_dst_ref_mut_44 a_as_ntt, + Eurydice_dst_ref_shared_44 s1_ntt, + Eurydice_dst_ref_shared_44 s1_s2, + Eurydice_dst_ref_mut_44 result +) +{ + for (size_t i0 = (size_t)0U; i0 < rows_in_a; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < columns_in_a; i++) + { + size_t j = i; + libcrux_ml_dsa_ntt_ntt_multiply_montgomery_37(&a_as_ntt.ptr[i1 * columns_in_a + j], + &s1_ntt.ptr[j]); + libcrux_ml_dsa_polynomial_add_ff_37(&result.ptr[i1], &a_as_ntt.ptr[i1 * columns_in_a + j]); + } + } + for (size_t i = (size_t)0U; i < result.meta; i++) + { + size_t i0 = i; + libcrux_ml_dsa_polynomial_barrett_reduce_ff_37(&result.ptr[i0]); + libcrux_ml_dsa_ntt_invert_ntt_montgomery_37(&result.ptr[i0]); + libcrux_ml_dsa_polynomial_add_ff_37(&result.ptr[i0], &s1_s2.ptr[columns_in_a + i0]); + } +} + +/** +A monomorphic instance of Eurydice.array_to_subslice_shared +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients, core_ops_range_Range size_t, Eurydice_derefed_slice libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 8 +*/ +static inline Eurydice_dst_ref_shared_44 +Eurydice_array_to_subslice_shared_25(const Eurydice_arr_8f *a, core_ops_range_Range_87 r) +{ + return + ( + KRML_CLITERAL(Eurydice_dst_ref_shared_44){ .ptr = a->data + r.start, .meta = r.end - r.start } + ); +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 4 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_201(Eurydice_arr_9d *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)4U; + return lit; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 16 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_200(Eurydice_arr_2f *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)16U; + return lit; +} + +/** +A monomorphic instance of libcrux_ml_dsa.sample.rejection_sample_less_than_field_modulus +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE bool +libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37( + Eurydice_borrow_slice_u8 randomness, + size_t *sampled_coefficients, + Eurydice_arr_d0 *out +) +{ + bool done = false; + for (size_t i = (size_t)0U; i < randomness.meta / (size_t)24U; i++) + { + size_t _cloop_i = i; + Eurydice_borrow_slice_u8 + random_bytes = + Eurydice_slice_subslice_shared_c8(randomness, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = _cloop_i * (size_t)24U, + .end = _cloop_i * (size_t)24U + (size_t)24U + } + )); + if (!done) + { + size_t + sampled = + libcrux_ml_dsa_simd_portable_rejection_sample_less_than_field_modulus_65(random_bytes, + Eurydice_array_to_subslice_from_mut_11(out, sampled_coefficients[0U])); + sampled_coefficients[0U] += sampled; + if (sampled_coefficients[0U] >= LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) + { + done = true; + } + } + } + return done; +} + +/** +A monomorphic instance of Eurydice.array_to_slice_mut +with types libcrux_ml_dsa_polynomial_PolynomialRingElement libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics +- N= 8 +*/ +static inline Eurydice_dst_ref_mut_44 Eurydice_array_to_slice_mut_20(Eurydice_arr_8f *a) +{ + Eurydice_dst_ref_mut_44 lit; + lit.ptr = a->data; + lit.meta = (size_t)8U; + return lit; +} + +/** +A monomorphic instance of libcrux_ml_dsa.sample.rejection_sample_less_than_eta_equals_4 +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE bool +libcrux_ml_dsa_sample_rejection_sample_less_than_eta_equals_4_37( + Eurydice_borrow_slice_u8 randomness, + size_t *sampled_coefficients, + Eurydice_arr_d0 *out +) +{ + bool done = false; + for (size_t i = (size_t)0U; i < randomness.meta / (size_t)4U; i++) + { + size_t _cloop_i = i; + Eurydice_borrow_slice_u8 + random_bytes = + Eurydice_slice_subslice_shared_c8(randomness, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = _cloop_i * (size_t)4U, + .end = _cloop_i * (size_t)4U + (size_t)4U + } + )); + if (!done) + { + size_t + sampled = + libcrux_ml_dsa_simd_portable_rejection_sample_less_than_eta_equals_4_65(random_bytes, + Eurydice_array_to_subslice_from_mut_11(out, sampled_coefficients[0U])); + sampled_coefficients[0U] += sampled; + if (sampled_coefficients[0U] >= LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) + { + done = true; + } + } + } + return done; +} + +/** +A monomorphic instance of libcrux_ml_dsa.sample.rejection_sample_less_than_eta_equals_2 +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE bool +libcrux_ml_dsa_sample_rejection_sample_less_than_eta_equals_2_37( + Eurydice_borrow_slice_u8 randomness, + size_t *sampled_coefficients, + Eurydice_arr_d0 *out +) +{ + bool done = false; + for (size_t i = (size_t)0U; i < randomness.meta / (size_t)4U; i++) + { + size_t _cloop_i = i; + Eurydice_borrow_slice_u8 + random_bytes = + Eurydice_slice_subslice_shared_c8(randomness, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = _cloop_i * (size_t)4U, + .end = _cloop_i * (size_t)4U + (size_t)4U + } + )); + if (!done) + { + size_t + sampled = + libcrux_ml_dsa_simd_portable_rejection_sample_less_than_eta_equals_2_65(random_bytes, + Eurydice_array_to_subslice_from_mut_11(out, sampled_coefficients[0U])); + sampled_coefficients[0U] += sampled; + if (sampled_coefficients[0U] >= LIBCRUX_ML_DSA_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) + { + done = true; + } + } + } + return done; +} + +/** +A monomorphic instance of libcrux_ml_dsa.sample.rejection_sample_less_than_eta +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static KRML_MUSTINLINE bool +libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37( + libcrux_ml_dsa_constants_Eta eta, + Eurydice_borrow_slice_u8 randomness, + size_t *sampled, + Eurydice_arr_d0 *out +) +{ + switch (eta) + { + case libcrux_ml_dsa_constants_Eta_Two: + { + break; + } + case libcrux_ml_dsa_constants_Eta_Four: + { + return + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_equals_4_37(randomness, + sampled, + out); + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, __LINE__); + KRML_HOST_EXIT(253U); + } + } + return + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_equals_2_37(randomness, + sampled, + out); +} + +typedef struct libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87KeyPair_s +{ + Eurydice_arr_e2 signing_key; + Eurydice_arr_43 verification_key; +} +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87KeyPair; + +typedef struct libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65KeyPair_s +{ + Eurydice_arr_24 signing_key; + Eurydice_arr_29 verification_key; +} +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65KeyPair; + +typedef struct libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44KeyPair_s +{ + Eurydice_arr_10 signing_key; + Eurydice_arr_02 verification_key; +} +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44KeyPair; + +#if defined(__cplusplus) +} +#endif + +#define libcrux_mldsa_core_H_DEFINED +#endif /* libcrux_mldsa_core_H */ + +/* from libcrux/combined_extraction/generated/libcrux_ct_ops.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_ct_ops_H +#define libcrux_ct_ops_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +/** + Return 1 if `value` is not zero and 0 otherwise. +*/ +static KRML_NOINLINE uint8_t libcrux_ml_kem_constant_time_ops_inz(uint8_t value) +{ + uint16_t value0 = (uint16_t)(uint32_t)value; + uint8_t result = (uint8_t)((uint32_t)core_num__u16__wrapping_add(~value0, 1U) >> 8U & 0xFFFFU); + return (uint32_t)result & 1U; +} + +static KRML_NOINLINE uint8_t libcrux_ml_kem_constant_time_ops_is_non_zero(uint8_t value) +{ + return libcrux_ml_kem_constant_time_ops_inz(value); +} + +/** + Return 1 if the bytes of `lhs` and `rhs` do not exactly + match and 0 otherwise. +*/ +static KRML_NOINLINE uint8_t +libcrux_ml_kem_constant_time_ops_compare( + Eurydice_borrow_slice_u8 lhs, + Eurydice_borrow_slice_u8 rhs +) +{ + uint8_t r = 0U; + for (size_t i = (size_t)0U; i < lhs.meta; i++) + { + size_t i0 = i; + uint8_t nr = (uint32_t)r | ((uint32_t)lhs.ptr[i0] ^ (uint32_t)rhs.ptr[i0]); + r = nr; + } + return libcrux_ml_kem_constant_time_ops_is_non_zero(r); +} + +static KRML_NOINLINE uint8_t +libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time( + Eurydice_borrow_slice_u8 lhs, + Eurydice_borrow_slice_u8 rhs +) +{ + return libcrux_ml_kem_constant_time_ops_compare(lhs, rhs); +} + +/** + If `selector` is not zero, return the bytes in `rhs`; return the bytes in + `lhs` otherwise. +*/ +static KRML_NOINLINE Eurydice_arr_ec +libcrux_ml_kem_constant_time_ops_select_ct( + Eurydice_borrow_slice_u8 lhs, + Eurydice_borrow_slice_u8 rhs, + uint8_t selector +) +{ + uint8_t + mask = core_num__u8__wrapping_sub(libcrux_ml_kem_constant_time_ops_is_non_zero(selector), 1U); + Eurydice_arr_ec out = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE; i++) + { + size_t i0 = i; + uint8_t + outi = + ((uint32_t)lhs.ptr[i0] & (uint32_t)mask) | ((uint32_t)rhs.ptr[i0] & (~(uint32_t)mask & 0xFFU)); + out.data[i0] = outi; + } + return out; +} + +static KRML_NOINLINE Eurydice_arr_ec +libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time( + Eurydice_borrow_slice_u8 lhs, + Eurydice_borrow_slice_u8 rhs, + uint8_t selector +) +{ + return libcrux_ml_kem_constant_time_ops_select_ct(lhs, rhs, selector); +} + +static KRML_NOINLINE Eurydice_arr_ec +libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time( + Eurydice_borrow_slice_u8 lhs_c, + Eurydice_borrow_slice_u8 rhs_c, + Eurydice_borrow_slice_u8 lhs_s, + Eurydice_borrow_slice_u8 rhs_s +) +{ + uint8_t + selector = libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time(lhs_c, rhs_c); + return + libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time(lhs_s, + rhs_s, + selector); +} + +#if defined(__cplusplus) +} +#endif + +#define libcrux_ct_ops_H_DEFINED +#endif /* libcrux_ct_ops_H */ + +/* from libcrux/combined_extraction/generated/libcrux_mldsa_portable.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_mldsa_portable_H +#define libcrux_mldsa_portable_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +typedef struct libcrux_ml_dsa_hash_functions_portable_Shake128X4_s +{ + Eurydice_arr_7c state0; + Eurydice_arr_7c state1; + Eurydice_arr_7c state2; + Eurydice_arr_7c state3; +} +libcrux_ml_dsa_hash_functions_portable_Shake128X4; + +typedef libcrux_sha3_portable_KeccakState libcrux_ml_dsa_hash_functions_portable_Shake256; + +typedef struct libcrux_ml_dsa_hash_functions_portable_Shake256X4_s +{ + Eurydice_arr_7c state0; + Eurydice_arr_7c state1; + Eurydice_arr_7c state2; + Eurydice_arr_7c state3; +} +libcrux_ml_dsa_hash_functions_portable_Shake256X4; + +typedef libcrux_sha3_portable_incremental_Shake256Xof +libcrux_ml_dsa_hash_functions_portable_Shake256Xof; + +static KRML_MUSTINLINE libcrux_ml_dsa_hash_functions_portable_Shake128X4 +libcrux_ml_dsa_hash_functions_portable_init_absorb( + Eurydice_borrow_slice_u8 input0, + Eurydice_borrow_slice_u8 input1, + Eurydice_borrow_slice_u8 input2, + Eurydice_borrow_slice_u8 input3 +) +{ + Eurydice_arr_7c state0 = libcrux_sha3_portable_incremental_shake128_init(); + libcrux_sha3_portable_incremental_shake128_absorb_final(&state0, input0); + Eurydice_arr_7c state1 = libcrux_sha3_portable_incremental_shake128_init(); + libcrux_sha3_portable_incremental_shake128_absorb_final(&state1, input1); + Eurydice_arr_7c state2 = libcrux_sha3_portable_incremental_shake128_init(); + libcrux_sha3_portable_incremental_shake128_absorb_final(&state2, input2); + Eurydice_arr_7c state3 = libcrux_sha3_portable_incremental_shake128_init(); + libcrux_sha3_portable_incremental_shake128_absorb_final(&state3, input3); + return + ( + KRML_CLITERAL(libcrux_ml_dsa_hash_functions_portable_Shake128X4){ + .state0 = state0, + .state1 = state1, + .state2 = state2, + .state3 = state3 + } + ); +} + +static KRML_MUSTINLINE Eurydice_arr_7c +libcrux_ml_dsa_hash_functions_portable_init_absorb_final_shake256( + Eurydice_borrow_slice_u8 input +) +{ + Eurydice_arr_7c state = libcrux_sha3_portable_incremental_shake256_init(); + libcrux_sha3_portable_incremental_shake256_absorb_final(&state, input); + return state; +} + +static KRML_MUSTINLINE libcrux_ml_dsa_hash_functions_portable_Shake256X4 +libcrux_ml_dsa_hash_functions_portable_init_absorb_x4( + Eurydice_borrow_slice_u8 input0, + Eurydice_borrow_slice_u8 input1, + Eurydice_borrow_slice_u8 input2, + Eurydice_borrow_slice_u8 input3 +) +{ + Eurydice_arr_7c state0 = libcrux_sha3_portable_incremental_shake256_init(); + libcrux_sha3_portable_incremental_shake256_absorb_final(&state0, input0); + Eurydice_arr_7c state1 = libcrux_sha3_portable_incremental_shake256_init(); + libcrux_sha3_portable_incremental_shake256_absorb_final(&state1, input1); + Eurydice_arr_7c state2 = libcrux_sha3_portable_incremental_shake256_init(); + libcrux_sha3_portable_incremental_shake256_absorb_final(&state2, input2); + Eurydice_arr_7c state3 = libcrux_sha3_portable_incremental_shake256_init(); + libcrux_sha3_portable_incremental_shake256_absorb_final(&state3, input3); + return + ( + KRML_CLITERAL(libcrux_ml_dsa_hash_functions_portable_Shake256X4){ + .state0 = state0, + .state1 = state1, + .state2 = state2, + .state3 = state3 + } + ); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake128( + Eurydice_borrow_slice_u8 input, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_portable_shake128(out, input); +} + +static KRML_MUSTINLINE Eurydice_arr_ff +libcrux_ml_dsa_hash_functions_portable_squeeze_first_block_shake256(Eurydice_arr_7c *state) +{ + Eurydice_arr_ff out = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_first_block(state, + Eurydice_array_to_slice_mut_58(&out)); + return out; +} + +static KRML_MUSTINLINE Eurydice_arr_ff_x4 +libcrux_ml_dsa_hash_functions_portable_squeeze_first_block_x4( + libcrux_ml_dsa_hash_functions_portable_Shake256X4 *state +) +{ + Eurydice_arr_ff out0 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_first_block(&state->state0, + Eurydice_array_to_slice_mut_58(&out0)); + Eurydice_arr_ff out1 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_first_block(&state->state1, + Eurydice_array_to_slice_mut_58(&out1)); + Eurydice_arr_ff out2 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_first_block(&state->state2, + Eurydice_array_to_slice_mut_58(&out2)); + Eurydice_arr_ff out3 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_first_block(&state->state3, + Eurydice_array_to_slice_mut_58(&out3)); + return + (KRML_CLITERAL(Eurydice_arr_ff_x4){ .fst = out0, .snd = out1, .thd = out2, .f3 = out3 }); +} + +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_squeeze_first_five_blocks( + libcrux_ml_dsa_hash_functions_portable_Shake128X4 *state, + Eurydice_arr_d10 *out0, + Eurydice_arr_d10 *out1, + Eurydice_arr_d10 *out2, + Eurydice_arr_d10 *out3 +) +{ + libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks(&state->state0, + Eurydice_array_to_slice_mut_4c(out0)); + libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks(&state->state1, + Eurydice_array_to_slice_mut_4c(out1)); + libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks(&state->state2, + Eurydice_array_to_slice_mut_4c(out2)); + libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks(&state->state3, + Eurydice_array_to_slice_mut_4c(out3)); +} + +static KRML_MUSTINLINE Eurydice_arr_c5_x4 +libcrux_ml_dsa_hash_functions_portable_squeeze_next_block( + libcrux_ml_dsa_hash_functions_portable_Shake128X4 *state +) +{ + Eurydice_arr_c5 out0 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake128_squeeze_next_block(&state->state0, + Eurydice_array_to_slice_mut_2c(&out0)); + Eurydice_arr_c5 out1 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake128_squeeze_next_block(&state->state1, + Eurydice_array_to_slice_mut_2c(&out1)); + Eurydice_arr_c5 out2 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake128_squeeze_next_block(&state->state2, + Eurydice_array_to_slice_mut_2c(&out2)); + Eurydice_arr_c5 out3 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake128_squeeze_next_block(&state->state3, + Eurydice_array_to_slice_mut_2c(&out3)); + return + (KRML_CLITERAL(Eurydice_arr_c5_x4){ .fst = out0, .snd = out1, .thd = out2, .f3 = out3 }); +} + +static KRML_MUSTINLINE Eurydice_arr_ff +libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_shake256(Eurydice_arr_7c *state) +{ + Eurydice_arr_ff out = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_next_block(state, + Eurydice_array_to_slice_mut_58(&out)); + return out; +} + +static KRML_MUSTINLINE Eurydice_arr_ff_x4 +libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_x4( + libcrux_ml_dsa_hash_functions_portable_Shake256X4 *state +) +{ + Eurydice_arr_ff out0 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_next_block(&state->state0, + Eurydice_array_to_slice_mut_58(&out0)); + Eurydice_arr_ff out1 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_next_block(&state->state1, + Eurydice_array_to_slice_mut_58(&out1)); + Eurydice_arr_ff out2 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_next_block(&state->state2, + Eurydice_array_to_slice_mut_58(&out2)); + Eurydice_arr_ff out3 = { .data = { 0U } }; + libcrux_sha3_portable_incremental_shake256_squeeze_next_block(&state->state3, + Eurydice_array_to_slice_mut_58(&out3)); + return + (KRML_CLITERAL(Eurydice_arr_ff_x4){ .fst = out0, .snd = out1, .thd = out2, .f3 = out3 }); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake128::Xof for libcrux_ml_dsa::hash_functions::portable::Shake128} +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake128_7b( + Eurydice_borrow_slice_u8 input, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_ml_dsa_hash_functions_portable_shake128(input, out); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake128::XofX4 for libcrux_ml_dsa::hash_functions::portable::Shake128X4} +*/ +static KRML_MUSTINLINE libcrux_ml_dsa_hash_functions_portable_Shake128X4 +libcrux_ml_dsa_hash_functions_portable_init_absorb_11( + Eurydice_borrow_slice_u8 input0, + Eurydice_borrow_slice_u8 input1, + Eurydice_borrow_slice_u8 input2, + Eurydice_borrow_slice_u8 input3 +) +{ + return libcrux_ml_dsa_hash_functions_portable_init_absorb(input0, input1, input2, input3); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake128::XofX4 for libcrux_ml_dsa::hash_functions::portable::Shake128X4} +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_squeeze_first_five_blocks_11( + libcrux_ml_dsa_hash_functions_portable_Shake128X4 *self, + Eurydice_arr_d10 *out0, + Eurydice_arr_d10 *out1, + Eurydice_arr_d10 *out2, + Eurydice_arr_d10 *out3 +) +{ + libcrux_ml_dsa_hash_functions_portable_squeeze_first_five_blocks(self, out0, out1, out2, out3); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake128::XofX4 for libcrux_ml_dsa::hash_functions::portable::Shake128X4} +*/ +static KRML_MUSTINLINE Eurydice_arr_c5_x4 +libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_11( + libcrux_ml_dsa_hash_functions_portable_Shake128X4 *self +) +{ + return libcrux_ml_dsa_hash_functions_portable_squeeze_next_block(self); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::DsaXof for libcrux_ml_dsa::hash_functions::portable::Shake256} +*/ +static KRML_MUSTINLINE Eurydice_arr_7c +libcrux_ml_dsa_hash_functions_portable_init_absorb_final_61(Eurydice_borrow_slice_u8 input) +{ + return libcrux_ml_dsa_hash_functions_portable_init_absorb_final_shake256(input); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::DsaXof for libcrux_ml_dsa::hash_functions::portable::Shake256} +*/ +static KRML_MUSTINLINE Eurydice_arr_ff +libcrux_ml_dsa_hash_functions_portable_squeeze_first_block_61(Eurydice_arr_7c *self) +{ + return libcrux_ml_dsa_hash_functions_portable_squeeze_first_block_shake256(self); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::DsaXof for libcrux_ml_dsa::hash_functions::portable::Shake256} +*/ +static KRML_MUSTINLINE Eurydice_arr_ff +libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_61(Eurydice_arr_7c *self) +{ + return libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_shake256(self); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::Xof for libcrux_ml_dsa::hash_functions::portable::Shake256Xof} +*/ +static inline void +libcrux_ml_dsa_hash_functions_portable_absorb_26( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + Eurydice_borrow_slice_u8 input +) +{ + libcrux_sha3_portable_incremental_absorb_42(self, input); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::Xof for libcrux_ml_dsa::hash_functions::portable::Shake256Xof} +*/ +static inline void +libcrux_ml_dsa_hash_functions_portable_absorb_final_26( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + Eurydice_borrow_slice_u8 input +) +{ + libcrux_sha3_portable_incremental_absorb_final_42(self, input); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::Xof for libcrux_ml_dsa::hash_functions::portable::Shake256Xof} +*/ +static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_8d +libcrux_ml_dsa_hash_functions_portable_init_26(void) +{ + return libcrux_sha3_portable_incremental_new_42(); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::Xof for libcrux_ml_dsa::hash_functions::portable::Shake256Xof} +*/ +static inline void +libcrux_ml_dsa_hash_functions_portable_squeeze_26( + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *self, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_sha3_portable_incremental_squeeze_42(self, out); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::XofX4 for libcrux_ml_dsa::hash_functions::portable::Shake256X4} +*/ +static KRML_MUSTINLINE libcrux_ml_dsa_hash_functions_portable_Shake256X4 +libcrux_ml_dsa_hash_functions_portable_init_absorb_x4_9b( + Eurydice_borrow_slice_u8 input0, + Eurydice_borrow_slice_u8 input1, + Eurydice_borrow_slice_u8 input2, + Eurydice_borrow_slice_u8 input3 +) +{ + return libcrux_ml_dsa_hash_functions_portable_init_absorb_x4(input0, input1, input2, input3); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::XofX4 for libcrux_ml_dsa::hash_functions::portable::Shake256X4} +*/ +static KRML_MUSTINLINE Eurydice_arr_ff_x4 +libcrux_ml_dsa_hash_functions_portable_squeeze_first_block_x4_9b( + libcrux_ml_dsa_hash_functions_portable_Shake256X4 *self +) +{ + return libcrux_ml_dsa_hash_functions_portable_squeeze_first_block_x4(self); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::XofX4 for libcrux_ml_dsa::hash_functions::portable::Shake256X4} +*/ +static KRML_MUSTINLINE Eurydice_arr_ff_x4 +libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_x4_9b( + libcrux_ml_dsa_hash_functions_portable_Shake256X4 *self +) +{ + return libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_x4(self); +} + +/** +A monomorphic instance of libcrux_ml_dsa.sample.sample_four_error_ring_elements +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_sample_sample_four_error_ring_elements_29( + libcrux_ml_dsa_constants_Eta eta, + Eurydice_borrow_slice_u8 seed, + uint16_t start_index, + Eurydice_dst_ref_mut_44 re +) +{ + Eurydice_arr_91 seed0 = libcrux_ml_dsa_sample_add_error_domain_separator(seed, start_index); + Eurydice_arr_91 + seed1 = libcrux_ml_dsa_sample_add_error_domain_separator(seed, (uint32_t)start_index + 1U); + Eurydice_arr_91 + seed2 = libcrux_ml_dsa_sample_add_error_domain_separator(seed, (uint32_t)start_index + 2U); + Eurydice_arr_91 + seed3 = libcrux_ml_dsa_sample_add_error_domain_separator(seed, (uint32_t)start_index + 3U); + libcrux_ml_dsa_hash_functions_portable_Shake256X4 + state = + libcrux_ml_dsa_hash_functions_portable_init_absorb_x4_9b(Eurydice_array_to_slice_shared_f1(&seed0), + Eurydice_array_to_slice_shared_f1(&seed1), + Eurydice_array_to_slice_shared_f1(&seed2), + Eurydice_array_to_slice_shared_f1(&seed3)); + Eurydice_arr_ff_x4 + randomnesses0 = libcrux_ml_dsa_hash_functions_portable_squeeze_first_block_x4_9b(&state); + Eurydice_arr_930 + out = + { .data = { { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } } }; + size_t sampled0 = (size_t)0U; + size_t sampled1 = (size_t)0U; + size_t sampled2 = (size_t)0U; + size_t sampled3 = (size_t)0U; + libcrux_ml_dsa_constants_Eta uu____0 = eta; + bool + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____0, + Eurydice_array_to_slice_shared_58(&randomnesses0.fst), + &sampled0, + out.data); + libcrux_ml_dsa_constants_Eta uu____1 = eta; + bool + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____1, + Eurydice_array_to_slice_shared_58(&randomnesses0.snd), + &sampled1, + &out.data[1U]); + libcrux_ml_dsa_constants_Eta uu____2 = eta; + bool + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____2, + Eurydice_array_to_slice_shared_58(&randomnesses0.thd), + &sampled2, + &out.data[2U]); + libcrux_ml_dsa_constants_Eta uu____3 = eta; + bool + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____3, + Eurydice_array_to_slice_shared_58(&randomnesses0.f3), + &sampled3, + &out.data[3U]); + while (true) + { + if (done0) + { + if (done1) + { + if (done2) + { + if (done3) + { + break; + } + else + { + Eurydice_arr_ff_x4 + randomnesses = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_x4_9b(&state); + if (!done0) + { + libcrux_ml_dsa_constants_Eta uu____4 = eta; + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____4, + Eurydice_array_to_slice_shared_58(&randomnesses.fst), + &sampled0, + out.data); + } + if (!done1) + { + libcrux_ml_dsa_constants_Eta uu____5 = eta; + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____5, + Eurydice_array_to_slice_shared_58(&randomnesses.snd), + &sampled1, + &out.data[1U]); + } + if (!done2) + { + libcrux_ml_dsa_constants_Eta uu____6 = eta; + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____6, + Eurydice_array_to_slice_shared_58(&randomnesses.thd), + &sampled2, + &out.data[2U]); + } + if (!done3) + { + libcrux_ml_dsa_constants_Eta uu____7 = eta; + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____7, + Eurydice_array_to_slice_shared_58(&randomnesses.f3), + &sampled3, + &out.data[3U]); + } + } + } + else + { + Eurydice_arr_ff_x4 + randomnesses = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_x4_9b(&state); + if (!done0) + { + libcrux_ml_dsa_constants_Eta uu____8 = eta; + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____8, + Eurydice_array_to_slice_shared_58(&randomnesses.fst), + &sampled0, + out.data); + } + if (!done1) + { + libcrux_ml_dsa_constants_Eta uu____9 = eta; + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____9, + Eurydice_array_to_slice_shared_58(&randomnesses.snd), + &sampled1, + &out.data[1U]); + } + if (!done2) + { + libcrux_ml_dsa_constants_Eta uu____10 = eta; + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____10, + Eurydice_array_to_slice_shared_58(&randomnesses.thd), + &sampled2, + &out.data[2U]); + } + if (!done3) + { + libcrux_ml_dsa_constants_Eta uu____11 = eta; + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____11, + Eurydice_array_to_slice_shared_58(&randomnesses.f3), + &sampled3, + &out.data[3U]); + } + } + } + else + { + Eurydice_arr_ff_x4 + randomnesses = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_x4_9b(&state); + if (!done0) + { + libcrux_ml_dsa_constants_Eta uu____12 = eta; + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____12, + Eurydice_array_to_slice_shared_58(&randomnesses.fst), + &sampled0, + out.data); + } + if (!done1) + { + libcrux_ml_dsa_constants_Eta uu____13 = eta; + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____13, + Eurydice_array_to_slice_shared_58(&randomnesses.snd), + &sampled1, + &out.data[1U]); + } + if (!done2) + { + libcrux_ml_dsa_constants_Eta uu____14 = eta; + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____14, + Eurydice_array_to_slice_shared_58(&randomnesses.thd), + &sampled2, + &out.data[2U]); + } + if (!done3) + { + libcrux_ml_dsa_constants_Eta uu____15 = eta; + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____15, + Eurydice_array_to_slice_shared_58(&randomnesses.f3), + &sampled3, + &out.data[3U]); + } + } + } + else + { + Eurydice_arr_ff_x4 + randomnesses = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_x4_9b(&state); + if (!done0) + { + libcrux_ml_dsa_constants_Eta uu____16 = eta; + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____16, + Eurydice_array_to_slice_shared_58(&randomnesses.fst), + &sampled0, + out.data); + } + if (!done1) + { + libcrux_ml_dsa_constants_Eta uu____17 = eta; + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____17, + Eurydice_array_to_slice_shared_58(&randomnesses.snd), + &sampled1, + &out.data[1U]); + } + if (!done2) + { + libcrux_ml_dsa_constants_Eta uu____18 = eta; + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____18, + Eurydice_array_to_slice_shared_58(&randomnesses.thd), + &sampled2, + &out.data[2U]); + } + if (!done3) + { + libcrux_ml_dsa_constants_Eta uu____19 = eta; + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_eta_37(uu____19, + Eurydice_array_to_slice_shared_58(&randomnesses.f3), + &sampled3, + &out.data[3U]); + } + } + } + size_t max0 = (size_t)(uint32_t)start_index + (size_t)4U; + size_t max; + if (re.meta < max0) + { + max = re.meta; + } + else + { + max = max0; + } + for (size_t i = (size_t)(uint32_t)start_index; i < max; i++) + { + size_t i0 = i; + libcrux_ml_dsa_polynomial_from_i32_array_ff_37(Eurydice_array_to_slice_shared_2c0(&out.data[i0 + % (size_t)4U]), + &re.ptr[i0]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.samplex4.sample_s1_and_s2 +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_samplex4_sample_s1_and_s2_29( + libcrux_ml_dsa_constants_Eta eta, + Eurydice_borrow_slice_u8 seed, + Eurydice_dst_ref_mut_44 s1_s2 +) +{ + size_t len = s1_s2.meta; + for (size_t i = (size_t)0U; i < len / (size_t)4U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_sample_sample_four_error_ring_elements_29(eta, + seed, + 4U * (uint32_t)(uint16_t)i0, + s1_s2); + } + size_t remainder = len % (size_t)4U; + if (remainder != (size_t)0U) + { + libcrux_ml_dsa_sample_sample_four_error_ring_elements_29(eta, + seed, + (uint16_t)(len - remainder), + s1_s2); + } +} + +/** + Sample and write out up to four ring elements. + + If i <= `elements_requested`, a field element with domain separated + seed according to the provided index is generated in + `tmp_stack[i]`. After successful rejection sampling in + `tmp_stack[i]`, the ring element is written to `matrix` at the + provided index in `indices[i]`. + `rand_stack` is a working buffer that holds initial Shake output. +*/ +/** +A monomorphic instance of libcrux_ml_dsa.sample.sample_up_to_four_ring_elements_flat +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_hash_functions_portable_Shake128X4 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_sample_sample_up_to_four_ring_elements_flat_63( + size_t columns, + Eurydice_borrow_slice_u8 seed, + Eurydice_dst_ref_mut_44 matrix, + Eurydice_arr_d10 *rand_stack0, + Eurydice_arr_d10 *rand_stack1, + Eurydice_arr_d10 *rand_stack2, + Eurydice_arr_d10 *rand_stack3, + Eurydice_dst_ref_mut_33 tmp_stack, + size_t start_index, + size_t elements_requested +) +{ + Eurydice_arr_31 + seed0 = + libcrux_ml_dsa_sample_add_domain_separator(seed, + libcrux_ml_dsa_sample_sample_up_to_four_ring_elements_flat_xy(start_index, columns)); + Eurydice_arr_31 + seed1 = + libcrux_ml_dsa_sample_add_domain_separator(seed, + libcrux_ml_dsa_sample_sample_up_to_four_ring_elements_flat_xy(start_index + (size_t)1U, + columns)); + Eurydice_arr_31 + seed2 = + libcrux_ml_dsa_sample_add_domain_separator(seed, + libcrux_ml_dsa_sample_sample_up_to_four_ring_elements_flat_xy(start_index + (size_t)2U, + columns)); + Eurydice_arr_31 + seed3 = + libcrux_ml_dsa_sample_add_domain_separator(seed, + libcrux_ml_dsa_sample_sample_up_to_four_ring_elements_flat_xy(start_index + (size_t)3U, + columns)); + libcrux_ml_dsa_hash_functions_portable_Shake128X4 + state = + libcrux_ml_dsa_hash_functions_portable_init_absorb_11(Eurydice_array_to_slice_shared_e9(&seed0), + Eurydice_array_to_slice_shared_e9(&seed1), + Eurydice_array_to_slice_shared_e9(&seed2), + Eurydice_array_to_slice_shared_e9(&seed3)); + libcrux_ml_dsa_hash_functions_portable_squeeze_first_five_blocks_11(&state, + rand_stack0, + rand_stack1, + rand_stack2, + rand_stack3); + size_t sampled0 = (size_t)0U; + size_t sampled1 = (size_t)0U; + size_t sampled2 = (size_t)0U; + size_t sampled3 = (size_t)0U; + bool + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_4c(rand_stack0), + &sampled0, + tmp_stack.ptr); + bool + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_4c(rand_stack1), + &sampled1, + &tmp_stack.ptr[1U]); + bool + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_4c(rand_stack2), + &sampled2, + &tmp_stack.ptr[2U]); + bool + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_4c(rand_stack3), + &sampled3, + &tmp_stack.ptr[3U]); + while (true) + { + if (done0) + { + if (done1) + { + if (done2) + { + if (done3) + { + break; + } + else + { + Eurydice_arr_c5_x4 + randomnesses = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_11(&state); + if (!done0) + { + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.fst), + &sampled0, + tmp_stack.ptr); + } + if (!done1) + { + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.snd), + &sampled1, + &tmp_stack.ptr[1U]); + } + if (!done2) + { + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.thd), + &sampled2, + &tmp_stack.ptr[2U]); + } + if (!done3) + { + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.f3), + &sampled3, + &tmp_stack.ptr[3U]); + } + } + } + else + { + Eurydice_arr_c5_x4 + randomnesses = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_11(&state); + if (!done0) + { + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.fst), + &sampled0, + tmp_stack.ptr); + } + if (!done1) + { + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.snd), + &sampled1, + &tmp_stack.ptr[1U]); + } + if (!done2) + { + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.thd), + &sampled2, + &tmp_stack.ptr[2U]); + } + if (!done3) + { + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.f3), + &sampled3, + &tmp_stack.ptr[3U]); + } + } + } + else + { + Eurydice_arr_c5_x4 + randomnesses = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_11(&state); + if (!done0) + { + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.fst), + &sampled0, + tmp_stack.ptr); + } + if (!done1) + { + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.snd), + &sampled1, + &tmp_stack.ptr[1U]); + } + if (!done2) + { + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.thd), + &sampled2, + &tmp_stack.ptr[2U]); + } + if (!done3) + { + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.f3), + &sampled3, + &tmp_stack.ptr[3U]); + } + } + } + else + { + Eurydice_arr_c5_x4 + randomnesses = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_11(&state); + if (!done0) + { + done0 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.fst), + &sampled0, + tmp_stack.ptr); + } + if (!done1) + { + done1 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.snd), + &sampled1, + &tmp_stack.ptr[1U]); + } + if (!done2) + { + done2 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.thd), + &sampled2, + &tmp_stack.ptr[2U]); + } + if (!done3) + { + done3 = + libcrux_ml_dsa_sample_rejection_sample_less_than_field_modulus_37(Eurydice_array_to_slice_shared_2c(&randomnesses.f3), + &sampled3, + &tmp_stack.ptr[3U]); + } + } + } + for (size_t i = (size_t)0U; i < elements_requested; i++) + { + size_t k = i; + libcrux_ml_dsa_polynomial_from_i32_array_ff_37(Eurydice_array_to_slice_shared_2c0(&tmp_stack.ptr[k]), + &matrix.ptr[start_index + k]); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.samplex4.matrix_flat +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_hash_functions_portable_Shake128X4 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_samplex4_matrix_flat_63( + size_t columns, + Eurydice_borrow_slice_u8 seed, + Eurydice_dst_ref_mut_44 matrix +) +{ + Eurydice_arr_d10 rand_stack0 = { .data = { 0U } }; + Eurydice_arr_d10 rand_stack1 = { .data = { 0U } }; + Eurydice_arr_d10 rand_stack2 = { .data = { 0U } }; + Eurydice_arr_d10 rand_stack3 = { .data = { 0U } }; + Eurydice_arr_930 + tmp_stack = + { .data = { { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } } }; + for (size_t i = (size_t)0U; i < matrix.meta / (size_t)4U + (size_t)1U; i++) + { + size_t start_index = i; + size_t start_index0 = start_index * (size_t)4U; + if (start_index0 >= matrix.meta) + { + break; + } + size_t elements_requested; + if (start_index0 + (size_t)4U <= matrix.meta) + { + elements_requested = (size_t)4U; + } + else + { + elements_requested = matrix.meta - start_index0; + } + libcrux_ml_dsa_sample_sample_up_to_four_ring_elements_flat_63(columns, + seed, + matrix, + &rand_stack0, + &rand_stack1, + &rand_stack2, + &rand_stack3, + Eurydice_array_to_slice_mut_7e(&tmp_stack), + start_index0, + elements_requested); + } +} + +/** +This function found in impl {libcrux_ml_dsa::samplex4::X4Sampler for libcrux_ml_dsa::samplex4::portable::PortableSampler} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.samplex4.portable.matrix_flat_a8 +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients +with const generics + +*/ +static inline void +libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37( + size_t columns, + Eurydice_borrow_slice_u8 seed, + Eurydice_dst_ref_mut_44 matrix +) +{ + libcrux_ml_dsa_samplex4_matrix_flat_63(columns, seed, matrix); +} + +/** +A monomorphic instance of libcrux_ml_dsa.hash_functions.portable.shake256 +with const generics +- OUTPUT_LENGTH= 64 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake256_c9( + Eurydice_borrow_slice_u8 input, + Eurydice_arr_c7 *out +) +{ + libcrux_sha3_portable_shake256(Eurydice_array_to_slice_mut_17(out), input); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::DsaXof for libcrux_ml_dsa::hash_functions::portable::Shake256} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.hash_functions.portable.shake256_61 +with const generics +- OUTPUT_LENGTH= 64 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake256_61_c9( + Eurydice_borrow_slice_u8 input, + Eurydice_arr_c7 *out +) +{ + libcrux_ml_dsa_hash_functions_portable_shake256_c9(input, out); +} + +/** +A monomorphic instance of libcrux_ml_dsa.encoding.signing_key.generate_serialized +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_hash_functions_portable_Shake256 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_encoding_signing_key_generate_serialized_2e( + libcrux_ml_dsa_constants_Eta eta, + size_t error_ring_element_size, + Eurydice_borrow_slice_u8 seed_matrix, + Eurydice_borrow_slice_u8 seed_signing, + Eurydice_borrow_slice_u8 verification_key, + Eurydice_dst_ref_shared_44 s1_2, + Eurydice_dst_ref_shared_44 t0, + Eurydice_mut_borrow_slice_u8 signing_key_serialized +) +{ + size_t offset = (size_t)0U; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(signing_key_serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE + } + )), + seed_matrix, + uint8_t); + offset += LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE; + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(signing_key_serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_SIGNING_SIZE + } + )), + seed_signing, + uint8_t); + offset += LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_SIGNING_SIZE; + Eurydice_arr_c7 verification_key_hash = { .data = { 0U } }; + libcrux_ml_dsa_hash_functions_portable_shake256_61_c9(verification_key, + &verification_key_hash); + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(signing_key_serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + LIBCRUX_ML_DSA_CONSTANTS_BYTES_FOR_VERIFICATION_KEY_HASH + } + )), + Eurydice_array_to_slice_shared_17(&verification_key_hash), + uint8_t); + offset += LIBCRUX_ML_DSA_CONSTANTS_BYTES_FOR_VERIFICATION_KEY_HASH; + for (size_t i = (size_t)0U; i < s1_2.meta; i++) + { + size_t i0 = i; + libcrux_ml_dsa_encoding_error_serialize_37(eta, + &s1_2.ptr[i0], + Eurydice_slice_subslice_mut_c8(signing_key_serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + error_ring_element_size + } + ))); + offset += error_ring_element_size; + } + for (size_t i = (size_t)0U; i < t0.meta; i++) + { + size_t _cloop_j = i; + const Eurydice_arr_a3 *ring_element = &t0.ptr[_cloop_j]; + libcrux_ml_dsa_encoding_t0_serialize_37(ring_element, + Eurydice_slice_subslice_mut_c8(signing_key_serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = offset, + .end = offset + LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T0S_SIZE + } + ))); + offset += LIBCRUX_ML_DSA_CONSTANTS_RING_ELEMENT_OF_T0S_SIZE; + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.generate_key_pair +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_generate_key_pair_5a( + Eurydice_arr_ec randomness, + Eurydice_mut_borrow_slice_u8 signing_key, + Eurydice_mut_borrow_slice_u8 verification_key +) +{ + Eurydice_arr_89 seed_expanded0 = { .data = { 0U } }; + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_01(&randomness)); + /* original Rust expression is not an lvalue in C */ + Eurydice_array_u8x2 + lvalue = + { + .data = { + (uint8_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + (uint8_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A + } + }; + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_82(&lvalue)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_78(&seed_expanded0)); + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_78(&seed_expanded0), + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 seed_expanded = uu____0.snd; + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(seed_expanded, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_ERROR_VECTORS_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_error_vectors = uu____1.fst; + Eurydice_borrow_slice_u8 seed_for_signing = uu____1.snd; + Eurydice_arr_8f s1_s2; + Eurydice_arr_a3 repeat_expression0[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_s2.data, repeat_expression0, (size_t)8U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_sample_s1_and_s2_29(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ETA, + seed_for_error_vectors, + Eurydice_array_to_slice_mut_20(&s1_s2)); + Eurydice_arr_9d t0; + Eurydice_arr_a3 repeat_expression1[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t0.data, repeat_expression1, (size_t)4U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_2f a_as_ntt; + Eurydice_arr_a3 repeat_expression2[16U]; + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + repeat_expression2[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(a_as_ntt.data, repeat_expression2, (size_t)16U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_200(&a_as_ntt)); + Eurydice_arr_9d s1_ntt; + Eurydice_arr_a3 repeat_expression3[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression3[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_ntt.data, repeat_expression3, (size_t)4U * sizeof (Eurydice_arr_a3)); + Eurydice_slice_copy(Eurydice_array_to_slice_mut_201(&s1_ntt), + Eurydice_array_to_subslice_shared_25(&s1_s2, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A + } + )), + Eurydice_arr_a3); + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&s1_ntt.data[i0]); + } + libcrux_ml_dsa_matrix_compute_as1_plus_s2_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + Eurydice_array_to_slice_mut_200(&a_as_ntt), + Eurydice_array_to_slice_shared_20(&s1_ntt), + Eurydice_array_to_slice_shared_200(&s1_s2), + Eurydice_array_to_slice_mut_201(&t0)); + Eurydice_arr_9d t1; + Eurydice_arr_a3 repeat_expression[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t1.data, repeat_expression, (size_t)4U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_arithmetic_power2round_vector_37(Eurydice_array_to_slice_mut_201(&t0), + Eurydice_array_to_slice_mut_201(&t1)); + libcrux_ml_dsa_encoding_verification_key_generate_serialized_37(seed_for_a, + Eurydice_array_to_slice_shared_20(&t1), + verification_key); + libcrux_ml_dsa_encoding_signing_key_generate_serialized_2e(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ERROR_RING_ELEMENT_SIZE, + seed_for_a, + seed_for_signing, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = verification_key.ptr, + .meta = verification_key.meta + } + ), + Eurydice_array_to_slice_shared_200(&s1_s2), + Eurydice_array_to_slice_shared_20(&t0), + signing_key); +} + +/** + Generate key pair. +*/ +static inline void +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_generate_key_pair( + Eurydice_arr_ec randomness, + Eurydice_arr_10 *signing_key, + Eurydice_arr_02 *verification_key +) +{ + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_generate_key_pair_5a(randomness, + Eurydice_array_to_slice_mut_34(signing_key), + Eurydice_array_to_slice_mut_9f0(verification_key)); +} + +/** + This corresponds to line 6 in algorithm 7 in FIPS 204 (line 7 in algorithm + 8, resp.). + + If `domain_separation_context` is supplied, applies domain + separation and length encoding to the context string, + before appending the message (in the regular variant) or the + pre-hash OID as well as the pre-hashed message digest. Otherwise, + it is assumed that `message` already contains domain separation + information. + + In FIPS 204 M' is the concatenation of the domain separated context, any + potential pre-hash OID and the message (or the message pre-hash). We do not + explicitely construct the concatenation in memory since it is of statically unknown + length, but feed its components directly into the incremental XOF. + + Refer to line 10 of Algorithm 2 (and line 5 of Algorithm 3, resp.) in [FIPS + 204](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf#section.5) + for details on the domain separation for regular ML-DSA. Line + 23 of Algorithm 4 (and line 18 of Algorithm 5,resp.) describe domain separation for the HashMl-DSA + variant. +*/ +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.derive_message_representative +with types libcrux_ml_dsa_hash_functions_portable_Shake256Xof +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_ml_dsa_generic_derive_message_representative_43( + Eurydice_borrow_slice_u8 verification_key_hash, + const core_option_Option_84 *domain_separation_context, + Eurydice_borrow_slice_u8 message, + Eurydice_arr_c7 *message_representative +) +{ + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, verification_key_hash); + if (domain_separation_context->tag == core_option_Some) + { + const + libcrux_ml_dsa_pre_hash_DomainSeparationContext + *domain_separation_context0 = &domain_separation_context->f0; + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *uu____0 = &shake; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_82 + lvalue0 = + { + .data = { + (uint8_t)core_option__core__option__Option_T__TraitClause_0___is_some(libcrux_ml_dsa_pre_hash_pre_hash_oid_88(domain_separation_context0), + Eurydice_arr_c9, + bool) + } + }; + libcrux_ml_dsa_hash_functions_portable_absorb_26(uu____0, + Eurydice_array_to_slice_shared_79(&lvalue0)); + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d *uu____1 = &shake; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_82 + lvalue = + { .data = { (uint8_t)libcrux_ml_dsa_pre_hash_context_88(domain_separation_context0).meta } }; + libcrux_ml_dsa_hash_functions_portable_absorb_26(uu____1, + Eurydice_array_to_slice_shared_79(&lvalue)); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + libcrux_ml_dsa_pre_hash_context_88(domain_separation_context0)); + const + core_option_Option_57 + *uu____2 = libcrux_ml_dsa_pre_hash_pre_hash_oid_88(domain_separation_context0); + if (uu____2->tag == core_option_Some) + { + const Eurydice_arr_c9 *pre_hash_oid = &uu____2->f0; + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_2f(pre_hash_oid)); + } + } + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, message); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_17(message_representative)); +} + +/** +A monomorphic instance of libcrux_ml_dsa.hash_functions.portable.shake256 +with const generics +- OUTPUT_LENGTH= 576 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake256_5a( + Eurydice_borrow_slice_u8 input, + Eurydice_arr_220 *out +) +{ + libcrux_sha3_portable_shake256(Eurydice_array_to_slice_mut_8a(out), input); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::XofX4 for libcrux_ml_dsa::hash_functions::portable::Shake256X4} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.hash_functions.portable.shake256_x4_9b +with const generics +- OUT_LEN= 576 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake256_x4_9b_5a( + Eurydice_borrow_slice_u8 input0, + Eurydice_borrow_slice_u8 input1, + Eurydice_borrow_slice_u8 input2, + Eurydice_borrow_slice_u8 input3, + Eurydice_arr_220 *out0, + Eurydice_arr_220 *out1, + Eurydice_arr_220 *out2, + Eurydice_arr_220 *out3 +) +{ + libcrux_ml_dsa_hash_functions_portable_shake256_5a(input0, out0); + libcrux_ml_dsa_hash_functions_portable_shake256_5a(input1, out1); + libcrux_ml_dsa_hash_functions_portable_shake256_5a(input2, out2); + libcrux_ml_dsa_hash_functions_portable_shake256_5a(input3, out3); +} + +/** +A monomorphic instance of libcrux_ml_dsa.hash_functions.portable.shake256 +with const generics +- OUTPUT_LENGTH= 640 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake256_0e( + Eurydice_borrow_slice_u8 input, + Eurydice_arr_20 *out +) +{ + libcrux_sha3_portable_shake256(Eurydice_array_to_slice_mut_4f(out), input); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::XofX4 for libcrux_ml_dsa::hash_functions::portable::Shake256X4} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.hash_functions.portable.shake256_x4_9b +with const generics +- OUT_LEN= 640 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake256_x4_9b_0e( + Eurydice_borrow_slice_u8 input0, + Eurydice_borrow_slice_u8 input1, + Eurydice_borrow_slice_u8 input2, + Eurydice_borrow_slice_u8 input3, + Eurydice_arr_20 *out0, + Eurydice_arr_20 *out1, + Eurydice_arr_20 *out2, + Eurydice_arr_20 *out3 +) +{ + libcrux_ml_dsa_hash_functions_portable_shake256_0e(input0, out0); + libcrux_ml_dsa_hash_functions_portable_shake256_0e(input1, out1); + libcrux_ml_dsa_hash_functions_portable_shake256_0e(input2, out2); + libcrux_ml_dsa_hash_functions_portable_shake256_0e(input3, out3); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::DsaXof for libcrux_ml_dsa::hash_functions::portable::Shake256} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.hash_functions.portable.shake256_61 +with const generics +- OUTPUT_LENGTH= 640 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake256_61_0e( + Eurydice_borrow_slice_u8 input, + Eurydice_arr_20 *out +) +{ + libcrux_ml_dsa_hash_functions_portable_shake256_0e(input, out); +} + +/** +This function found in impl {libcrux_ml_dsa::hash_functions::shake256::DsaXof for libcrux_ml_dsa::hash_functions::portable::Shake256} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.hash_functions.portable.shake256_61 +with const generics +- OUTPUT_LENGTH= 576 +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_hash_functions_portable_shake256_61_5a( + Eurydice_borrow_slice_u8 input, + Eurydice_arr_220 *out +) +{ + libcrux_ml_dsa_hash_functions_portable_shake256_5a(input, out); +} + +/** +A monomorphic instance of libcrux_ml_dsa.sample.sample_mask_ring_element +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_hash_functions_portable_Shake256 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_sample_sample_mask_ring_element_2e( + const Eurydice_arr_91 *seed, + Eurydice_arr_a3 *result, + size_t gamma1_exponent +) +{ + switch (gamma1_exponent) + { + case 17U: + { + break; + } + case 19U: + { + Eurydice_arr_20 out = { .data = { 0U } }; + libcrux_ml_dsa_hash_functions_portable_shake256_61_0e(Eurydice_array_to_slice_shared_f1(seed), + &out); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_4f(&out), + result); + return; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "panic!"); + KRML_HOST_EXIT(255U); + } + } + Eurydice_arr_220 out = { .data = { 0U } }; + libcrux_ml_dsa_hash_functions_portable_shake256_61_5a(Eurydice_array_to_slice_shared_f1(seed), + &out); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_8a(&out), + result); +} + +/** +A monomorphic instance of libcrux_ml_dsa.sample.sample_mask_vector +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_sample_sample_mask_vector_67( + size_t dimension, + size_t gamma1_exponent, + const Eurydice_arr_c7 *seed, + uint16_t *domain_separator, + Eurydice_dst_ref_mut_44 mask +) +{ + Eurydice_arr_91 + seed0 = + libcrux_ml_dsa_sample_add_error_domain_separator(Eurydice_array_to_slice_shared_17(seed), + domain_separator[0U]); + Eurydice_arr_91 + seed1 = + libcrux_ml_dsa_sample_add_error_domain_separator(Eurydice_array_to_slice_shared_17(seed), + (uint32_t)domain_separator[0U] + 1U); + Eurydice_arr_91 + seed2 = + libcrux_ml_dsa_sample_add_error_domain_separator(Eurydice_array_to_slice_shared_17(seed), + (uint32_t)domain_separator[0U] + 2U); + Eurydice_arr_91 + seed3 = + libcrux_ml_dsa_sample_add_error_domain_separator(Eurydice_array_to_slice_shared_17(seed), + (uint32_t)domain_separator[0U] + 3U); + domain_separator[0U] = (uint32_t)domain_separator[0U] + 4U; + switch (gamma1_exponent) + { + case 17U: + { + Eurydice_arr_220 out0 = { .data = { 0U } }; + Eurydice_arr_220 out1 = { .data = { 0U } }; + Eurydice_arr_220 out2 = { .data = { 0U } }; + Eurydice_arr_220 out3 = { .data = { 0U } }; + libcrux_ml_dsa_hash_functions_portable_shake256_x4_9b_5a(Eurydice_array_to_slice_shared_f1(&seed0), + Eurydice_array_to_slice_shared_f1(&seed1), + Eurydice_array_to_slice_shared_f1(&seed2), + Eurydice_array_to_slice_shared_f1(&seed3), + &out0, + &out1, + &out2, + &out3); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_8a(&out0), + mask.ptr); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_8a(&out1), + &mask.ptr[1U]); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_8a(&out2), + &mask.ptr[2U]); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_8a(&out3), + &mask.ptr[3U]); + break; + } + case 19U: + { + Eurydice_arr_20 out0 = { .data = { 0U } }; + Eurydice_arr_20 out1 = { .data = { 0U } }; + Eurydice_arr_20 out2 = { .data = { 0U } }; + Eurydice_arr_20 out3 = { .data = { 0U } }; + libcrux_ml_dsa_hash_functions_portable_shake256_x4_9b_0e(Eurydice_array_to_slice_shared_f1(&seed0), + Eurydice_array_to_slice_shared_f1(&seed1), + Eurydice_array_to_slice_shared_f1(&seed2), + Eurydice_array_to_slice_shared_f1(&seed3), + &out0, + &out1, + &out2, + &out3); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_4f(&out0), + mask.ptr); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_4f(&out1), + &mask.ptr[1U]); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_4f(&out2), + &mask.ptr[2U]); + libcrux_ml_dsa_encoding_gamma1_deserialize_37(gamma1_exponent, + Eurydice_array_to_slice_shared_4f(&out3), + &mask.ptr[3U]); + break; + } + default: + { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, "panic!"); + KRML_HOST_EXIT(255U); + } + } + for (size_t i = (size_t)4U; i < dimension; i++) + { + size_t i0 = i; + Eurydice_arr_91 + seed4 = + libcrux_ml_dsa_sample_add_error_domain_separator(Eurydice_array_to_slice_shared_17(seed), + domain_separator[0U]); + domain_separator[0U] = (uint32_t)domain_separator[0U] + 1U; + libcrux_ml_dsa_sample_sample_mask_ring_element_2e(&seed4, &mask.ptr[i0], gamma1_exponent); + } +} + +/** +A monomorphic instance of libcrux_ml_dsa.sample.sample_challenge_ring_element +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_hash_functions_portable_Shake256 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_sample_sample_challenge_ring_element_2e( + Eurydice_borrow_slice_u8 seed, + size_t number_of_ones, + Eurydice_arr_a3 *re +) +{ + Eurydice_arr_7c state = libcrux_ml_dsa_hash_functions_portable_init_absorb_final_61(seed); + Eurydice_arr_ff + randomness0 = libcrux_ml_dsa_hash_functions_portable_squeeze_first_block_61(&state); + Eurydice_array_u8x8 arr; + memcpy(arr.data, + Eurydice_array_to_subslice_shared_d40(&randomness0, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)8U })).ptr, + (size_t)8U * sizeof (uint8_t)); + uint64_t + signs = + core_num__u64__from_le_bytes(core_result_unwrap_26_e0(( + KRML_CLITERAL(core_result_Result_8e){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + ))); + Eurydice_arr_6c result = { .data = { 0U } }; + size_t out_index = (size_t)256U - number_of_ones; + bool + done = + libcrux_ml_dsa_sample_inside_out_shuffle(Eurydice_array_to_subslice_from_shared_5f(&randomness0, + (size_t)8U), + &out_index, + &signs, + &result); + while (true) + { + if (done) + { + break; + } + else + { + Eurydice_arr_ff + randomness = libcrux_ml_dsa_hash_functions_portable_squeeze_next_block_61(&state); + done = + libcrux_ml_dsa_sample_inside_out_shuffle(Eurydice_array_to_slice_shared_58(&randomness), + &out_index, + &signs, + &result); + } + } + libcrux_ml_dsa_polynomial_from_i32_array_ff_37(Eurydice_array_to_slice_shared_af(&result), re); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.sign_internal +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_internal_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + core_option_Option_84 domain_separation_context, + Eurydice_arr_ec randomness, + Eurydice_arr_85 *signature +) +{ + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(signing_key, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 remaining_serialized0 = uu____0.snd; + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(remaining_serialized0, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_SIGNING_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_signing = uu____1.fst; + Eurydice_borrow_slice_u8 remaining_serialized1 = uu____1.snd; + Eurydice_borrow_slice_u8_x2 + uu____2 = + Eurydice_slice_split_at(remaining_serialized1, + LIBCRUX_ML_DSA_CONSTANTS_BYTES_FOR_VERIFICATION_KEY_HASH, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 verification_key_hash = uu____2.fst; + Eurydice_borrow_slice_u8 remaining_serialized2 = uu____2.snd; + Eurydice_borrow_slice_u8_x2 + uu____3 = + Eurydice_slice_split_at(remaining_serialized2, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ERROR_RING_ELEMENT_SIZE * + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 s1_serialized = uu____3.fst; + Eurydice_borrow_slice_u8 remaining_serialized = uu____3.snd; + Eurydice_borrow_slice_u8_x2 + uu____4 = + Eurydice_slice_split_at(remaining_serialized, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ERROR_RING_ELEMENT_SIZE * + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 s2_serialized = uu____4.fst; + Eurydice_borrow_slice_u8 t0_serialized = uu____4.snd; + Eurydice_arr_9d s1_as_ntt; + Eurydice_arr_a3 repeat_expression0[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_as_ntt.data, repeat_expression0, (size_t)4U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_9d s2_as_ntt; + Eurydice_arr_a3 repeat_expression1[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s2_as_ntt.data, repeat_expression1, (size_t)4U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_9d t0_as_ntt; + Eurydice_arr_a3 repeat_expression2[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression2[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t0_as_ntt.data, repeat_expression2, (size_t)4U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_encoding_error_deserialize_to_vector_then_ntt_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ERROR_RING_ELEMENT_SIZE, + s1_serialized, + Eurydice_array_to_slice_mut_201(&s1_as_ntt)); + libcrux_ml_dsa_encoding_error_deserialize_to_vector_then_ntt_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_ERROR_RING_ELEMENT_SIZE, + s2_serialized, + Eurydice_array_to_slice_mut_201(&s2_as_ntt)); + libcrux_ml_dsa_encoding_t0_deserialize_to_vector_then_ntt_37(t0_serialized, + Eurydice_array_to_slice_mut_201(&t0_as_ntt)); + Eurydice_arr_2f matrix; + Eurydice_arr_a3 repeat_expression3[16U]; + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + repeat_expression3[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(matrix.data, repeat_expression3, (size_t)16U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_200(&matrix)); + Eurydice_arr_c7 message_representative = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_derive_message_representative_43(verification_key_hash, + &domain_separation_context, + message, + &message_representative); + Eurydice_arr_c7 mask_seed = { .data = { 0U } }; + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake0 = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake0, seed_for_signing); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake0, + Eurydice_array_to_slice_shared_01(&randomness)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake0, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake0, + Eurydice_array_to_slice_mut_17(&mask_seed)); + uint16_t domain_separator_for_mask = 0U; + size_t attempt = (size_t)0U; + core_option_Option_14 commitment_hash0 = { .tag = core_option_None }; + core_option_Option_d9 signer_response0 = { .tag = core_option_None }; + core_option_Option_51 hint0 = { .tag = core_option_None }; + while (attempt < LIBCRUX_ML_DSA_CONSTANTS_REJECTION_SAMPLE_BOUND_SIGN) + { + attempt++; + Eurydice_arr_9d mask; + Eurydice_arr_a3 repeat_expression4[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression4[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(mask.data, repeat_expression4, (size_t)4U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_9d w0; + Eurydice_arr_a3 repeat_expression5[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression5[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(w0.data, repeat_expression5, (size_t)4U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_9d commitment; + Eurydice_arr_a3 repeat_expression6[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression6[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(commitment.data, repeat_expression6, (size_t)4U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_sample_sample_mask_vector_67(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA1_EXPONENT, + &mask_seed, + &domain_separator_for_mask, + Eurydice_array_to_slice_mut_201(&mask)); + Eurydice_arr_9d a_x_mask; + Eurydice_arr_a3 repeat_expression[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(a_x_mask.data, repeat_expression, (size_t)4U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_9d + mask_ntt = + core_array__core__clone__Clone_for__T__N___clone((size_t)4U, + &mask, + Eurydice_arr_a3, + Eurydice_arr_9d); + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&mask_ntt.data[i0]); + } + libcrux_ml_dsa_matrix_compute_matrix_x_mask_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + Eurydice_array_to_slice_shared_201(&matrix), + Eurydice_array_to_slice_shared_20(&mask_ntt), + Eurydice_array_to_slice_mut_201(&a_x_mask)); + libcrux_ml_dsa_arithmetic_decompose_vector_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA2, + Eurydice_array_to_slice_shared_20(&a_x_mask), + Eurydice_array_to_slice_mut_201(&w0), + Eurydice_array_to_slice_mut_201(&commitment)); + Eurydice_arr_ec commitment_hash_candidate = { .data = { 0U } }; + Eurydice_arr_d2 commitment_serialized = { .data = { 0U } }; + libcrux_ml_dsa_encoding_commitment_serialize_vector_37(LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_COMMITMENT_RING_ELEMENT_SIZE, + Eurydice_array_to_slice_shared_20(&commitment), + Eurydice_array_to_slice_mut_27(&commitment_serialized)); + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_27(&commitment_serialized)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_01(&commitment_hash_candidate)); + Eurydice_arr_a3 verifier_challenge = libcrux_ml_dsa_polynomial_zero_ff_37(); + libcrux_ml_dsa_sample_sample_challenge_ring_element_2e(Eurydice_array_to_slice_shared_01(&commitment_hash_candidate), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ONES_IN_VERIFIER_CHALLENGE, + &verifier_challenge); + libcrux_ml_dsa_ntt_ntt_37(&verifier_challenge); + Eurydice_arr_9d + challenge_times_s1 = + core_array__core__clone__Clone_for__T__N___clone((size_t)4U, + &s1_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_9d); + Eurydice_arr_9d + challenge_times_s2 = + core_array__core__clone__Clone_for__T__N___clone((size_t)4U, + &s2_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_9d); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_201(&challenge_times_s1), + &verifier_challenge); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_201(&challenge_times_s2), + &verifier_challenge); + libcrux_ml_dsa_matrix_add_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + Eurydice_array_to_slice_mut_201(&mask), + Eurydice_array_to_slice_shared_20(&challenge_times_s1)); + libcrux_ml_dsa_matrix_subtract_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + Eurydice_array_to_slice_mut_201(&w0), + Eurydice_array_to_slice_shared_20(&challenge_times_s2)); + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_20(&mask), + (int32_t)((uint32_t)1 << (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA1_EXPONENT) - + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_BETA) + ) + { + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_20(&w0), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA2 - LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_BETA) + ) + { + Eurydice_arr_9d + challenge_times_t0 = + core_array__core__clone__Clone_for__T__N___clone((size_t)4U, + &t0_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_9d); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_201(&challenge_times_t0), + &verifier_challenge); + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_20(&challenge_times_t0), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA2) + ) + { + libcrux_ml_dsa_matrix_add_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + Eurydice_array_to_slice_mut_201(&w0), + Eurydice_array_to_slice_shared_20(&challenge_times_t0)); + Eurydice_arr_b7 + hint_candidate = + { + .data = { + { .data = { 0U } }, + { .data = { 0U } }, + { .data = { 0U } }, + { .data = { 0U } } + } + }; + size_t + ones_in_hint = + libcrux_ml_dsa_arithmetic_make_hint_37(Eurydice_array_to_slice_shared_20(&w0), + Eurydice_array_to_slice_shared_20(&commitment), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA2, + Eurydice_array_to_slice_mut_86(&hint_candidate)); + if (!(ones_in_hint > LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_MAX_ONES_IN_HINT)) + { + attempt = LIBCRUX_ML_DSA_CONSTANTS_REJECTION_SAMPLE_BOUND_SIGN; + commitment_hash0 = + ( + KRML_CLITERAL(core_option_Option_14){ + .tag = core_option_Some, + .f0 = commitment_hash_candidate + } + ); + signer_response0 = + (KRML_CLITERAL(core_option_Option_d9){ .tag = core_option_Some, .f0 = mask }); + hint0 = + ( + KRML_CLITERAL(core_option_Option_51){ + .tag = core_option_Some, + .f0 = hint_candidate + } + ); + } + } + } + } + } + core_result_Result_53 uu____5; + if (commitment_hash0.tag == core_option_None) + { + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + else + { + Eurydice_arr_ec commitment_hash = commitment_hash0.f0; + Eurydice_arr_ec commitment_hash1 = commitment_hash; + if (signer_response0.tag == core_option_None) + { + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + else + { + Eurydice_arr_9d signer_response = signer_response0.f0; + Eurydice_arr_9d signer_response1 = signer_response; + if (!(hint0.tag == core_option_None)) + { + Eurydice_arr_b7 hint = hint0.f0; + Eurydice_arr_b7 hint1 = hint; + libcrux_ml_dsa_encoding_signature_serialize_37(Eurydice_array_to_slice_shared_01(&commitment_hash1), + Eurydice_array_to_slice_shared_20(&signer_response1), + Eurydice_array_to_slice_shared_86(&hint1), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COMMITMENT_HASH_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA1_EXPONENT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_GAMMA1_RING_ELEMENT_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_MAX_ONES_IN_HINT, + Eurydice_array_to_slice_mut_0d(signature)); + return (KRML_CLITERAL(core_result_Result_53){ .tag = core_result_Ok }); + } + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + } + return uu____5; +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.sign_mut +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_mut_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_85 *signature +) +{ + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + (KRML_CLITERAL(core_option_Option_57){ .tag = core_option_None })); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_internal_5a(signing_key, + message, + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + randomness, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.sign +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_48 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_85 signature = libcrux_ml_dsa_types_zero_c5_37(); + core_result_Result_53 + uu____0 = + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_mut_5a(signing_key, + message, + context, + randomness, + &signature); + core_result_Result_48 uu____1; + if (uu____0.tag == core_result_Ok) + { + uu____1 = + ( + KRML_CLITERAL(core_result_Result_48){ + .tag = core_result_Ok, + .val = { .case_Ok = signature } + } + ); + } + else + { + libcrux_ml_dsa_types_SigningError e = uu____0.f0; + uu____1 = + (KRML_CLITERAL(core_result_Result_48){ .tag = core_result_Err, .val = { .case_Err = e } }); + } + return uu____1; +} + +/** + Sign. +*/ +static inline core_result_Result_48 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_sign( + const Eurydice_arr_10 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_5a(Eurydice_array_to_slice_shared_34(signing_key), + message, + context, + randomness); +} + +/** + Sign. +*/ +static inline core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_sign_mut( + const Eurydice_arr_10 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_85 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_mut_5a(Eurydice_array_to_slice_shared_34(signing_key), + message, + context, + randomness, + signature); +} + +/** +This function found in impl {libcrux_ml_dsa::pre_hash::PreHash for libcrux_ml_dsa::pre_hash::SHAKE128_PH} +*/ +/** +A monomorphic instance of libcrux_ml_dsa.pre_hash.hash_30 +with types libcrux_ml_dsa_hash_functions_portable_Shake128 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_pre_hash_hash_30_83( + Eurydice_borrow_slice_u8 message, + Eurydice_mut_borrow_slice_u8 output +) +{ + libcrux_ml_dsa_hash_functions_portable_shake128_7b(message, output); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.sign_pre_hashed_mut +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_pre_hashed_mut_3f( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness, + Eurydice_arr_85 *signature +) +{ + if (!(context.meta > LIBCRUX_ML_DSA_CONSTANTS_CONTEXT_MAX_LEN)) + { + libcrux_ml_dsa_pre_hash_hash_30_83(message, pre_hash_buffer); + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + ( + KRML_CLITERAL(core_option_Option_57){ + .tag = core_option_Some, + .f0 = libcrux_ml_dsa_pre_hash_oid_30() + } + )); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_internal_5a(signing_key, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = pre_hash_buffer.ptr, + .meta = pre_hash_buffer.meta + } + ), + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + randomness, + signature); + } + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.sign_pre_hashed +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_48 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_pre_hashed_3f( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_85 signature = libcrux_ml_dsa_types_zero_c5_37(); + core_result_Result_53 + uu____0 = + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_pre_hashed_mut_3f(signing_key, + message, + context, + pre_hash_buffer, + randomness, + &signature); + core_result_Result_48 uu____1; + if (uu____0.tag == core_result_Ok) + { + uu____1 = + ( + KRML_CLITERAL(core_result_Result_48){ + .tag = core_result_Ok, + .val = { .case_Ok = signature } + } + ); + } + else + { + libcrux_ml_dsa_types_SigningError e = uu____0.f0; + uu____1 = + (KRML_CLITERAL(core_result_Result_48){ .tag = core_result_Err, .val = { .case_Err = e } }); + } + return uu____1; +} + +/** + Sign (pre-hashed). +*/ +static inline core_result_Result_48 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_sign_pre_hashed_shake128( + const Eurydice_arr_10 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_sign_pre_hashed_3f(Eurydice_array_to_slice_shared_34(signing_key), + message, + context, + pre_hash_buffer, + randomness); +} + +/** + The internal verification API. + + If no `domain_separation_context` is supplied, it is assumed that + `message` already contains the domain separation. +*/ +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.verify_internal +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_verify_internal_5a( + const Eurydice_arr_02 *verification_key, + Eurydice_borrow_slice_u8 message, + core_option_Option_84 domain_separation_context, + const Eurydice_arr_85 *signature_serialized +) +{ + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_9f(verification_key), + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 t1_serialized = uu____0.snd; + Eurydice_arr_9d t1; + Eurydice_arr_a3 repeat_expression0[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t1.data, repeat_expression0, (size_t)4U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_encoding_verification_key_deserialize_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_VERIFICATION_KEY_SIZE, + t1_serialized, + Eurydice_array_to_slice_mut_201(&t1)); + Eurydice_arr_ec deserialized_commitment_hash = { .data = { 0U } }; + Eurydice_arr_9d deserialized_signer_response; + Eurydice_arr_a3 repeat_expression1[4U]; + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(deserialized_signer_response.data, + repeat_expression1, + (size_t)4U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_b7 + deserialized_hint = + { .data = { { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } } }; + core_result_Result_41 + uu____1 = + libcrux_ml_dsa_encoding_signature_deserialize_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COMMITMENT_HASH_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA1_EXPONENT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_GAMMA1_RING_ELEMENT_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_MAX_ONES_IN_HINT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_SIGNATURE_SIZE, + Eurydice_array_to_slice_shared_0d(signature_serialized), + Eurydice_array_to_slice_mut_01(&deserialized_commitment_hash), + Eurydice_array_to_slice_mut_201(&deserialized_signer_response), + Eurydice_array_to_slice_mut_86(&deserialized_hint)); + core_result_Result_41 uu____2; + if (uu____1.tag == core_result_Ok) + { + if + ( + libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_20(&deserialized_signer_response), + (int32_t)((uint32_t)1 << (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA1_EXPONENT) - + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_BETA) + ) + { + uu____2 = + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_SignerResponseExceedsBoundError + } + ); + } + else + { + Eurydice_arr_2f matrix; + Eurydice_arr_a3 repeat_expression[16U]; + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(matrix.data, repeat_expression, (size_t)16U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_200(&matrix)); + Eurydice_arr_c7 verification_key_hash = { .data = { 0U } }; + libcrux_ml_dsa_hash_functions_portable_shake256_61_c9(Eurydice_array_to_slice_shared_9f(verification_key), + &verification_key_hash); + Eurydice_arr_c7 message_representative = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_derive_message_representative_43(Eurydice_array_to_slice_shared_17(&verification_key_hash), + &domain_separation_context, + message, + &message_representative); + Eurydice_arr_a3 verifier_challenge = libcrux_ml_dsa_polynomial_zero_ff_37(); + libcrux_ml_dsa_sample_sample_challenge_ring_element_2e(Eurydice_array_to_slice_shared_01(&deserialized_commitment_hash), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ONES_IN_VERIFIER_CHALLENGE, + &verifier_challenge); + libcrux_ml_dsa_ntt_ntt_37(&verifier_challenge); + for (size_t i = (size_t)0U; i < (size_t)4U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&deserialized_signer_response.data[i0]); + } + libcrux_ml_dsa_matrix_compute_w_approx_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_COLUMNS_IN_A, + Eurydice_array_to_slice_shared_201(&matrix), + Eurydice_array_to_slice_shared_20(&deserialized_signer_response), + &verifier_challenge, + Eurydice_array_to_slice_mut_201(&t1)); + Eurydice_arr_ec recomputed_commitment_hash = { .data = { 0U } }; + libcrux_ml_dsa_arithmetic_use_hint_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_44_GAMMA2, + Eurydice_array_to_slice_shared_86(&deserialized_hint), + Eurydice_array_to_slice_mut_201(&t1)); + Eurydice_arr_d2 commitment_serialized = { .data = { 0U } }; + libcrux_ml_dsa_encoding_commitment_serialize_vector_37(LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_44_COMMITMENT_RING_ELEMENT_SIZE, + Eurydice_array_to_slice_shared_20(&t1), + Eurydice_array_to_slice_mut_27(&commitment_serialized)); + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_27(&commitment_serialized)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_01(&recomputed_commitment_hash)); + if + ( + Eurydice_array_eq((size_t)32U, + &deserialized_commitment_hash, + &recomputed_commitment_hash, + uint8_t) + ) + { + uu____2 = (KRML_CLITERAL(core_result_Result_41){ .tag = core_result_Ok }); + } + else + { + uu____2 = + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_CommitmentHashesDontMatchError + } + ); + } + } + } + else + { + libcrux_ml_dsa_types_VerificationError e = uu____1.f0; + uu____2 = (KRML_CLITERAL(core_result_Result_41){ .tag = core_result_Err, .f0 = e }); + } + return uu____2; +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.verify +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_verify_5a( + const Eurydice_arr_02 *verification_key_serialized, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_85 *signature_serialized +) +{ + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + (KRML_CLITERAL(core_option_Option_57){ .tag = core_option_None })); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_VerificationContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_verify_internal_5a(verification_key_serialized, + message, + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + signature_serialized); +} + +/** + Verify. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_verify( + const Eurydice_arr_02 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_85 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_verify_5a(verification_key, + message, + context, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_44.verify_pre_hashed +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_verify_pre_hashed_3f( + const Eurydice_arr_02 *verification_key_serialized, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + const Eurydice_arr_85 *signature_serialized +) +{ + libcrux_ml_dsa_pre_hash_hash_30_83(message, pre_hash_buffer); + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + ( + KRML_CLITERAL(core_option_Option_57){ + .tag = core_option_Some, + .f0 = libcrux_ml_dsa_pre_hash_oid_30() + } + )); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_VerificationContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_verify_internal_5a(verification_key_serialized, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = pre_hash_buffer.ptr, + .meta = pre_hash_buffer.meta + } + ), + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + signature_serialized); +} + +/** + Verify (pre-hashed with SHAKE-128). +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_verify_pre_hashed_shake128( + const Eurydice_arr_02 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + const Eurydice_arr_85 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_verify_pre_hashed_3f(verification_key, + message, + context, + pre_hash_buffer, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.generate_key_pair +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_generate_key_pair_5a( + Eurydice_arr_ec randomness, + Eurydice_mut_borrow_slice_u8 signing_key, + Eurydice_mut_borrow_slice_u8 verification_key +) +{ + Eurydice_arr_89 seed_expanded0 = { .data = { 0U } }; + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_01(&randomness)); + /* original Rust expression is not an lvalue in C */ + Eurydice_array_u8x2 + lvalue = + { + .data = { + (uint8_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + (uint8_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A + } + }; + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_82(&lvalue)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_78(&seed_expanded0)); + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_78(&seed_expanded0), + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 seed_expanded = uu____0.snd; + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(seed_expanded, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_ERROR_VECTORS_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_error_vectors = uu____1.fst; + Eurydice_borrow_slice_u8 seed_for_signing = uu____1.snd; + Eurydice_arr_47 s1_s2; + Eurydice_arr_a3 repeat_expression0[11U]; + for (size_t i = (size_t)0U; i < (size_t)11U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_s2.data, repeat_expression0, (size_t)11U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_sample_s1_and_s2_29(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ETA, + seed_for_error_vectors, + Eurydice_array_to_slice_mut_202(&s1_s2)); + Eurydice_arr_dc1 t0; + Eurydice_arr_a3 repeat_expression1[6U]; + for (size_t i = (size_t)0U; i < (size_t)6U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t0.data, repeat_expression1, (size_t)6U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_5a a_as_ntt; + Eurydice_arr_a3 repeat_expression2[30U]; + for (size_t i = (size_t)0U; i < (size_t)30U; i++) + { + repeat_expression2[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(a_as_ntt.data, repeat_expression2, (size_t)30U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_203(&a_as_ntt)); + Eurydice_arr_5d s1_ntt; + Eurydice_arr_a3 repeat_expression3[5U]; + for (size_t i = (size_t)0U; i < (size_t)5U; i++) + { + repeat_expression3[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_ntt.data, repeat_expression3, (size_t)5U * sizeof (Eurydice_arr_a3)); + Eurydice_slice_copy(Eurydice_array_to_slice_mut_204(&s1_ntt), + Eurydice_array_to_subslice_shared_250(&s1_s2, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A + } + )), + Eurydice_arr_a3); + for (size_t i = (size_t)0U; i < (size_t)5U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&s1_ntt.data[i0]); + } + libcrux_ml_dsa_matrix_compute_as1_plus_s2_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + Eurydice_array_to_slice_mut_203(&a_as_ntt), + Eurydice_array_to_slice_shared_202(&s1_ntt), + Eurydice_array_to_slice_shared_203(&s1_s2), + Eurydice_array_to_slice_mut_205(&t0)); + Eurydice_arr_dc1 t1; + Eurydice_arr_a3 repeat_expression[6U]; + for (size_t i = (size_t)0U; i < (size_t)6U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t1.data, repeat_expression, (size_t)6U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_arithmetic_power2round_vector_37(Eurydice_array_to_slice_mut_205(&t0), + Eurydice_array_to_slice_mut_205(&t1)); + libcrux_ml_dsa_encoding_verification_key_generate_serialized_37(seed_for_a, + Eurydice_array_to_slice_shared_204(&t1), + verification_key); + libcrux_ml_dsa_encoding_signing_key_generate_serialized_2e(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ERROR_RING_ELEMENT_SIZE, + seed_for_a, + seed_for_signing, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = verification_key.ptr, + .meta = verification_key.meta + } + ), + Eurydice_array_to_slice_shared_203(&s1_s2), + Eurydice_array_to_slice_shared_204(&t0), + signing_key); +} + +/** + Generate key pair. +*/ +static inline void +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_generate_key_pair( + Eurydice_arr_ec randomness, + Eurydice_arr_24 *signing_key, + Eurydice_arr_29 *verification_key +) +{ + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_generate_key_pair_5a(randomness, + Eurydice_array_to_slice_mut_98(signing_key), + Eurydice_array_to_slice_mut_37(verification_key)); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.sign_internal +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_internal_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + core_option_Option_84 domain_separation_context, + Eurydice_arr_ec randomness, + Eurydice_arr_0c *signature +) +{ + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(signing_key, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 remaining_serialized0 = uu____0.snd; + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(remaining_serialized0, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_SIGNING_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_signing = uu____1.fst; + Eurydice_borrow_slice_u8 remaining_serialized1 = uu____1.snd; + Eurydice_borrow_slice_u8_x2 + uu____2 = + Eurydice_slice_split_at(remaining_serialized1, + LIBCRUX_ML_DSA_CONSTANTS_BYTES_FOR_VERIFICATION_KEY_HASH, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 verification_key_hash = uu____2.fst; + Eurydice_borrow_slice_u8 remaining_serialized2 = uu____2.snd; + Eurydice_borrow_slice_u8_x2 + uu____3 = + Eurydice_slice_split_at(remaining_serialized2, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ERROR_RING_ELEMENT_SIZE * + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 s1_serialized = uu____3.fst; + Eurydice_borrow_slice_u8 remaining_serialized = uu____3.snd; + Eurydice_borrow_slice_u8_x2 + uu____4 = + Eurydice_slice_split_at(remaining_serialized, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ERROR_RING_ELEMENT_SIZE * + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 s2_serialized = uu____4.fst; + Eurydice_borrow_slice_u8 t0_serialized = uu____4.snd; + Eurydice_arr_5d s1_as_ntt; + Eurydice_arr_a3 repeat_expression0[5U]; + for (size_t i = (size_t)0U; i < (size_t)5U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_as_ntt.data, repeat_expression0, (size_t)5U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_dc1 s2_as_ntt; + Eurydice_arr_a3 repeat_expression1[6U]; + for (size_t i = (size_t)0U; i < (size_t)6U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s2_as_ntt.data, repeat_expression1, (size_t)6U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_dc1 t0_as_ntt; + Eurydice_arr_a3 repeat_expression2[6U]; + for (size_t i = (size_t)0U; i < (size_t)6U; i++) + { + repeat_expression2[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t0_as_ntt.data, repeat_expression2, (size_t)6U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_encoding_error_deserialize_to_vector_then_ntt_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ERROR_RING_ELEMENT_SIZE, + s1_serialized, + Eurydice_array_to_slice_mut_204(&s1_as_ntt)); + libcrux_ml_dsa_encoding_error_deserialize_to_vector_then_ntt_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_ERROR_RING_ELEMENT_SIZE, + s2_serialized, + Eurydice_array_to_slice_mut_205(&s2_as_ntt)); + libcrux_ml_dsa_encoding_t0_deserialize_to_vector_then_ntt_37(t0_serialized, + Eurydice_array_to_slice_mut_205(&t0_as_ntt)); + Eurydice_arr_5a matrix; + Eurydice_arr_a3 repeat_expression3[30U]; + for (size_t i = (size_t)0U; i < (size_t)30U; i++) + { + repeat_expression3[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(matrix.data, repeat_expression3, (size_t)30U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_203(&matrix)); + Eurydice_arr_c7 message_representative = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_derive_message_representative_43(verification_key_hash, + &domain_separation_context, + message, + &message_representative); + Eurydice_arr_c7 mask_seed = { .data = { 0U } }; + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake0 = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake0, seed_for_signing); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake0, + Eurydice_array_to_slice_shared_01(&randomness)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake0, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake0, + Eurydice_array_to_slice_mut_17(&mask_seed)); + uint16_t domain_separator_for_mask = 0U; + size_t attempt = (size_t)0U; + core_option_Option_81 commitment_hash0 = { .tag = core_option_None }; + core_option_Option_1e signer_response0 = { .tag = core_option_None }; + core_option_Option_05 hint0 = { .tag = core_option_None }; + while (attempt < LIBCRUX_ML_DSA_CONSTANTS_REJECTION_SAMPLE_BOUND_SIGN) + { + attempt++; + Eurydice_arr_5d mask; + Eurydice_arr_a3 repeat_expression4[5U]; + for (size_t i = (size_t)0U; i < (size_t)5U; i++) + { + repeat_expression4[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(mask.data, repeat_expression4, (size_t)5U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_dc1 w0; + Eurydice_arr_a3 repeat_expression5[6U]; + for (size_t i = (size_t)0U; i < (size_t)6U; i++) + { + repeat_expression5[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(w0.data, repeat_expression5, (size_t)6U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_dc1 commitment; + Eurydice_arr_a3 repeat_expression6[6U]; + for (size_t i = (size_t)0U; i < (size_t)6U; i++) + { + repeat_expression6[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(commitment.data, repeat_expression6, (size_t)6U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_sample_sample_mask_vector_67(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA1_EXPONENT, + &mask_seed, + &domain_separator_for_mask, + Eurydice_array_to_slice_mut_204(&mask)); + Eurydice_arr_dc1 a_x_mask; + Eurydice_arr_a3 repeat_expression[6U]; + for (size_t i = (size_t)0U; i < (size_t)6U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(a_x_mask.data, repeat_expression, (size_t)6U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_5d + mask_ntt = + core_array__core__clone__Clone_for__T__N___clone((size_t)5U, + &mask, + Eurydice_arr_a3, + Eurydice_arr_5d); + for (size_t i = (size_t)0U; i < (size_t)5U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&mask_ntt.data[i0]); + } + libcrux_ml_dsa_matrix_compute_matrix_x_mask_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + Eurydice_array_to_slice_shared_205(&matrix), + Eurydice_array_to_slice_shared_202(&mask_ntt), + Eurydice_array_to_slice_mut_205(&a_x_mask)); + libcrux_ml_dsa_arithmetic_decompose_vector_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA2, + Eurydice_array_to_slice_shared_204(&a_x_mask), + Eurydice_array_to_slice_mut_205(&w0), + Eurydice_array_to_slice_mut_205(&commitment)); + Eurydice_arr_65 commitment_hash_candidate = { .data = { 0U } }; + Eurydice_arr_d2 commitment_serialized = { .data = { 0U } }; + libcrux_ml_dsa_encoding_commitment_serialize_vector_37(LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_COMMITMENT_RING_ELEMENT_SIZE, + Eurydice_array_to_slice_shared_204(&commitment), + Eurydice_array_to_slice_mut_27(&commitment_serialized)); + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_27(&commitment_serialized)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_9f(&commitment_hash_candidate)); + Eurydice_arr_a3 verifier_challenge = libcrux_ml_dsa_polynomial_zero_ff_37(); + libcrux_ml_dsa_sample_sample_challenge_ring_element_2e(Eurydice_array_to_slice_shared_9f0(&commitment_hash_candidate), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ONES_IN_VERIFIER_CHALLENGE, + &verifier_challenge); + libcrux_ml_dsa_ntt_ntt_37(&verifier_challenge); + Eurydice_arr_5d + challenge_times_s1 = + core_array__core__clone__Clone_for__T__N___clone((size_t)5U, + &s1_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_5d); + Eurydice_arr_dc1 + challenge_times_s2 = + core_array__core__clone__Clone_for__T__N___clone((size_t)6U, + &s2_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_dc1); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_204(&challenge_times_s1), + &verifier_challenge); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_205(&challenge_times_s2), + &verifier_challenge); + libcrux_ml_dsa_matrix_add_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + Eurydice_array_to_slice_mut_204(&mask), + Eurydice_array_to_slice_shared_202(&challenge_times_s1)); + libcrux_ml_dsa_matrix_subtract_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + Eurydice_array_to_slice_mut_205(&w0), + Eurydice_array_to_slice_shared_204(&challenge_times_s2)); + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_202(&mask), + (int32_t)((uint32_t)1 << (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA1_EXPONENT) - + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_BETA) + ) + { + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_204(&w0), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA2 - LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_BETA) + ) + { + Eurydice_arr_dc1 + challenge_times_t0 = + core_array__core__clone__Clone_for__T__N___clone((size_t)6U, + &t0_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_dc1); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_205(&challenge_times_t0), + &verifier_challenge); + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_204(&challenge_times_t0), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA2) + ) + { + libcrux_ml_dsa_matrix_add_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + Eurydice_array_to_slice_mut_205(&w0), + Eurydice_array_to_slice_shared_204(&challenge_times_t0)); + Eurydice_arr_5d0 + hint_candidate = + { + .data = { + { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, + { .data = { 0U } }, { .data = { 0U } } + } + }; + size_t + ones_in_hint = + libcrux_ml_dsa_arithmetic_make_hint_37(Eurydice_array_to_slice_shared_204(&w0), + Eurydice_array_to_slice_shared_204(&commitment), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA2, + Eurydice_array_to_slice_mut_860(&hint_candidate)); + if (!(ones_in_hint > LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_MAX_ONES_IN_HINT)) + { + attempt = LIBCRUX_ML_DSA_CONSTANTS_REJECTION_SAMPLE_BOUND_SIGN; + commitment_hash0 = + ( + KRML_CLITERAL(core_option_Option_81){ + .tag = core_option_Some, + .f0 = commitment_hash_candidate + } + ); + signer_response0 = + (KRML_CLITERAL(core_option_Option_1e){ .tag = core_option_Some, .f0 = mask }); + hint0 = + ( + KRML_CLITERAL(core_option_Option_05){ + .tag = core_option_Some, + .f0 = hint_candidate + } + ); + } + } + } + } + } + core_result_Result_53 uu____5; + if (commitment_hash0.tag == core_option_None) + { + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + else + { + Eurydice_arr_65 commitment_hash = commitment_hash0.f0; + Eurydice_arr_65 commitment_hash1 = commitment_hash; + if (signer_response0.tag == core_option_None) + { + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + else + { + Eurydice_arr_5d signer_response = signer_response0.f0; + Eurydice_arr_5d signer_response1 = signer_response; + if (!(hint0.tag == core_option_None)) + { + Eurydice_arr_5d0 hint = hint0.f0; + Eurydice_arr_5d0 hint1 = hint; + libcrux_ml_dsa_encoding_signature_serialize_37(Eurydice_array_to_slice_shared_9f0(&commitment_hash1), + Eurydice_array_to_slice_shared_202(&signer_response1), + Eurydice_array_to_slice_shared_860(&hint1), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COMMITMENT_HASH_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA1_EXPONENT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_GAMMA1_RING_ELEMENT_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_MAX_ONES_IN_HINT, + Eurydice_array_to_slice_mut_6b(signature)); + return (KRML_CLITERAL(core_result_Result_53){ .tag = core_result_Ok }); + } + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + } + return uu____5; +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.sign_mut +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_mut_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_0c *signature +) +{ + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + (KRML_CLITERAL(core_option_Option_57){ .tag = core_option_None })); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_internal_5a(signing_key, + message, + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + randomness, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.sign +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_8c +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_0c signature = libcrux_ml_dsa_types_zero_c5_5c(); + core_result_Result_53 + uu____0 = + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_mut_5a(signing_key, + message, + context, + randomness, + &signature); + core_result_Result_8c uu____1; + if (uu____0.tag == core_result_Ok) + { + uu____1 = + ( + KRML_CLITERAL(core_result_Result_8c){ + .tag = core_result_Ok, + .val = { .case_Ok = signature } + } + ); + } + else + { + libcrux_ml_dsa_types_SigningError e = uu____0.f0; + uu____1 = + (KRML_CLITERAL(core_result_Result_8c){ .tag = core_result_Err, .val = { .case_Err = e } }); + } + return uu____1; +} + +/** + Sign. +*/ +static inline core_result_Result_8c +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_sign( + const Eurydice_arr_24 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_5a(Eurydice_array_to_slice_shared_98(signing_key), + message, + context, + randomness); +} + +/** + Sign. +*/ +static inline core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_sign_mut( + const Eurydice_arr_24 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_0c *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_mut_5a(Eurydice_array_to_slice_shared_98(signing_key), + message, + context, + randomness, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.sign_pre_hashed_mut +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_pre_hashed_mut_3f( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness, + Eurydice_arr_0c *signature +) +{ + if (!(context.meta > LIBCRUX_ML_DSA_CONSTANTS_CONTEXT_MAX_LEN)) + { + libcrux_ml_dsa_pre_hash_hash_30_83(message, pre_hash_buffer); + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + ( + KRML_CLITERAL(core_option_Option_57){ + .tag = core_option_Some, + .f0 = libcrux_ml_dsa_pre_hash_oid_30() + } + )); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_internal_5a(signing_key, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = pre_hash_buffer.ptr, + .meta = pre_hash_buffer.meta + } + ), + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + randomness, + signature); + } + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.sign_pre_hashed +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_8c +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_pre_hashed_3f( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_0c signature = libcrux_ml_dsa_types_zero_c5_5c(); + core_result_Result_53 + uu____0 = + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_pre_hashed_mut_3f(signing_key, + message, + context, + pre_hash_buffer, + randomness, + &signature); + core_result_Result_8c uu____1; + if (uu____0.tag == core_result_Ok) + { + uu____1 = + ( + KRML_CLITERAL(core_result_Result_8c){ + .tag = core_result_Ok, + .val = { .case_Ok = signature } + } + ); + } + else + { + libcrux_ml_dsa_types_SigningError e = uu____0.f0; + uu____1 = + (KRML_CLITERAL(core_result_Result_8c){ .tag = core_result_Err, .val = { .case_Err = e } }); + } + return uu____1; +} + +/** + Sign (pre-hashed). +*/ +static inline core_result_Result_8c +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_sign_pre_hashed_shake128( + const Eurydice_arr_24 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_sign_pre_hashed_3f(Eurydice_array_to_slice_shared_98(signing_key), + message, + context, + pre_hash_buffer, + randomness); +} + +/** + The internal verification API. + + If no `domain_separation_context` is supplied, it is assumed that + `message` already contains the domain separation. +*/ +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.verify_internal +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_verify_internal_5a( + const Eurydice_arr_29 *verification_key, + Eurydice_borrow_slice_u8 message, + core_option_Option_84 domain_separation_context, + const Eurydice_arr_0c *signature_serialized +) +{ + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_37(verification_key), + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 t1_serialized = uu____0.snd; + Eurydice_arr_dc1 t1; + Eurydice_arr_a3 repeat_expression0[6U]; + for (size_t i = (size_t)0U; i < (size_t)6U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t1.data, repeat_expression0, (size_t)6U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_encoding_verification_key_deserialize_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_VERIFICATION_KEY_SIZE, + t1_serialized, + Eurydice_array_to_slice_mut_205(&t1)); + Eurydice_arr_65 deserialized_commitment_hash = { .data = { 0U } }; + Eurydice_arr_5d deserialized_signer_response; + Eurydice_arr_a3 repeat_expression1[5U]; + for (size_t i = (size_t)0U; i < (size_t)5U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(deserialized_signer_response.data, + repeat_expression1, + (size_t)5U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_5d0 + deserialized_hint = + { + .data = { + { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, + { .data = { 0U } }, { .data = { 0U } } + } + }; + core_result_Result_41 + uu____1 = + libcrux_ml_dsa_encoding_signature_deserialize_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COMMITMENT_HASH_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA1_EXPONENT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_GAMMA1_RING_ELEMENT_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_MAX_ONES_IN_HINT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_SIGNATURE_SIZE, + Eurydice_array_to_slice_shared_6b(signature_serialized), + Eurydice_array_to_slice_mut_9f(&deserialized_commitment_hash), + Eurydice_array_to_slice_mut_204(&deserialized_signer_response), + Eurydice_array_to_slice_mut_860(&deserialized_hint)); + core_result_Result_41 uu____2; + if (uu____1.tag == core_result_Ok) + { + if + ( + libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_202(&deserialized_signer_response), + (int32_t)((uint32_t)1 << (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA1_EXPONENT) - + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_BETA) + ) + { + uu____2 = + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_SignerResponseExceedsBoundError + } + ); + } + else + { + Eurydice_arr_5a matrix; + Eurydice_arr_a3 repeat_expression[30U]; + for (size_t i = (size_t)0U; i < (size_t)30U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(matrix.data, repeat_expression, (size_t)30U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_203(&matrix)); + Eurydice_arr_c7 verification_key_hash = { .data = { 0U } }; + libcrux_ml_dsa_hash_functions_portable_shake256_61_c9(Eurydice_array_to_slice_shared_37(verification_key), + &verification_key_hash); + Eurydice_arr_c7 message_representative = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_derive_message_representative_43(Eurydice_array_to_slice_shared_17(&verification_key_hash), + &domain_separation_context, + message, + &message_representative); + Eurydice_arr_a3 verifier_challenge = libcrux_ml_dsa_polynomial_zero_ff_37(); + libcrux_ml_dsa_sample_sample_challenge_ring_element_2e(Eurydice_array_to_slice_shared_9f0(&deserialized_commitment_hash), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ONES_IN_VERIFIER_CHALLENGE, + &verifier_challenge); + libcrux_ml_dsa_ntt_ntt_37(&verifier_challenge); + for (size_t i = (size_t)0U; i < (size_t)5U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&deserialized_signer_response.data[i0]); + } + libcrux_ml_dsa_matrix_compute_w_approx_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_COLUMNS_IN_A, + Eurydice_array_to_slice_shared_205(&matrix), + Eurydice_array_to_slice_shared_202(&deserialized_signer_response), + &verifier_challenge, + Eurydice_array_to_slice_mut_205(&t1)); + Eurydice_arr_65 recomputed_commitment_hash = { .data = { 0U } }; + libcrux_ml_dsa_arithmetic_use_hint_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_65_GAMMA2, + Eurydice_array_to_slice_shared_860(&deserialized_hint), + Eurydice_array_to_slice_mut_205(&t1)); + Eurydice_arr_d2 commitment_serialized = { .data = { 0U } }; + libcrux_ml_dsa_encoding_commitment_serialize_vector_37(LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_65_COMMITMENT_RING_ELEMENT_SIZE, + Eurydice_array_to_slice_shared_204(&t1), + Eurydice_array_to_slice_mut_27(&commitment_serialized)); + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_27(&commitment_serialized)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_9f(&recomputed_commitment_hash)); + if + ( + Eurydice_array_eq((size_t)48U, + &deserialized_commitment_hash, + &recomputed_commitment_hash, + uint8_t) + ) + { + uu____2 = (KRML_CLITERAL(core_result_Result_41){ .tag = core_result_Ok }); + } + else + { + uu____2 = + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_CommitmentHashesDontMatchError + } + ); + } + } + } + else + { + libcrux_ml_dsa_types_VerificationError e = uu____1.f0; + uu____2 = (KRML_CLITERAL(core_result_Result_41){ .tag = core_result_Err, .f0 = e }); + } + return uu____2; +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.verify +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_verify_5a( + const Eurydice_arr_29 *verification_key_serialized, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_0c *signature_serialized +) +{ + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + (KRML_CLITERAL(core_option_Option_57){ .tag = core_option_None })); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_VerificationContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_verify_internal_5a(verification_key_serialized, + message, + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + signature_serialized); +} + +/** + Verify. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_verify( + const Eurydice_arr_29 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_0c *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_verify_5a(verification_key, + message, + context, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_65.verify_pre_hashed +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_verify_pre_hashed_3f( + const Eurydice_arr_29 *verification_key_serialized, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + const Eurydice_arr_0c *signature_serialized +) +{ + libcrux_ml_dsa_pre_hash_hash_30_83(message, pre_hash_buffer); + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + ( + KRML_CLITERAL(core_option_Option_57){ + .tag = core_option_Some, + .f0 = libcrux_ml_dsa_pre_hash_oid_30() + } + )); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_VerificationContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_verify_internal_5a(verification_key_serialized, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = pre_hash_buffer.ptr, + .meta = pre_hash_buffer.meta + } + ), + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + signature_serialized); +} + +/** + Verify (pre-hashed with SHAKE-128). +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_verify_pre_hashed_shake128( + const Eurydice_arr_29 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + const Eurydice_arr_0c *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_verify_pre_hashed_3f(verification_key, + message, + context, + pre_hash_buffer, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.generate_key_pair +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_generate_key_pair_5a( + Eurydice_arr_ec randomness, + Eurydice_mut_borrow_slice_u8 signing_key, + Eurydice_mut_borrow_slice_u8 verification_key +) +{ + Eurydice_arr_89 seed_expanded0 = { .data = { 0U } }; + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_01(&randomness)); + /* original Rust expression is not an lvalue in C */ + Eurydice_array_u8x2 + lvalue = + { + .data = { + (uint8_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + (uint8_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A + } + }; + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_82(&lvalue)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_78(&seed_expanded0)); + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_78(&seed_expanded0), + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 seed_expanded = uu____0.snd; + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(seed_expanded, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_ERROR_VECTORS_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_error_vectors = uu____1.fst; + Eurydice_borrow_slice_u8 seed_for_signing = uu____1.snd; + Eurydice_arr_92 s1_s2; + Eurydice_arr_a3 repeat_expression0[15U]; + for (size_t i = (size_t)0U; i < (size_t)15U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_s2.data, repeat_expression0, (size_t)15U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_sample_s1_and_s2_29(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ETA, + seed_for_error_vectors, + Eurydice_array_to_slice_mut_206(&s1_s2)); + Eurydice_arr_8f t0; + Eurydice_arr_a3 repeat_expression1[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t0.data, repeat_expression1, (size_t)8U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_0f a_as_ntt; + Eurydice_arr_a3 repeat_expression2[56U]; + for (size_t i = (size_t)0U; i < (size_t)56U; i++) + { + repeat_expression2[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(a_as_ntt.data, repeat_expression2, (size_t)56U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_207(&a_as_ntt)); + Eurydice_arr_bb s1_ntt; + Eurydice_arr_a3 repeat_expression3[7U]; + for (size_t i = (size_t)0U; i < (size_t)7U; i++) + { + repeat_expression3[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_ntt.data, repeat_expression3, (size_t)7U * sizeof (Eurydice_arr_a3)); + Eurydice_slice_copy(Eurydice_array_to_slice_mut_208(&s1_ntt), + Eurydice_array_to_subslice_shared_251(&s1_s2, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A + } + )), + Eurydice_arr_a3); + for (size_t i = (size_t)0U; i < (size_t)7U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&s1_ntt.data[i0]); + } + libcrux_ml_dsa_matrix_compute_as1_plus_s2_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + Eurydice_array_to_slice_mut_207(&a_as_ntt), + Eurydice_array_to_slice_shared_206(&s1_ntt), + Eurydice_array_to_slice_shared_207(&s1_s2), + Eurydice_array_to_slice_mut_20(&t0)); + Eurydice_arr_8f t1; + Eurydice_arr_a3 repeat_expression[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t1.data, repeat_expression, (size_t)8U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_arithmetic_power2round_vector_37(Eurydice_array_to_slice_mut_20(&t0), + Eurydice_array_to_slice_mut_20(&t1)); + libcrux_ml_dsa_encoding_verification_key_generate_serialized_37(seed_for_a, + Eurydice_array_to_slice_shared_200(&t1), + verification_key); + libcrux_ml_dsa_encoding_signing_key_generate_serialized_2e(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ERROR_RING_ELEMENT_SIZE, + seed_for_a, + seed_for_signing, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = verification_key.ptr, + .meta = verification_key.meta + } + ), + Eurydice_array_to_slice_shared_207(&s1_s2), + Eurydice_array_to_slice_shared_200(&t0), + signing_key); +} + +/** + Generate key pair. +*/ +static inline void +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_generate_key_pair( + Eurydice_arr_ec randomness, + Eurydice_arr_e2 *signing_key, + Eurydice_arr_43 *verification_key +) +{ + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_generate_key_pair_5a(randomness, + Eurydice_array_to_slice_mut_f7(signing_key), + Eurydice_array_to_slice_mut_fc(verification_key)); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.sign_internal +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_internal_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + core_option_Option_84 domain_separation_context, + Eurydice_arr_ec randomness, + Eurydice_arr_93 *signature +) +{ + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(signing_key, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 remaining_serialized0 = uu____0.snd; + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(remaining_serialized0, + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_SIGNING_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_signing = uu____1.fst; + Eurydice_borrow_slice_u8 remaining_serialized1 = uu____1.snd; + Eurydice_borrow_slice_u8_x2 + uu____2 = + Eurydice_slice_split_at(remaining_serialized1, + LIBCRUX_ML_DSA_CONSTANTS_BYTES_FOR_VERIFICATION_KEY_HASH, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 verification_key_hash = uu____2.fst; + Eurydice_borrow_slice_u8 remaining_serialized2 = uu____2.snd; + Eurydice_borrow_slice_u8_x2 + uu____3 = + Eurydice_slice_split_at(remaining_serialized2, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ERROR_RING_ELEMENT_SIZE * + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 s1_serialized = uu____3.fst; + Eurydice_borrow_slice_u8 remaining_serialized = uu____3.snd; + Eurydice_borrow_slice_u8_x2 + uu____4 = + Eurydice_slice_split_at(remaining_serialized, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ERROR_RING_ELEMENT_SIZE * + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 s2_serialized = uu____4.fst; + Eurydice_borrow_slice_u8 t0_serialized = uu____4.snd; + Eurydice_arr_bb s1_as_ntt; + Eurydice_arr_a3 repeat_expression0[7U]; + for (size_t i = (size_t)0U; i < (size_t)7U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s1_as_ntt.data, repeat_expression0, (size_t)7U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_8f s2_as_ntt; + Eurydice_arr_a3 repeat_expression1[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(s2_as_ntt.data, repeat_expression1, (size_t)8U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_8f t0_as_ntt; + Eurydice_arr_a3 repeat_expression2[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression2[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t0_as_ntt.data, repeat_expression2, (size_t)8U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_encoding_error_deserialize_to_vector_then_ntt_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ERROR_RING_ELEMENT_SIZE, + s1_serialized, + Eurydice_array_to_slice_mut_208(&s1_as_ntt)); + libcrux_ml_dsa_encoding_error_deserialize_to_vector_then_ntt_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ETA, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_ERROR_RING_ELEMENT_SIZE, + s2_serialized, + Eurydice_array_to_slice_mut_20(&s2_as_ntt)); + libcrux_ml_dsa_encoding_t0_deserialize_to_vector_then_ntt_37(t0_serialized, + Eurydice_array_to_slice_mut_20(&t0_as_ntt)); + Eurydice_arr_0f matrix; + Eurydice_arr_a3 repeat_expression3[56U]; + for (size_t i = (size_t)0U; i < (size_t)56U; i++) + { + repeat_expression3[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(matrix.data, repeat_expression3, (size_t)56U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_207(&matrix)); + Eurydice_arr_c7 message_representative = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_derive_message_representative_43(verification_key_hash, + &domain_separation_context, + message, + &message_representative); + Eurydice_arr_c7 mask_seed = { .data = { 0U } }; + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake0 = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake0, seed_for_signing); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake0, + Eurydice_array_to_slice_shared_01(&randomness)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake0, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake0, + Eurydice_array_to_slice_mut_17(&mask_seed)); + uint16_t domain_separator_for_mask = 0U; + size_t attempt = (size_t)0U; + core_option_Option_b2 commitment_hash0 = { .tag = core_option_None }; + core_option_Option_2d signer_response0 = { .tag = core_option_None }; + core_option_Option_45 hint0 = { .tag = core_option_None }; + while (attempt < LIBCRUX_ML_DSA_CONSTANTS_REJECTION_SAMPLE_BOUND_SIGN) + { + attempt++; + Eurydice_arr_bb mask; + Eurydice_arr_a3 repeat_expression4[7U]; + for (size_t i = (size_t)0U; i < (size_t)7U; i++) + { + repeat_expression4[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(mask.data, repeat_expression4, (size_t)7U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_8f w0; + Eurydice_arr_a3 repeat_expression5[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression5[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(w0.data, repeat_expression5, (size_t)8U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_8f commitment; + Eurydice_arr_a3 repeat_expression6[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression6[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(commitment.data, repeat_expression6, (size_t)8U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_sample_sample_mask_vector_67(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA1_EXPONENT, + &mask_seed, + &domain_separator_for_mask, + Eurydice_array_to_slice_mut_208(&mask)); + Eurydice_arr_8f a_x_mask; + Eurydice_arr_a3 repeat_expression[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(a_x_mask.data, repeat_expression, (size_t)8U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_bb + mask_ntt = + core_array__core__clone__Clone_for__T__N___clone((size_t)7U, + &mask, + Eurydice_arr_a3, + Eurydice_arr_bb); + for (size_t i = (size_t)0U; i < (size_t)7U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&mask_ntt.data[i0]); + } + libcrux_ml_dsa_matrix_compute_matrix_x_mask_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + Eurydice_array_to_slice_shared_208(&matrix), + Eurydice_array_to_slice_shared_206(&mask_ntt), + Eurydice_array_to_slice_mut_20(&a_x_mask)); + libcrux_ml_dsa_arithmetic_decompose_vector_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA2, + Eurydice_array_to_slice_shared_200(&a_x_mask), + Eurydice_array_to_slice_mut_20(&w0), + Eurydice_array_to_slice_mut_20(&commitment)); + Eurydice_arr_c7 commitment_hash_candidate = { .data = { 0U } }; + Eurydice_arr_1b commitment_serialized = { .data = { 0U } }; + libcrux_ml_dsa_encoding_commitment_serialize_vector_37(LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_COMMITMENT_RING_ELEMENT_SIZE, + Eurydice_array_to_slice_shared_200(&commitment), + Eurydice_array_to_slice_mut_68(&commitment_serialized)); + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_68(&commitment_serialized)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_17(&commitment_hash_candidate)); + Eurydice_arr_a3 verifier_challenge = libcrux_ml_dsa_polynomial_zero_ff_37(); + libcrux_ml_dsa_sample_sample_challenge_ring_element_2e(Eurydice_array_to_slice_shared_17(&commitment_hash_candidate), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ONES_IN_VERIFIER_CHALLENGE, + &verifier_challenge); + libcrux_ml_dsa_ntt_ntt_37(&verifier_challenge); + Eurydice_arr_bb + challenge_times_s1 = + core_array__core__clone__Clone_for__T__N___clone((size_t)7U, + &s1_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_bb); + Eurydice_arr_8f + challenge_times_s2 = + core_array__core__clone__Clone_for__T__N___clone((size_t)8U, + &s2_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_8f); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_208(&challenge_times_s1), + &verifier_challenge); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_20(&challenge_times_s2), + &verifier_challenge); + libcrux_ml_dsa_matrix_add_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + Eurydice_array_to_slice_mut_208(&mask), + Eurydice_array_to_slice_shared_206(&challenge_times_s1)); + libcrux_ml_dsa_matrix_subtract_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + Eurydice_array_to_slice_mut_20(&w0), + Eurydice_array_to_slice_shared_200(&challenge_times_s2)); + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_206(&mask), + (int32_t)((uint32_t)1 << (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA1_EXPONENT) - + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_BETA) + ) + { + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_200(&w0), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA2 - LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_BETA) + ) + { + Eurydice_arr_8f + challenge_times_t0 = + core_array__core__clone__Clone_for__T__N___clone((size_t)8U, + &t0_as_ntt, + Eurydice_arr_a3, + Eurydice_arr_8f); + libcrux_ml_dsa_matrix_vector_times_ring_element_37(Eurydice_array_to_slice_mut_20(&challenge_times_t0), + &verifier_challenge); + if + ( + !libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_200(&challenge_times_t0), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA2) + ) + { + libcrux_ml_dsa_matrix_add_vectors_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + Eurydice_array_to_slice_mut_20(&w0), + Eurydice_array_to_slice_shared_200(&challenge_times_t0)); + Eurydice_arr_81 + hint_candidate = + { + .data = { + { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, + { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } + } + }; + size_t + ones_in_hint = + libcrux_ml_dsa_arithmetic_make_hint_37(Eurydice_array_to_slice_shared_200(&w0), + Eurydice_array_to_slice_shared_200(&commitment), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA2, + Eurydice_array_to_slice_mut_861(&hint_candidate)); + if (!(ones_in_hint > LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_MAX_ONES_IN_HINT)) + { + attempt = LIBCRUX_ML_DSA_CONSTANTS_REJECTION_SAMPLE_BOUND_SIGN; + commitment_hash0 = + ( + KRML_CLITERAL(core_option_Option_b2){ + .tag = core_option_Some, + .f0 = commitment_hash_candidate + } + ); + signer_response0 = + (KRML_CLITERAL(core_option_Option_2d){ .tag = core_option_Some, .f0 = mask }); + hint0 = + ( + KRML_CLITERAL(core_option_Option_45){ + .tag = core_option_Some, + .f0 = hint_candidate + } + ); + } + } + } + } + } + core_result_Result_53 uu____5; + if (commitment_hash0.tag == core_option_None) + { + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + else + { + Eurydice_arr_c7 commitment_hash = commitment_hash0.f0; + Eurydice_arr_c7 commitment_hash1 = commitment_hash; + if (signer_response0.tag == core_option_None) + { + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + else + { + Eurydice_arr_bb signer_response = signer_response0.f0; + Eurydice_arr_bb signer_response1 = signer_response; + if (!(hint0.tag == core_option_None)) + { + Eurydice_arr_81 hint = hint0.f0; + Eurydice_arr_81 hint1 = hint; + libcrux_ml_dsa_encoding_signature_serialize_37(Eurydice_array_to_slice_shared_17(&commitment_hash1), + Eurydice_array_to_slice_shared_206(&signer_response1), + Eurydice_array_to_slice_shared_861(&hint1), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COMMITMENT_HASH_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA1_EXPONENT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_GAMMA1_RING_ELEMENT_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_MAX_ONES_IN_HINT, + Eurydice_array_to_slice_mut_11(signature)); + return (KRML_CLITERAL(core_result_Result_53){ .tag = core_result_Ok }); + } + uu____5 = + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_RejectionSamplingError + } + ); + } + } + return uu____5; +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.sign_mut +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_mut_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_93 *signature +) +{ + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + (KRML_CLITERAL(core_option_Option_57){ .tag = core_option_None })); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_internal_5a(signing_key, + message, + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + randomness, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.sign +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4 +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_8b +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_5a( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_93 signature = libcrux_ml_dsa_types_zero_c5_f1(); + core_result_Result_53 + uu____0 = + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_mut_5a(signing_key, + message, + context, + randomness, + &signature); + core_result_Result_8b uu____1; + if (uu____0.tag == core_result_Ok) + { + uu____1 = + ( + KRML_CLITERAL(core_result_Result_8b){ + .tag = core_result_Ok, + .val = { .case_Ok = signature } + } + ); + } + else + { + libcrux_ml_dsa_types_SigningError e = uu____0.f0; + uu____1 = + (KRML_CLITERAL(core_result_Result_8b){ .tag = core_result_Err, .val = { .case_Err = e } }); + } + return uu____1; +} + +/** + Sign. +*/ +static inline core_result_Result_8b +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_sign( + const Eurydice_arr_e2 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_5a(Eurydice_array_to_slice_shared_f7(signing_key), + message, + context, + randomness); +} + +/** + Sign. +*/ +static inline core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_sign_mut( + const Eurydice_arr_e2 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_93 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_mut_5a(Eurydice_array_to_slice_shared_f7(signing_key), + message, + context, + randomness, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.sign_pre_hashed_mut +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_53 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_pre_hashed_mut_3f( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness, + Eurydice_arr_93 *signature +) +{ + if (!(context.meta > LIBCRUX_ML_DSA_CONSTANTS_CONTEXT_MAX_LEN)) + { + libcrux_ml_dsa_pre_hash_hash_30_83(message, pre_hash_buffer); + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + ( + KRML_CLITERAL(core_option_Option_57){ + .tag = core_option_Some, + .f0 = libcrux_ml_dsa_pre_hash_oid_30() + } + )); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_internal_5a(signing_key, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = pre_hash_buffer.ptr, + .meta = pre_hash_buffer.meta + } + ), + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + randomness, + signature); + } + return + ( + KRML_CLITERAL(core_result_Result_53){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_SigningError_ContextTooLongError + } + ); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.sign_pre_hashed +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_hash_functions_portable_Shake256X4, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_8b +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_pre_hashed_3f( + Eurydice_borrow_slice_u8 signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_93 signature = libcrux_ml_dsa_types_zero_c5_f1(); + core_result_Result_53 + uu____0 = + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_pre_hashed_mut_3f(signing_key, + message, + context, + pre_hash_buffer, + randomness, + &signature); + core_result_Result_8b uu____1; + if (uu____0.tag == core_result_Ok) + { + uu____1 = + ( + KRML_CLITERAL(core_result_Result_8b){ + .tag = core_result_Ok, + .val = { .case_Ok = signature } + } + ); + } + else + { + libcrux_ml_dsa_types_SigningError e = uu____0.f0; + uu____1 = + (KRML_CLITERAL(core_result_Result_8b){ .tag = core_result_Err, .val = { .case_Err = e } }); + } + return uu____1; +} + +/** + Sign (pre-hashed). +*/ +static inline core_result_Result_8b +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_sign_pre_hashed_shake128( + const Eurydice_arr_e2 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_sign_pre_hashed_3f(Eurydice_array_to_slice_shared_f7(signing_key), + message, + context, + pre_hash_buffer, + randomness); +} + +/** + The internal verification API. + + If no `domain_separation_context` is supplied, it is assumed that + `message` already contains the domain separation. +*/ +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.verify_internal +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_verify_internal_5a( + const Eurydice_arr_43 *verification_key, + Eurydice_borrow_slice_u8 message, + core_option_Option_84 domain_separation_context, + const Eurydice_arr_93 *signature_serialized +) +{ + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_fc(verification_key), + LIBCRUX_ML_DSA_CONSTANTS_SEED_FOR_A_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_a = uu____0.fst; + Eurydice_borrow_slice_u8 t1_serialized = uu____0.snd; + Eurydice_arr_8f t1; + Eurydice_arr_a3 repeat_expression0[8U]; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) + { + repeat_expression0[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(t1.data, repeat_expression0, (size_t)8U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_encoding_verification_key_deserialize_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_VERIFICATION_KEY_SIZE, + t1_serialized, + Eurydice_array_to_slice_mut_20(&t1)); + Eurydice_arr_c7 deserialized_commitment_hash = { .data = { 0U } }; + Eurydice_arr_bb deserialized_signer_response; + Eurydice_arr_a3 repeat_expression1[7U]; + for (size_t i = (size_t)0U; i < (size_t)7U; i++) + { + repeat_expression1[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(deserialized_signer_response.data, + repeat_expression1, + (size_t)7U * sizeof (Eurydice_arr_a3)); + Eurydice_arr_81 + deserialized_hint = + { + .data = { + { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, + { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } + } + }; + core_result_Result_41 + uu____1 = + libcrux_ml_dsa_encoding_signature_deserialize_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COMMITMENT_HASH_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA1_EXPONENT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_GAMMA1_RING_ELEMENT_SIZE, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_MAX_ONES_IN_HINT, + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_SIGNATURE_SIZE, + Eurydice_array_to_slice_shared_11(signature_serialized), + Eurydice_array_to_slice_mut_17(&deserialized_commitment_hash), + Eurydice_array_to_slice_mut_208(&deserialized_signer_response), + Eurydice_array_to_slice_mut_861(&deserialized_hint)); + core_result_Result_41 uu____2; + if (uu____1.tag == core_result_Ok) + { + if + ( + libcrux_ml_dsa_arithmetic_vector_infinity_norm_exceeds_37(Eurydice_array_to_slice_shared_206(&deserialized_signer_response), + (int32_t)((uint32_t)1 << (uint32_t)LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA1_EXPONENT) - + LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_BETA) + ) + { + uu____2 = + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_SignerResponseExceedsBoundError + } + ); + } + else + { + Eurydice_arr_0f matrix; + Eurydice_arr_a3 repeat_expression[56U]; + for (size_t i = (size_t)0U; i < (size_t)56U; i++) + { + repeat_expression[i] = libcrux_ml_dsa_polynomial_zero_ff_37(); + } + memcpy(matrix.data, repeat_expression, (size_t)56U * sizeof (Eurydice_arr_a3)); + libcrux_ml_dsa_samplex4_portable_matrix_flat_a8_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + seed_for_a, + Eurydice_array_to_slice_mut_207(&matrix)); + Eurydice_arr_c7 verification_key_hash = { .data = { 0U } }; + libcrux_ml_dsa_hash_functions_portable_shake256_61_c9(Eurydice_array_to_slice_shared_fc(verification_key), + &verification_key_hash); + Eurydice_arr_c7 message_representative = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_derive_message_representative_43(Eurydice_array_to_slice_shared_17(&verification_key_hash), + &domain_separation_context, + message, + &message_representative); + Eurydice_arr_a3 verifier_challenge = libcrux_ml_dsa_polynomial_zero_ff_37(); + libcrux_ml_dsa_sample_sample_challenge_ring_element_2e(Eurydice_array_to_slice_shared_17(&deserialized_commitment_hash), + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ONES_IN_VERIFIER_CHALLENGE, + &verifier_challenge); + libcrux_ml_dsa_ntt_ntt_37(&verifier_challenge); + for (size_t i = (size_t)0U; i < (size_t)7U; i++) + { + size_t i0 = i; + libcrux_ml_dsa_ntt_ntt_37(&deserialized_signer_response.data[i0]); + } + libcrux_ml_dsa_matrix_compute_w_approx_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_ROWS_IN_A, + LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_COLUMNS_IN_A, + Eurydice_array_to_slice_shared_208(&matrix), + Eurydice_array_to_slice_shared_206(&deserialized_signer_response), + &verifier_challenge, + Eurydice_array_to_slice_mut_20(&t1)); + Eurydice_arr_c7 recomputed_commitment_hash = { .data = { 0U } }; + libcrux_ml_dsa_arithmetic_use_hint_37(LIBCRUX_ML_DSA_CONSTANTS_ML_DSA_87_GAMMA2, + Eurydice_array_to_slice_shared_861(&deserialized_hint), + Eurydice_array_to_slice_mut_20(&t1)); + Eurydice_arr_1b commitment_serialized = { .data = { 0U } }; + libcrux_ml_dsa_encoding_commitment_serialize_vector_37(LIBCRUX_ML_DSA_ML_DSA_GENERIC_ML_DSA_87_COMMITMENT_RING_ELEMENT_SIZE, + Eurydice_array_to_slice_shared_200(&t1), + Eurydice_array_to_slice_mut_68(&commitment_serialized)); + libcrux_sha3_generic_keccak_xof_KeccakXofState_8d + shake = libcrux_ml_dsa_hash_functions_portable_init_26(); + libcrux_ml_dsa_hash_functions_portable_absorb_26(&shake, + Eurydice_array_to_slice_shared_17(&message_representative)); + libcrux_ml_dsa_hash_functions_portable_absorb_final_26(&shake, + Eurydice_array_to_slice_shared_68(&commitment_serialized)); + libcrux_ml_dsa_hash_functions_portable_squeeze_26(&shake, + Eurydice_array_to_slice_mut_17(&recomputed_commitment_hash)); + if + ( + Eurydice_array_eq((size_t)64U, + &deserialized_commitment_hash, + &recomputed_commitment_hash, + uint8_t) + ) + { + uu____2 = (KRML_CLITERAL(core_result_Result_41){ .tag = core_result_Ok }); + } + else + { + uu____2 = + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_CommitmentHashesDontMatchError + } + ); + } + } + } + else + { + libcrux_ml_dsa_types_VerificationError e = uu____1.f0; + uu____2 = (KRML_CLITERAL(core_result_Result_41){ .tag = core_result_Err, .f0 = e }); + } + return uu____2; +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.verify +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_verify_5a( + const Eurydice_arr_43 *verification_key_serialized, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_93 *signature_serialized +) +{ + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + (KRML_CLITERAL(core_option_Option_57){ .tag = core_option_None })); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_VerificationContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_verify_internal_5a(verification_key_serialized, + message, + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + signature_serialized); +} + +/** + Verify. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_verify( + const Eurydice_arr_43 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_93 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_verify_5a(verification_key, + message, + context, + signature); +} + +/** +A monomorphic instance of libcrux_ml_dsa.ml_dsa_generic.ml_dsa_87.verify_pre_hashed +with types libcrux_ml_dsa_simd_portable_vector_type_Coefficients, libcrux_ml_dsa_samplex4_portable_PortableSampler, libcrux_ml_dsa_hash_functions_portable_Shake128, libcrux_ml_dsa_hash_functions_portable_Shake128X4, libcrux_ml_dsa_hash_functions_portable_Shake256, libcrux_ml_dsa_hash_functions_portable_Shake256Xof, libcrux_ml_dsa_pre_hash_SHAKE128_PH +with const generics + +*/ +static KRML_MUSTINLINE core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_verify_pre_hashed_3f( + const Eurydice_arr_43 *verification_key_serialized, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + const Eurydice_arr_93 *signature_serialized +) +{ + libcrux_ml_dsa_pre_hash_hash_30_83(message, pre_hash_buffer); + core_result_Result_a8 + uu____0 = + libcrux_ml_dsa_pre_hash_new_88(context, + ( + KRML_CLITERAL(core_option_Option_57){ + .tag = core_option_Some, + .f0 = libcrux_ml_dsa_pre_hash_oid_30() + } + )); + if (!(uu____0.tag == core_result_Ok)) + { + return + ( + KRML_CLITERAL(core_result_Result_41){ + .tag = core_result_Err, + .f0 = libcrux_ml_dsa_types_VerificationError_VerificationContextTooLongError + } + ); + } + libcrux_ml_dsa_pre_hash_DomainSeparationContext dsc = uu____0.val.case_Ok; + libcrux_ml_dsa_pre_hash_DomainSeparationContext domain_separation_context = dsc; + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_verify_internal_5a(verification_key_serialized, + ( + KRML_CLITERAL(Eurydice_borrow_slice_u8){ + .ptr = pre_hash_buffer.ptr, + .meta = pre_hash_buffer.meta + } + ), + ( + KRML_CLITERAL(core_option_Option_84){ + .tag = core_option_Some, + .f0 = domain_separation_context + } + ), + signature_serialized); +} + +/** + Verify (pre-hashed with SHAKE-128). +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_verify_pre_hashed_shake128( + const Eurydice_arr_43 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_mut_borrow_slice_u8 pre_hash_buffer, + const Eurydice_arr_93 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_verify_pre_hashed_3f(verification_key, + message, + context, + pre_hash_buffer, + signature); +} + +#if defined(__cplusplus) +} +#endif + +#define libcrux_mldsa_portable_H_DEFINED +#endif /* libcrux_mldsa_portable_H */ + +/* from libcrux/combined_extraction/generated/libcrux_mldsa44_portable.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_mldsa44_portable_H +#define libcrux_mldsa44_portable_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +/** + Generate an ML-DSA-44 Key Pair +*/ +static inline libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44KeyPair +libcrux_ml_dsa_ml_dsa_44_portable_generate_key_pair(Eurydice_arr_ec randomness) +{ + Eurydice_arr_10 signing_key = { .data = { 0U } }; + Eurydice_arr_02 verification_key = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_generate_key_pair(randomness, + &signing_key, + &verification_key); + return + ( + KRML_CLITERAL(libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44KeyPair){ + .signing_key = libcrux_ml_dsa_types_new_9b_ab(signing_key), + .verification_key = libcrux_ml_dsa_types_new_7f_7d(verification_key) + } + ); +} + +/** + Generate an ML-DSA-44 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_48 +libcrux_ml_dsa_ml_dsa_44_portable_sign( + const Eurydice_arr_10 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_sign(libcrux_ml_dsa_types_as_ref_9b_ab(signing_key), + message, + context, + randomness); +} + +/** + Generate an ML-DSA-44 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_53 +libcrux_ml_dsa_ml_dsa_44_portable_sign_mut( + const Eurydice_arr_10 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_85 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_sign_mut(libcrux_ml_dsa_types_as_ref_9b_ab(signing_key), + message, + context, + randomness, + signature); +} + +/** + Generate a HashML-DSA-44 Signature, with a SHAKE128 pre-hashing + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_48 +libcrux_ml_dsa_ml_dsa_44_portable_sign_pre_hashed_shake128( + const Eurydice_arr_10 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_ec pre_hash_buffer = { .data = { 0U } }; + const Eurydice_arr_10 *uu____0 = libcrux_ml_dsa_types_as_ref_9b_ab(signing_key); + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_sign_pre_hashed_shake128(uu____0, + message, + context, + Eurydice_array_to_slice_mut_01(&pre_hash_buffer), + randomness); +} + +/** + Verify an ML-DSA-44 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_44_portable_verify( + const Eurydice_arr_02 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_85 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_verify(libcrux_ml_dsa_types_as_ref_7f_7d(verification_key), + message, + context, + libcrux_ml_dsa_types_as_ref_c5_37(signature)); +} + +/** + Verify a HashML-DSA-44 Signature, with a SHAKE128 pre-hashing + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_44_portable_verify_pre_hashed_shake128( + const Eurydice_arr_02 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_85 *signature +) +{ + Eurydice_arr_ec pre_hash_buffer = { .data = { 0U } }; + const Eurydice_arr_02 *uu____0 = libcrux_ml_dsa_types_as_ref_7f_7d(verification_key); + Eurydice_borrow_slice_u8 uu____1 = message; + Eurydice_borrow_slice_u8 uu____2 = context; + Eurydice_mut_borrow_slice_u8 uu____3 = Eurydice_array_to_slice_mut_01(&pre_hash_buffer); + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_44_verify_pre_hashed_shake128(uu____0, + uu____1, + uu____2, + uu____3, + libcrux_ml_dsa_types_as_ref_c5_37(signature)); +} + +#if defined(__cplusplus) +} +#endif + +#define libcrux_mldsa44_portable_H_DEFINED +#endif /* libcrux_mldsa44_portable_H */ + +/* from libcrux/combined_extraction/generated/libcrux_mldsa65_portable.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_mldsa65_portable_H +#define libcrux_mldsa65_portable_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +/** + Generate an ML-DSA-65 Key Pair +*/ +static inline libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65KeyPair +libcrux_ml_dsa_ml_dsa_65_portable_generate_key_pair(Eurydice_arr_ec randomness) +{ + Eurydice_arr_24 signing_key = { .data = { 0U } }; + Eurydice_arr_29 verification_key = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_generate_key_pair(randomness, + &signing_key, + &verification_key); + return + ( + KRML_CLITERAL(libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65KeyPair){ + .signing_key = libcrux_ml_dsa_types_new_9b_e5(signing_key), + .verification_key = libcrux_ml_dsa_types_new_7f_a2(verification_key) + } + ); +} + +/** + Generate an ML-DSA-65 Key Pair +*/ +static inline void +libcrux_ml_dsa_ml_dsa_65_portable_generate_key_pair_mut( + Eurydice_arr_ec randomness, + Eurydice_arr_24 *signing_key, + Eurydice_arr_29 *verification_key +) +{ + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_generate_key_pair(randomness, + signing_key, + verification_key); +} + +/** + Generate an ML-DSA-65 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_8c +libcrux_ml_dsa_ml_dsa_65_portable_sign( + const Eurydice_arr_24 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_sign(libcrux_ml_dsa_types_as_ref_9b_e5(signing_key), + message, + context, + randomness); +} + +/** + Generate an ML-DSA-65 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_53 +libcrux_ml_dsa_ml_dsa_65_portable_sign_mut( + const Eurydice_arr_24 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_0c *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_sign_mut(signing_key, + message, + context, + randomness, + signature); +} + +/** + Generate a HashML-DSA-65 Signature, with a SHAKE128 pre-hashing + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_8c +libcrux_ml_dsa_ml_dsa_65_portable_sign_pre_hashed_shake128( + const Eurydice_arr_24 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_ec pre_hash_buffer = { .data = { 0U } }; + const Eurydice_arr_24 *uu____0 = libcrux_ml_dsa_types_as_ref_9b_e5(signing_key); + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_sign_pre_hashed_shake128(uu____0, + message, + context, + Eurydice_array_to_slice_mut_01(&pre_hash_buffer), + randomness); +} + +/** + Verify an ML-DSA-65 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_65_portable_verify( + const Eurydice_arr_29 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_0c *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_verify(libcrux_ml_dsa_types_as_ref_7f_a2(verification_key), + message, + context, + libcrux_ml_dsa_types_as_ref_c5_5c(signature)); +} + +/** + Verify a HashML-DSA-65 Signature, with a SHAKE128 pre-hashing + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_65_portable_verify_pre_hashed_shake128( + const Eurydice_arr_29 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_0c *signature +) +{ + Eurydice_arr_ec pre_hash_buffer = { .data = { 0U } }; + const Eurydice_arr_29 *uu____0 = libcrux_ml_dsa_types_as_ref_7f_a2(verification_key); + Eurydice_borrow_slice_u8 uu____1 = message; + Eurydice_borrow_slice_u8 uu____2 = context; + Eurydice_mut_borrow_slice_u8 uu____3 = Eurydice_array_to_slice_mut_01(&pre_hash_buffer); + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_65_verify_pre_hashed_shake128(uu____0, + uu____1, + uu____2, + uu____3, + libcrux_ml_dsa_types_as_ref_c5_5c(signature)); +} + +#if defined(__cplusplus) +} +#endif + +#define libcrux_mldsa65_portable_H_DEFINED +#endif /* libcrux_mldsa65_portable_H */ + +/* from libcrux/combined_extraction/generated/libcrux_mldsa87_portable.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_mldsa87_portable_H +#define libcrux_mldsa87_portable_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +/** + Generate an ML-DSA-87 Key Pair +*/ +static inline libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87KeyPair +libcrux_ml_dsa_ml_dsa_87_portable_generate_key_pair(Eurydice_arr_ec randomness) +{ + Eurydice_arr_e2 signing_key = { .data = { 0U } }; + Eurydice_arr_43 verification_key = { .data = { 0U } }; + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_generate_key_pair(randomness, + &signing_key, + &verification_key); + return + ( + KRML_CLITERAL(libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87KeyPair){ + .signing_key = libcrux_ml_dsa_types_new_9b_72(signing_key), + .verification_key = libcrux_ml_dsa_types_new_7f_c6(verification_key) + } + ); +} + +/** + Generate an ML-DSA-87 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_8b +libcrux_ml_dsa_ml_dsa_87_portable_sign( + const Eurydice_arr_e2 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_sign(libcrux_ml_dsa_types_as_ref_9b_72(signing_key), + message, + context, + randomness); +} + +/** + Generate an ML-DSA-87 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_53 +libcrux_ml_dsa_ml_dsa_87_portable_sign_mut( + const Eurydice_arr_e2 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness, + Eurydice_arr_93 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_sign_mut(libcrux_ml_dsa_types_as_ref_9b_72(signing_key), + message, + context, + randomness, + signature); +} + +/** + Generate a HashML-DSA-87 Signature, with a SHAKE128 pre-hashing + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_8b +libcrux_ml_dsa_ml_dsa_87_portable_sign_pre_hashed_shake128( + const Eurydice_arr_e2 *signing_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + Eurydice_arr_ec randomness +) +{ + Eurydice_arr_ec pre_hash_buffer = { .data = { 0U } }; + const Eurydice_arr_e2 *uu____0 = libcrux_ml_dsa_types_as_ref_9b_72(signing_key); + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_sign_pre_hashed_shake128(uu____0, + message, + context, + Eurydice_array_to_slice_mut_01(&pre_hash_buffer), + randomness); +} + +/** + Verify an ML-DSA-87 Signature + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_87_portable_verify( + const Eurydice_arr_43 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_93 *signature +) +{ + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_verify(libcrux_ml_dsa_types_as_ref_7f_c6(verification_key), + message, + context, + libcrux_ml_dsa_types_as_ref_c5_f1(signature)); +} + +/** + Verify a HashML-DSA-87 Signature, with a SHAKE128 pre-hashing + + The parameter `context` is used for domain separation + and is a byte string of length at most 255 bytes. It + may also be empty. +*/ +static inline core_result_Result_41 +libcrux_ml_dsa_ml_dsa_87_portable_verify_pre_hashed_shake128( + const Eurydice_arr_43 *verification_key, + Eurydice_borrow_slice_u8 message, + Eurydice_borrow_slice_u8 context, + const Eurydice_arr_93 *signature +) +{ + Eurydice_arr_ec pre_hash_buffer = { .data = { 0U } }; + const Eurydice_arr_43 *uu____0 = libcrux_ml_dsa_types_as_ref_7f_c6(verification_key); + Eurydice_borrow_slice_u8 uu____1 = message; + Eurydice_borrow_slice_u8 uu____2 = context; + Eurydice_mut_borrow_slice_u8 uu____3 = Eurydice_array_to_slice_mut_01(&pre_hash_buffer); + return + libcrux_ml_dsa_ml_dsa_generic_instantiations_portable_ml_dsa_87_verify_pre_hashed_shake128(uu____0, + uu____1, + uu____2, + uu____3, + libcrux_ml_dsa_types_as_ref_c5_f1(signature)); +} + +#if defined(__cplusplus) +} +#endif + +#define libcrux_mldsa87_portable_H_DEFINED +#endif /* libcrux_mldsa87_portable_H */ + +/* from libcrux/combined_extraction/generated/libcrux_mlkem768_portable.h */ +/* + * SPDX-FileCopyrightText: 2025 Cryspen Sarl + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: e656e17bff6ca5efac8ab6919b9b74cb9a8dd8ad + * Eurydice: aaa9fa657fb6f09802edb890252040d94cd93982 + * Karamel: 8c19d41458ce5cbfea029ebc03334ba96d149039 + * F*: unset + * Libcrux: c4e5e5e511bbc4c53f826163f57bfd10e9228911 + */ + + +#ifndef libcrux_mlkem768_portable_H +#define libcrux_mlkem768_portable_H + + + +#if defined(__cplusplus) +extern "C" { +#endif + + +static inline Eurydice_arr_c7 +libcrux_ml_kem_hash_functions_portable_G(Eurydice_borrow_slice_u8 input) +{ + Eurydice_arr_c7 digest = { .data = { 0U } }; + libcrux_sha3_portable_sha512(Eurydice_array_to_slice_mut_17(&digest), input); + return digest; +} + +static inline Eurydice_arr_ec +libcrux_ml_kem_hash_functions_portable_H(Eurydice_borrow_slice_u8 input) +{ + Eurydice_arr_ec digest = { .data = { 0U } }; + libcrux_sha3_portable_sha256(Eurydice_array_to_slice_mut_01(&digest), input); + return digest; +} + +#define LIBCRUX_ML_KEM_POLYNOMIAL_ZETAS_TIMES_MONTGOMERY_R ((KRML_CLITERAL(Eurydice_arr_34){ .data = { -1044, -758, -359, -1517, 1493, 1422, 287, 202, -171, 622, 1577, 182, 962, -1202, -1474, 1468, 573, -1325, 264, 383, -829, 1458, -1602, -130, -681, 1017, 732, 608, -1542, 411, -205, -1571, 1223, 652, -552, 1015, -1293, 1491, -282, -1544, 516, -8, -320, -666, -1618, -1162, 126, 1469, -853, -90, -271, 830, 107, -1421, -247, -951, -398, 961, -1508, -725, 448, -1065, 677, -1275, -1103, 430, 555, 843, -1251, 871, 1550, 105, 422, 587, 177, -235, -291, -460, 1574, 1653, -246, 778, 1159, -147, -777, 1483, -602, 1119, -1590, 644, -872, 349, 418, 329, -156, -75, 817, 1097, 603, 610, 1322, -1285, -1465, 384, -1215, -136, 1218, -1335, -874, 220, -1187, -1659, -1185, -1530, -1278, 794, -1510, -854, -870, 478, -108, -308, 996, 991, 958, -1460, 1522, 1628 } })) + +static KRML_MUSTINLINE int16_t libcrux_ml_kem_polynomial_zeta(size_t i) +{ + return LIBCRUX_ML_KEM_POLYNOMIAL_ZETAS_TIMES_MONTGOMERY_R.data[i]; +} + +#define LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT ((size_t)16U) + +#define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR ((size_t)16U) + +#define LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS (1353) + +#define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS (3329) + +#define LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R (62209U) + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_vector_type_from_i16_array(Eurydice_borrow_slice_i16 array) +{ + Eurydice_arr_d6 arr; + memcpy(arr.data, + Eurydice_slice_subslice_shared_a6(array, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)16U })).ptr, + (size_t)16U * sizeof (int16_t)); + return + core_result_unwrap_26_d3(( + KRML_CLITERAL(core_result_Result_ec){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + )); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_from_i16_array_b8(Eurydice_borrow_slice_i16 array) +{ + return + libcrux_ml_kem_vector_portable_vector_type_from_i16_array(libcrux_secrets_int_classify_public_classify_ref_6d_39(array)); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 libcrux_ml_kem_vector_portable_vector_type_zero(void) +{ + return + libcrux_secrets_int_public_integers_classify_27_4b(( + KRML_CLITERAL(Eurydice_arr_d6){ .data = { 0U } } + )); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 libcrux_ml_kem_vector_portable_ZERO_b8(void) +{ + return libcrux_ml_kem_vector_portable_vector_type_zero(); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_add(Eurydice_arr_d6 lhs, const Eurydice_arr_d6 *rhs) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + size_t uu____0 = i0; + lhs.data[uu____0] += rhs->data[i0]; + } + return lhs; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_add_b8(Eurydice_arr_d6 lhs, const Eurydice_arr_d6 *rhs) +{ + return libcrux_ml_kem_vector_portable_arithmetic_add(lhs, rhs); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_sub(Eurydice_arr_d6 lhs, const Eurydice_arr_d6 *rhs) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + size_t uu____0 = i0; + lhs.data[uu____0] -= rhs->data[i0]; + } + return lhs; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_sub_b8(Eurydice_arr_d6 lhs, const Eurydice_arr_d6 *rhs) +{ + return libcrux_ml_kem_vector_portable_arithmetic_sub(lhs, rhs); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(Eurydice_arr_d6 vec, int16_t c) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + size_t uu____0 = i0; + vec.data[uu____0] *= c; + } + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_multiply_by_constant_b8(Eurydice_arr_d6 vec, int16_t c) +{ + return libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(vec, c); +} + +/** + Note: This function is not secret independent + Only use with public values. +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(Eurydice_arr_d6 vec) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + if (libcrux_secrets_int_public_integers_declassify_d8_39(vec.data[i0]) >= 3329) + { + size_t uu____0 = i0; + vec.data[uu____0] -= 3329; + } + } + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_cond_subtract_3329_b8(Eurydice_arr_d6 v) +{ + return libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(v); +} + +#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER (20159) + +#define LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT (26) + +#define LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_R ((int32_t)((uint32_t)1 << (uint32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT)) + +/** + Signed Barrett Reduction + + Given an input `value`, `barrett_reduce` outputs a representative `result` + such that: + + - result ≡ value (mod FIELD_MODULUS) + - the absolute value of `result` is bound as follows: + + `|result| ≤ FIELD_MODULUS / 2 · (|value|/BARRETT_R + 1) + + Note: The input bound is 28296 to prevent overflow in the multiplication of quotient by FIELD_MODULUS + +*/ +static inline int16_t +libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(int16_t value) +{ + int32_t + t = + libcrux_secrets_int_as_i32_f5(value) * + LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER + + (LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_R >> 1U); + int16_t + quotient = + libcrux_secrets_int_as_i16_36(t >> (uint32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT); + return value - quotient * LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS; +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(Eurydice_arr_d6 vec) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + int16_t vi = libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(vec.data[i0]); + vec.data[i0] = vi; + } + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_barrett_reduce_b8(Eurydice_arr_d6 vector) +{ + return libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(vector); +} + +#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT (16U) + +/** + Signed Montgomery Reduction + + Given an input `value`, `montgomery_reduce` outputs a representative `o` + such that: + + - o ≡ value · MONTGOMERY_R^(-1) (mod FIELD_MODULUS) + - the absolute value of `o` is bound as follows: + + `|result| ≤ ceil(|value| / MONTGOMERY_R) + 1665 + + In particular, if `|value| ≤ FIELD_MODULUS-1 * FIELD_MODULUS-1`, then `|o| <= FIELD_MODULUS-1`. + And, if `|value| ≤ pow2 16 * FIELD_MODULUS-1`, then `|o| <= FIELD_MODULUS + 1664 + +*/ +static inline int16_t +libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(int32_t value) +{ + int32_t + k = + libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_as_i16_36(value)) * + libcrux_secrets_int_as_i32_b8(libcrux_secrets_int_public_integers_classify_27_df(LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R)); + int32_t + k_times_modulus = + libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_as_i16_36(k)) * + libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_public_integers_classify_27_39(LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS)); + int16_t + c = + libcrux_secrets_int_as_i16_36(k_times_modulus >> + (uint32_t)LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT); + int16_t + value_high = + libcrux_secrets_int_as_i16_36(value >> + (uint32_t)LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT); + return value_high - c; +} + +/** + If `fe` is some field element 'x' of the Kyber field and `fer` is congruent to + `y · MONTGOMERY_R`, this procedure outputs a value that is congruent to + `x · y`, as follows: + + `fe · fer ≡ x · y · MONTGOMERY_R (mod FIELD_MODULUS)` + + `montgomery_reduce` takes the value `x · y · MONTGOMERY_R` and outputs a representative + `x · y · MONTGOMERY_R * MONTGOMERY_R^{-1} ≡ x · y (mod FIELD_MODULUS)`. +*/ +static KRML_MUSTINLINE int16_t +libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer( + int16_t fe, + int16_t fer +) +{ + int32_t product = libcrux_secrets_int_as_i32_f5(fe) * libcrux_secrets_int_as_i32_f5(fer); + return libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(product); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant( + Eurydice_arr_d6 vec, + int16_t c +) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + vec.data[i0] = + libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(vec.data[i0], + c); + } + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8( + Eurydice_arr_d6 vector, + int16_t constant +) +{ + return + libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant(vector, + libcrux_secrets_int_public_integers_classify_27_39(constant)); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant( + Eurydice_arr_d6 vec, + int16_t c +) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + size_t uu____0 = i0; + vec.data[uu____0] &= c; + } + return vec; +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.arithmetic.shift_right +with const generics +- SHIFT_BY= 15 +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_shift_right_ef(Eurydice_arr_d6 vec) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + vec.data[i0] >>= (uint32_t)15; + } + return vec; +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_arithmetic_to_unsigned_representative(Eurydice_arr_d6 a) +{ + Eurydice_arr_d6 t = libcrux_ml_kem_vector_portable_arithmetic_shift_right_ef(a); + Eurydice_arr_d6 + fm = + libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(t, + LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS); + return libcrux_ml_kem_vector_portable_arithmetic_add(a, &fm); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_to_unsigned_representative_b8(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_arithmetic_to_unsigned_representative(a); +} + +/** + The `compress_*` functions implement the `Compress` function specified in the NIST FIPS + 203 standard (Page 18, Expression 4.5), which is defined as: + + ```plaintext + Compress_d: ℤq -> ℤ_{2ᵈ} + Compress_d(x) = ⌈(2ᵈ/q)·x⌋ + ``` + + Since `⌈x⌋ = ⌊x + 1/2⌋` we have: + + ```plaintext + Compress_d(x) = ⌊(2ᵈ/q)·x + 1/2⌋ + = ⌊(2^{d+1}·x + q) / 2q⌋ + ``` + + For further information about the function implementations, consult the + `implementation_notes.pdf` document in this directory. + + The NIST FIPS 203 standard can be found at + . +*/ +static inline uint8_t +libcrux_ml_kem_vector_portable_compress_compress_message_coefficient(uint16_t fe) +{ + int16_t + shifted = + libcrux_secrets_int_public_integers_classify_27_39(1664) - libcrux_secrets_int_as_i16_ca(fe); + int16_t mask = shifted >> 15U; + int16_t shifted_to_positive = mask ^ shifted; + int16_t shifted_positive_in_range = shifted_to_positive - 832; + int16_t r0 = shifted_positive_in_range >> 15U; + int16_t r1 = r0 & 1; + return libcrux_secrets_int_as_u8_f5(r1); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_compress_compress_1(Eurydice_arr_d6 a) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + a.data[i0] = + libcrux_secrets_int_as_i16_59(libcrux_ml_kem_vector_portable_compress_compress_message_coefficient(libcrux_secrets_int_as_u16_f5(a.data[i0]))); + } + return a; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 libcrux_ml_kem_vector_portable_compress_1_b8(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_compress_compress_1(a); +} + +static KRML_MUSTINLINE uint32_t +libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits( + uint8_t n, + uint32_t value +) +{ + return value & ((1U << (uint32_t)n) - 1U); +} + +static inline int16_t +libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient( + uint8_t coefficient_bits, + uint16_t fe +) +{ + uint64_t compressed = libcrux_secrets_int_as_u64_ca(fe) << (uint32_t)coefficient_bits; + compressed += 1664ULL; + compressed *= 10321340ULL; + compressed >>= 35U; + return + libcrux_secrets_int_as_i16_b8(libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits(coefficient_bits, + libcrux_secrets_int_as_u32_a3(compressed))); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_compress_decompress_1(Eurydice_arr_d6 a) +{ + Eurydice_arr_d6 z = libcrux_ml_kem_vector_portable_vector_type_zero(); + Eurydice_arr_d6 s = libcrux_ml_kem_vector_portable_arithmetic_sub(z, &a); + Eurydice_arr_d6 + res = libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(s, 1665); + return res; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 libcrux_ml_kem_vector_portable_decompress_1_b8(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_compress_decompress_1(a); +} + +static KRML_MUSTINLINE void +libcrux_ml_kem_vector_portable_ntt_ntt_step( + Eurydice_arr_d6 *vec, + int16_t zeta, + size_t i, + size_t j +) +{ + int16_t + t = + libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(vec->data[j], + libcrux_secrets_int_public_integers_classify_27_39(zeta)); + int16_t a_minus_t = vec->data[i] - t; + int16_t a_plus_t = vec->data[i] + t; + vec->data[j] = a_minus_t; + vec->data[i] = a_plus_t; +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step( + Eurydice_arr_d6 vec, + int16_t zeta0, + int16_t zeta1, + int16_t zeta2, + int16_t zeta3 +) +{ + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)0U, (size_t)2U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)1U, (size_t)3U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)4U, (size_t)6U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)5U, (size_t)7U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta2, (size_t)8U, (size_t)10U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta2, (size_t)9U, (size_t)11U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta3, (size_t)12U, (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta3, (size_t)13U, (size_t)15U); + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_layer_1_step_b8( + Eurydice_arr_d6 a, + int16_t zeta0, + int16_t zeta1, + int16_t zeta2, + int16_t zeta3 +) +{ + return libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step(a, zeta0, zeta1, zeta2, zeta3); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step( + Eurydice_arr_d6 vec, + int16_t zeta0, + int16_t zeta1 +) +{ + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)0U, (size_t)4U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)1U, (size_t)5U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)2U, (size_t)6U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)3U, (size_t)7U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)8U, (size_t)12U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)9U, (size_t)13U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)10U, (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)11U, (size_t)15U); + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_layer_2_step_b8( + Eurydice_arr_d6 a, + int16_t zeta0, + int16_t zeta1 +) +{ + return libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step(a, zeta0, zeta1); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(Eurydice_arr_d6 vec, int16_t zeta) +{ + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)0U, (size_t)8U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)1U, (size_t)9U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)2U, (size_t)10U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)3U, (size_t)11U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)4U, (size_t)12U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)5U, (size_t)13U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)6U, (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)7U, (size_t)15U); + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_layer_3_step_b8(Eurydice_arr_d6 a, int16_t zeta) +{ + return libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(a, zeta); +} + +static KRML_MUSTINLINE void +libcrux_ml_kem_vector_portable_ntt_inv_ntt_step( + Eurydice_arr_d6 *vec, + int16_t zeta, + size_t i, + size_t j +) +{ + int16_t a_minus_b = vec->data[j] - vec->data[i]; + int16_t a_plus_b = vec->data[j] + vec->data[i]; + int16_t o0 = libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(a_plus_b); + int16_t + o1 = + libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(a_minus_b, + libcrux_secrets_int_public_integers_classify_27_39(zeta)); + vec->data[i] = o0; + vec->data[j] = o1; +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step( + Eurydice_arr_d6 vec, + int16_t zeta0, + int16_t zeta1, + int16_t zeta2, + int16_t zeta3 +) +{ + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)0U, (size_t)2U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)1U, (size_t)3U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)4U, (size_t)6U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)5U, (size_t)7U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta2, (size_t)8U, (size_t)10U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta2, (size_t)9U, (size_t)11U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta3, (size_t)12U, (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta3, (size_t)13U, (size_t)15U); + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_b8( + Eurydice_arr_d6 a, + int16_t zeta0, + int16_t zeta1, + int16_t zeta2, + int16_t zeta3 +) +{ + return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step(a, zeta0, zeta1, zeta2, zeta3); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step( + Eurydice_arr_d6 vec, + int16_t zeta0, + int16_t zeta1 +) +{ + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)0U, (size_t)4U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)1U, (size_t)5U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)2U, (size_t)6U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)3U, (size_t)7U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)8U, (size_t)12U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)9U, (size_t)13U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)10U, (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)11U, (size_t)15U); + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_b8( + Eurydice_arr_d6 a, + int16_t zeta0, + int16_t zeta1 +) +{ + return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step(a, zeta0, zeta1); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(Eurydice_arr_d6 vec, int16_t zeta) +{ + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)0U, (size_t)8U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)1U, (size_t)9U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)2U, (size_t)10U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)3U, (size_t)11U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)4U, (size_t)12U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)5U, (size_t)13U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)6U, (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)7U, (size_t)15U); + return vec; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_b8(Eurydice_arr_d6 a, int16_t zeta) +{ + return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(a, zeta); +} + +/** + Compute the product of two Kyber binomials with respect to the + modulus `X² - zeta`. + + This function almost implements Algorithm 11 of the + NIST FIPS 203 standard, which is reproduced below: + + ```plaintext + Input: a₀, a₁, b₀, b₁ ∈ ℤq. + Input: γ ∈ ℤq. + Output: c₀, c₁ ∈ ℤq. + + c₀ ← a₀·b₀ + a₁·b₁·γ + c₁ ← a₀·b₁ + a₁·b₀ + return c₀, c₁ + ``` + We say "almost" because the coefficients output by this function are in + the Montgomery domain (unlike in the specification). + + The NIST FIPS 203 standard can be found at + . +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( + const Eurydice_arr_d6 *a, + const Eurydice_arr_d6 *b, + int16_t zeta, + size_t i, + Eurydice_arr_d6 *out +) +{ + int16_t ai = a->data[(size_t)2U * i]; + int16_t bi = b->data[(size_t)2U * i]; + int16_t aj = a->data[(size_t)2U * i + (size_t)1U]; + int16_t bj = b->data[(size_t)2U * i + (size_t)1U]; + int32_t ai_bi = libcrux_secrets_int_as_i32_f5(ai) * libcrux_secrets_int_as_i32_f5(bi); + int32_t aj_bj_ = libcrux_secrets_int_as_i32_f5(aj) * libcrux_secrets_int_as_i32_f5(bj); + int16_t aj_bj = libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(aj_bj_); + int32_t + aj_bj_zeta = libcrux_secrets_int_as_i32_f5(aj_bj) * libcrux_secrets_int_as_i32_f5(zeta); + int32_t ai_bi_aj_bj = ai_bi + aj_bj_zeta; + int16_t o0 = libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(ai_bi_aj_bj); + int32_t ai_bj = libcrux_secrets_int_as_i32_f5(ai) * libcrux_secrets_int_as_i32_f5(bj); + int32_t aj_bi = libcrux_secrets_int_as_i32_f5(aj) * libcrux_secrets_int_as_i32_f5(bi); + int32_t ai_bj_aj_bi = ai_bj + aj_bi; + int16_t o1 = libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(ai_bj_aj_bi); + out->data[(size_t)2U * i] = o0; + out->data[(size_t)2U * i + (size_t)1U] = o1; +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_ntt_multiply( + const Eurydice_arr_d6 *lhs, + const Eurydice_arr_d6 *rhs, + int16_t zeta0, + int16_t zeta1, + int16_t zeta2, + int16_t zeta3 +) +{ + int16_t nzeta0 = -zeta0; + int16_t nzeta1 = -zeta1; + int16_t nzeta2 = -zeta2; + int16_t nzeta3 = -zeta3; + Eurydice_arr_d6 out = libcrux_ml_kem_vector_portable_vector_type_zero(); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(lhs, + rhs, + libcrux_secrets_int_public_integers_classify_27_39(zeta0), + (size_t)0U, + &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(lhs, + rhs, + libcrux_secrets_int_public_integers_classify_27_39(nzeta0), + (size_t)1U, + &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(lhs, + rhs, + libcrux_secrets_int_public_integers_classify_27_39(zeta1), + (size_t)2U, + &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(lhs, + rhs, + libcrux_secrets_int_public_integers_classify_27_39(nzeta1), + (size_t)3U, + &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(lhs, + rhs, + libcrux_secrets_int_public_integers_classify_27_39(zeta2), + (size_t)4U, + &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(lhs, + rhs, + libcrux_secrets_int_public_integers_classify_27_39(nzeta2), + (size_t)5U, + &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(lhs, + rhs, + libcrux_secrets_int_public_integers_classify_27_39(zeta3), + (size_t)6U, + &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(lhs, + rhs, + libcrux_secrets_int_public_integers_classify_27_39(nzeta3), + (size_t)7U, + &out); + return out; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_ntt_multiply_b8( + const Eurydice_arr_d6 *lhs, + const Eurydice_arr_d6 *rhs, + int16_t zeta0, + int16_t zeta1, + int16_t zeta2, + int16_t zeta3 +) +{ + return libcrux_ml_kem_vector_portable_ntt_ntt_multiply(lhs, rhs, zeta0, zeta1, zeta2, zeta3); +} + +static KRML_MUSTINLINE Eurydice_array_u8x2 +libcrux_ml_kem_vector_portable_serialize_serialize_1(Eurydice_arr_d6 v) +{ + uint8_t + result0 = + (((((((uint32_t)libcrux_secrets_int_as_u8_f5(v.data[0U]) | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[1U]) << 1U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[2U]) << 2U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[3U]) << 3U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[4U]) << 4U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[5U]) << 5U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[6U]) << 6U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[7U]) << 7U; + uint8_t + result1 = + (((((((uint32_t)libcrux_secrets_int_as_u8_f5(v.data[8U]) | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[9U]) << 1U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[10U]) << 2U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[11U]) << 3U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[12U]) << 4U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[13U]) << 5U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[14U]) << 6U) + | (uint32_t)libcrux_secrets_int_as_u8_f5(v.data[15U]) << 7U; + return (KRML_CLITERAL(Eurydice_array_u8x2){ .data = { result0, result1 } }); +} + +static inline Eurydice_array_u8x2 libcrux_ml_kem_vector_portable_serialize_1(Eurydice_arr_d6 a) +{ + return + libcrux_secrets_int_public_integers_declassify_d8_75(libcrux_ml_kem_vector_portable_serialize_serialize_1(a)); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_array_u8x2 +libcrux_ml_kem_vector_portable_serialize_1_b8(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_serialize_1(a); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_serialize_deserialize_1(Eurydice_borrow_slice_u8 v) +{ + int16_t result0 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[0U] & 1U); + int16_t result1 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[0U] >> 1U & 1U); + int16_t result2 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[0U] >> 2U & 1U); + int16_t result3 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[0U] >> 3U & 1U); + int16_t result4 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[0U] >> 4U & 1U); + int16_t result5 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[0U] >> 5U & 1U); + int16_t result6 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[0U] >> 6U & 1U); + int16_t result7 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[0U] >> 7U & 1U); + int16_t result8 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[1U] & 1U); + int16_t result9 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[1U] >> 1U & 1U); + int16_t result10 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[1U] >> 2U & 1U); + int16_t result11 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[1U] >> 3U & 1U); + int16_t result12 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[1U] >> 4U & 1U); + int16_t result13 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[1U] >> 5U & 1U); + int16_t result14 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[1U] >> 6U & 1U); + int16_t result15 = libcrux_secrets_int_as_i16_59((uint32_t)v.ptr[1U] >> 7U & 1U); + return + ( + KRML_CLITERAL(Eurydice_arr_d6){ + .data = { + result0, result1, result2, result3, result4, result5, result6, result7, result8, result9, + result10, result11, result12, result13, result14, result15 + } + } + ); +} + +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_deserialize_1(Eurydice_borrow_slice_u8 a) +{ + return + libcrux_ml_kem_vector_portable_serialize_deserialize_1(libcrux_secrets_int_classify_public_classify_ref_6d_90(a)); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_deserialize_1_b8(Eurydice_borrow_slice_u8 a) +{ + return libcrux_ml_kem_vector_portable_deserialize_1(a); +} + +static KRML_MUSTINLINE uint8_t_x4 +libcrux_ml_kem_vector_portable_serialize_serialize_4_int(Eurydice_borrow_slice_i16 v) +{ + uint8_t + result0 = + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[1U]) << 4U | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[0U]); + uint8_t + result1 = + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[3U]) << 4U | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[2U]); + uint8_t + result2 = + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[5U]) << 4U | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[4U]); + uint8_t + result3 = + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[7U]) << 4U | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[6U]); + return + (KRML_CLITERAL(uint8_t_x4){ .fst = result0, .snd = result1, .thd = result2, .f3 = result3 }); +} + +static KRML_MUSTINLINE Eurydice_array_u8x8 +libcrux_ml_kem_vector_portable_serialize_serialize_4(Eurydice_arr_d6 v) +{ + uint8_t_x4 + result0_3 = + libcrux_ml_kem_vector_portable_serialize_serialize_4_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)8U }))); + uint8_t_x4 + result4_7 = + libcrux_ml_kem_vector_portable_serialize_serialize_4_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)8U, .end = (size_t)16U }))); + return + ( + KRML_CLITERAL(Eurydice_array_u8x8){ + .data = { + result0_3.fst, result0_3.snd, result0_3.thd, result0_3.f3, result4_7.fst, result4_7.snd, + result4_7.thd, result4_7.f3 + } + } + ); +} + +static inline Eurydice_array_u8x8 libcrux_ml_kem_vector_portable_serialize_4(Eurydice_arr_d6 a) +{ + return + libcrux_secrets_int_public_integers_declassify_d8_52(libcrux_ml_kem_vector_portable_serialize_serialize_4(a)); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_array_u8x8 +libcrux_ml_kem_vector_portable_serialize_4_b8(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_serialize_4(a); +} + +static KRML_MUSTINLINE int16_t_x8 +libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(Eurydice_borrow_slice_u8 bytes) +{ + int16_t v0 = libcrux_secrets_int_as_i16_59((uint32_t)bytes.ptr[0U] & 15U); + int16_t v1 = libcrux_secrets_int_as_i16_59((uint32_t)bytes.ptr[0U] >> 4U & 15U); + int16_t v2 = libcrux_secrets_int_as_i16_59((uint32_t)bytes.ptr[1U] & 15U); + int16_t v3 = libcrux_secrets_int_as_i16_59((uint32_t)bytes.ptr[1U] >> 4U & 15U); + int16_t v4 = libcrux_secrets_int_as_i16_59((uint32_t)bytes.ptr[2U] & 15U); + int16_t v5 = libcrux_secrets_int_as_i16_59((uint32_t)bytes.ptr[2U] >> 4U & 15U); + int16_t v6 = libcrux_secrets_int_as_i16_59((uint32_t)bytes.ptr[3U] & 15U); + int16_t v7 = libcrux_secrets_int_as_i16_59((uint32_t)bytes.ptr[3U] >> 4U & 15U); + return + ( + KRML_CLITERAL(int16_t_x8){ + .fst = v0, + .snd = v1, + .thd = v2, + .f3 = v3, + .f4 = v4, + .f5 = v5, + .f6 = v6, + .f7 = v7 + } + ); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_serialize_deserialize_4(Eurydice_borrow_slice_u8 bytes) +{ + int16_t_x8 + v0_7 = + libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)4U }))); + int16_t_x8 + v8_15 = + libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)4U, .end = (size_t)8U }))); + return + ( + KRML_CLITERAL(Eurydice_arr_d6){ + .data = { + v0_7.fst, v0_7.snd, v0_7.thd, v0_7.f3, v0_7.f4, v0_7.f5, v0_7.f6, v0_7.f7, v8_15.fst, + v8_15.snd, v8_15.thd, v8_15.f3, v8_15.f4, v8_15.f5, v8_15.f6, v8_15.f7 + } + } + ); +} + +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_deserialize_4(Eurydice_borrow_slice_u8 a) +{ + return + libcrux_ml_kem_vector_portable_serialize_deserialize_4(libcrux_secrets_int_classify_public_classify_ref_6d_90(a)); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_deserialize_4_b8(Eurydice_borrow_slice_u8 a) +{ + return libcrux_ml_kem_vector_portable_deserialize_4(a); +} + +static KRML_MUSTINLINE uint8_t_x5 +libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_borrow_slice_i16 v) +{ + uint8_t r0 = libcrux_secrets_int_as_u8_f5(v.ptr[0U] & 255); + uint8_t + r1 = + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[1U] & 63) << 2U | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[0U] >> 8U & 3); + uint8_t + r2 = + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[2U] & 15) << 4U | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[1U] >> 6U & 15); + uint8_t + r3 = + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[3U] & 3) << 6U | + (uint32_t)libcrux_secrets_int_as_u8_f5(v.ptr[2U] >> 4U & 63); + uint8_t r4 = libcrux_secrets_int_as_u8_f5(v.ptr[3U] >> 2U & 255); + return (KRML_CLITERAL(uint8_t_x5){ .fst = r0, .snd = r1, .thd = r2, .f3 = r3, .f4 = r4 }); +} + +static KRML_MUSTINLINE Eurydice_arr_fc +libcrux_ml_kem_vector_portable_serialize_serialize_10(Eurydice_arr_d6 v) +{ + uint8_t_x5 + r0_4 = + libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)4U }))); + uint8_t_x5 + r5_9 = + libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)4U, .end = (size_t)8U }))); + uint8_t_x5 + r10_14 = + libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)8U, .end = (size_t)12U }))); + uint8_t_x5 + r15_19 = + libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)12U, .end = (size_t)16U }))); + return + ( + KRML_CLITERAL(Eurydice_arr_fc){ + .data = { + r0_4.fst, r0_4.snd, r0_4.thd, r0_4.f3, r0_4.f4, r5_9.fst, r5_9.snd, r5_9.thd, r5_9.f3, + r5_9.f4, r10_14.fst, r10_14.snd, r10_14.thd, r10_14.f3, r10_14.f4, r15_19.fst, r15_19.snd, + r15_19.thd, r15_19.f3, r15_19.f4 + } + } + ); +} + +static inline Eurydice_arr_fc libcrux_ml_kem_vector_portable_serialize_10(Eurydice_arr_d6 a) +{ + return + libcrux_secrets_int_public_integers_declassify_d8_2b(libcrux_ml_kem_vector_portable_serialize_serialize_10(a)); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_fc libcrux_ml_kem_vector_portable_serialize_10_b8(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_serialize_10(a); +} + +static KRML_MUSTINLINE int16_t_x8 +libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(Eurydice_borrow_slice_u8 bytes) +{ + int16_t + r0 = + libcrux_secrets_int_as_i16_f5((int16_t)((uint32_t)(libcrux_secrets_int_as_i16_59(bytes.ptr[1U]) + & 3) + << 8U) + | (libcrux_secrets_int_as_i16_59(bytes.ptr[0U]) & 255)); + int16_t + r1 = + libcrux_secrets_int_as_i16_f5((int16_t)((uint32_t)(libcrux_secrets_int_as_i16_59(bytes.ptr[2U]) + & 15) + << 6U) + | libcrux_secrets_int_as_i16_59(bytes.ptr[1U]) >> 2U); + int16_t + r2 = + libcrux_secrets_int_as_i16_f5((int16_t)((uint32_t)(libcrux_secrets_int_as_i16_59(bytes.ptr[3U]) + & 63) + << 4U) + | libcrux_secrets_int_as_i16_59(bytes.ptr[2U]) >> 4U); + int16_t + r3 = + libcrux_secrets_int_as_i16_f5((int16_t)((uint32_t)libcrux_secrets_int_as_i16_59(bytes.ptr[4U]) + << 2U) + | libcrux_secrets_int_as_i16_59(bytes.ptr[3U]) >> 6U); + int16_t + r4 = + libcrux_secrets_int_as_i16_f5((int16_t)((uint32_t)(libcrux_secrets_int_as_i16_59(bytes.ptr[6U]) + & 3) + << 8U) + | (libcrux_secrets_int_as_i16_59(bytes.ptr[5U]) & 255)); + int16_t + r5 = + libcrux_secrets_int_as_i16_f5((int16_t)((uint32_t)(libcrux_secrets_int_as_i16_59(bytes.ptr[7U]) + & 15) + << 6U) + | libcrux_secrets_int_as_i16_59(bytes.ptr[6U]) >> 2U); + int16_t + r6 = + libcrux_secrets_int_as_i16_f5((int16_t)((uint32_t)(libcrux_secrets_int_as_i16_59(bytes.ptr[8U]) + & 63) + << 4U) + | libcrux_secrets_int_as_i16_59(bytes.ptr[7U]) >> 4U); + int16_t + r7 = + libcrux_secrets_int_as_i16_f5((int16_t)((uint32_t)libcrux_secrets_int_as_i16_59(bytes.ptr[9U]) + << 2U) + | libcrux_secrets_int_as_i16_59(bytes.ptr[8U]) >> 6U); + return + ( + KRML_CLITERAL(int16_t_x8){ + .fst = r0, + .snd = r1, + .thd = r2, + .f3 = r3, + .f4 = r4, + .f5 = r5, + .f6 = r6, + .f7 = r7 + } + ); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_serialize_deserialize_10(Eurydice_borrow_slice_u8 bytes) +{ + int16_t_x8 + v0_7 = + libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)10U }))); + int16_t_x8 + v8_15 = + libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)10U, .end = (size_t)20U }))); + return + ( + KRML_CLITERAL(Eurydice_arr_d6){ + .data = { + v0_7.fst, v0_7.snd, v0_7.thd, v0_7.f3, v0_7.f4, v0_7.f5, v0_7.f6, v0_7.f7, v8_15.fst, + v8_15.snd, v8_15.thd, v8_15.f3, v8_15.f4, v8_15.f5, v8_15.f6, v8_15.f7 + } + } + ); +} + +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_deserialize_10(Eurydice_borrow_slice_u8 a) +{ + return + libcrux_ml_kem_vector_portable_serialize_deserialize_10(libcrux_secrets_int_classify_public_classify_ref_6d_90(a)); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_deserialize_10_b8(Eurydice_borrow_slice_u8 a) +{ + return libcrux_ml_kem_vector_portable_deserialize_10(a); +} + +static KRML_MUSTINLINE uint8_t_x3 +libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_borrow_slice_i16 v) +{ + uint8_t r0 = libcrux_secrets_int_as_u8_f5(v.ptr[0U] & 255); + uint8_t + r1 = + libcrux_secrets_int_as_u8_f5(v.ptr[0U] >> 8U | (int16_t)((uint32_t)(v.ptr[1U] & 15) << 4U)); + uint8_t r2 = libcrux_secrets_int_as_u8_f5(v.ptr[1U] >> 4U & 255); + return (KRML_CLITERAL(uint8_t_x3){ .fst = r0, .snd = r1, .thd = r2 }); +} + +static KRML_MUSTINLINE Eurydice_arr_94 +libcrux_ml_kem_vector_portable_serialize_serialize_12(Eurydice_arr_d6 v) +{ + uint8_t_x3 + r0_2 = + libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)2U }))); + uint8_t_x3 + r3_5 = + libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)2U, .end = (size_t)4U }))); + uint8_t_x3 + r6_8 = + libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)4U, .end = (size_t)6U }))); + uint8_t_x3 + r9_11 = + libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)6U, .end = (size_t)8U }))); + uint8_t_x3 + r12_14 = + libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)8U, .end = (size_t)10U }))); + uint8_t_x3 + r15_17 = + libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)10U, .end = (size_t)12U }))); + uint8_t_x3 + r18_20 = + libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)12U, .end = (size_t)14U }))); + uint8_t_x3 + r21_23 = + libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_array_to_subslice_shared_e7(&v, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)14U, .end = (size_t)16U }))); + return + ( + KRML_CLITERAL(Eurydice_arr_94){ + .data = { + r0_2.fst, r0_2.snd, r0_2.thd, r3_5.fst, r3_5.snd, r3_5.thd, r6_8.fst, r6_8.snd, r6_8.thd, + r9_11.fst, r9_11.snd, r9_11.thd, r12_14.fst, r12_14.snd, r12_14.thd, r15_17.fst, + r15_17.snd, r15_17.thd, r18_20.fst, r18_20.snd, r18_20.thd, r21_23.fst, r21_23.snd, + r21_23.thd + } + } + ); +} + +static inline Eurydice_arr_94 libcrux_ml_kem_vector_portable_serialize_12(Eurydice_arr_d6 a) +{ + return + libcrux_secrets_int_public_integers_declassify_d8_40(libcrux_ml_kem_vector_portable_serialize_serialize_12(a)); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_94 libcrux_ml_kem_vector_portable_serialize_12_b8(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_serialize_12(a); +} + +static KRML_MUSTINLINE int16_t_x2 +libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_borrow_slice_u8 bytes) +{ + int16_t byte0 = libcrux_secrets_int_as_i16_59(bytes.ptr[0U]); + int16_t byte1 = libcrux_secrets_int_as_i16_59(bytes.ptr[1U]); + int16_t byte2 = libcrux_secrets_int_as_i16_59(bytes.ptr[2U]); + int16_t r0 = (int16_t)((uint32_t)(byte1 & 15) << 8U) | (byte0 & 255); + int16_t r1 = (int16_t)((uint32_t)byte2 << 4U) | (byte1 >> 4U & 15); + return (KRML_CLITERAL(int16_t_x2){ .fst = r0, .snd = r1 }); +} + +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_serialize_deserialize_12(Eurydice_borrow_slice_u8 bytes) +{ + int16_t_x2 + v0_1 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)3U }))); + int16_t_x2 + v2_3 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)3U, .end = (size_t)6U }))); + int16_t_x2 + v4_5 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)6U, .end = (size_t)9U }))); + int16_t_x2 + v6_7 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)9U, .end = (size_t)12U }))); + int16_t_x2 + v8_9 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)12U, .end = (size_t)15U }))); + int16_t_x2 + v10_11 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)15U, .end = (size_t)18U }))); + int16_t_x2 + v12_13 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)18U, .end = (size_t)21U }))); + int16_t_x2 + v14_15 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice_subslice_shared_c8(bytes, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)21U, .end = (size_t)24U }))); + return + ( + KRML_CLITERAL(Eurydice_arr_d6){ + .data = { + v0_1.fst, v0_1.snd, v2_3.fst, v2_3.snd, v4_5.fst, v4_5.snd, v6_7.fst, v6_7.snd, v8_9.fst, + v8_9.snd, v10_11.fst, v10_11.snd, v12_13.fst, v12_13.snd, v14_15.fst, v14_15.snd + } + } + ); +} + +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_deserialize_12(Eurydice_borrow_slice_u8 a) +{ + return + libcrux_ml_kem_vector_portable_serialize_deserialize_12(libcrux_secrets_int_classify_public_classify_ref_6d_90(a)); +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_deserialize_12_b8(Eurydice_borrow_slice_u8 a) +{ + return libcrux_ml_kem_vector_portable_deserialize_12(a); +} + +static KRML_MUSTINLINE size_t +libcrux_ml_kem_vector_portable_sampling_rej_sample( + Eurydice_borrow_slice_u8 a, + Eurydice_mut_borrow_slice_i16 result +) +{ + size_t sampled = (size_t)0U; + for (size_t i = (size_t)0U; i < a.meta / (size_t)3U; i++) + { + size_t i0 = i; + int16_t b1 = (int16_t)(uint32_t)a.ptr[i0 * (size_t)3U + (size_t)0U]; + int16_t b2 = (int16_t)(uint32_t)a.ptr[i0 * (size_t)3U + (size_t)1U]; + int16_t b3 = (int16_t)(uint32_t)a.ptr[i0 * (size_t)3U + (size_t)2U]; + int16_t d1 = (int16_t)((uint32_t)(b2 & 15) << 8U) | b1; + int16_t d2 = (int16_t)((uint32_t)b3 << 4U) | b2 >> 4U; + if (d1 < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS) + { + if (sampled < (size_t)16U) + { + result.ptr[sampled] = d1; + sampled++; + } + } + if (d2 < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS) + { + if (sampled < (size_t)16U) + { + result.ptr[sampled] = d2; + sampled++; + } + } + } + return sampled; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +static inline size_t +libcrux_ml_kem_vector_portable_rej_sample_b8( + Eurydice_borrow_slice_u8 a, + Eurydice_mut_borrow_slice_i16 out +) +{ + return libcrux_ml_kem_vector_portable_sampling_rej_sample(a, out); +} + +#define LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR ((size_t)10U) + +#define LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR / (size_t)8U) + +#define LIBCRUX_ML_KEM_MLKEM768_RANK ((size_t)3U) + +#define LIBCRUX_ML_KEM_MLKEM768_C1_SIZE (LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE * LIBCRUX_ML_KEM_MLKEM768_RANK) + +#define LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR ((size_t)4U) + +#define LIBCRUX_ML_KEM_MLKEM768_C2_SIZE (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR / (size_t)8U) + +#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE (LIBCRUX_ML_KEM_MLKEM768_C1_SIZE + LIBCRUX_ML_KEM_MLKEM768_C2_SIZE) + +#define LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE (LIBCRUX_ML_KEM_MLKEM768_RANK * LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U) + +#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE (LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE + (size_t)32U) + +#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE (LIBCRUX_ML_KEM_MLKEM768_RANK * LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U) + +#define LIBCRUX_ML_KEM_MLKEM768_ETA1 ((size_t)2U) + +#define LIBCRUX_ML_KEM_MLKEM768_ETA1_RANDOMNESS_SIZE (LIBCRUX_ML_KEM_MLKEM768_ETA1 * (size_t)64U) + +#define LIBCRUX_ML_KEM_MLKEM768_ETA2 ((size_t)2U) + +#define LIBCRUX_ML_KEM_MLKEM768_ETA2_RANDOMNESS_SIZE (LIBCRUX_ML_KEM_MLKEM768_ETA2 * (size_t)64U) + +#define LIBCRUX_ML_KEM_MLKEM768_IMPLICIT_REJECTION_HASH_INPUT_SIZE (LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE + LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE) + +typedef Eurydice_arr_7d libcrux_ml_kem_mlkem768_MlKem768PrivateKey; + +typedef Eurydice_arr_5f libcrux_ml_kem_mlkem768_MlKem768PublicKey; + +#define LIBCRUX_ML_KEM_MLKEM768_RANKED_BYTES_PER_RING_ELEMENT (LIBCRUX_ML_KEM_MLKEM768_RANK * LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U) + +#define LIBCRUX_ML_KEM_MLKEM768_SECRET_KEY_SIZE (LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE + LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE) + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- $16size_t +*/ +typedef struct Eurydice_arr_9e_s { Eurydice_arr_d6 data[16U]; } Eurydice_arr_9e; + +/** +A monomorphic instance of Eurydice.arr +with types libcrux_ml_kem_polynomial_PolynomialRingElement_1d +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_bb0_s { Eurydice_arr_9e data[3U]; } Eurydice_arr_bb0; + +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.ZERO_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static inline Eurydice_arr_9e libcrux_ml_kem_polynomial_ZERO_d6_ea(void) +{ + Eurydice_arr_9e lit; + Eurydice_arr_d6 repeat_expression[16U]; + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + repeat_expression[i] = libcrux_ml_kem_vector_portable_ZERO_b8(); + } + memcpy(lit.data, repeat_expression, (size_t)16U * sizeof (Eurydice_arr_d6)); + return lit; +} + +/** +This function found in impl {core::ops::function::FnMut<(usize), libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]> for libcrux_ml_kem::ind_cpa::decrypt::closure[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt.call_mut_0b +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- VECTOR_U_ENCODED_SIZE= 960 +- U_COMPRESSION_FACTOR= 10 +- V_COMPRESSION_FACTOR= 4 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_ind_cpa_decrypt_call_mut_0b_01(void **_, size_t tupled_args) +{ + return libcrux_ml_kem_polynomial_ZERO_d6_ea(); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_to_uncompressed_ring_element +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_ea( + Eurydice_borrow_slice_u8 serialized +) +{ + Eurydice_arr_9e re = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + for (size_t i = (size_t)0U; i < serialized.meta / (size_t)24U; i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)24U, + .end = i0 * (size_t)24U + (size_t)24U + } + )); + Eurydice_arr_d6 uu____0 = libcrux_ml_kem_vector_portable_deserialize_12_b8(bytes); + re.data[i0] = uu____0; + } + return re; +} + +/** + Call [`deserialize_to_uncompressed_ring_element`] for each ring element. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_vector +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cpa_deserialize_vector_68( + Eurydice_borrow_slice_u8 secret_key, + Eurydice_arr_bb0 *secret_as_ntt +) +{ + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + Eurydice_arr_9e + uu____0 = + libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_ea(Eurydice_slice_subslice_shared_c8(secret_key, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, + .end = (i0 + (size_t)1U) * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT + } + ))); + secret_as_ntt->data[i0] = uu____0; + } +} + +/** +This function found in impl {core::ops::function::FnMut<(usize), libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]> for libcrux_ml_kem::ind_cpa::deserialize_then_decompress_u::closure[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u.call_mut_35 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- U_COMPRESSION_FACTOR= 10 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_call_mut_35_30( + void **_, + size_t tupled_args +) +{ + return libcrux_ml_kem_polynomial_ZERO_d6_ea(); +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient +with const generics +- COEFFICIENT_BITS= 10 +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_ef(Eurydice_arr_d6 a) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + int32_t + decompressed = + libcrux_secrets_int_as_i32_f5(a.data[i0]) * + libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_public_integers_classify_27_39(LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS)); + decompressed = (int32_t)((uint32_t)decompressed << 1U) + (int32_t)((uint32_t)1 << (uint32_t)10); + decompressed >>= (uint32_t)(10 + 1); + a.data[i0] = libcrux_secrets_int_as_i16_36(decompressed); + } + return a; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_b8 +with const generics +- COEFFICIENT_BITS= 10 +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_ef(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_ef(a); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_10 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_serialize_deserialize_then_decompress_10_ea(Eurydice_borrow_slice_u8 serialized) +{ + Eurydice_arr_9e re = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + for (size_t i = (size_t)0U; i < serialized.meta / (size_t)20U; i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)20U, + .end = i0 * (size_t)20U + (size_t)20U + } + )); + Eurydice_arr_d6 coefficient = libcrux_ml_kem_vector_portable_deserialize_10_b8(bytes); + Eurydice_arr_d6 + uu____0 = libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_ef(coefficient); + re.data[i0] = uu____0; + } + return re; +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_u +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- COMPRESSION_FACTOR= 10 +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_f7( + Eurydice_borrow_slice_u8 serialized +) +{ + return libcrux_ml_kem_serialize_deserialize_then_decompress_10_ea(serialized); +} + +typedef struct libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2_s +{ + Eurydice_arr_d6 fst; + Eurydice_arr_d6 snd; +} +libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2; + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_layer_int_vec_step +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 +libcrux_ml_kem_ntt_ntt_layer_int_vec_step_ea( + Eurydice_arr_d6 a, + Eurydice_arr_d6 b, + int16_t zeta_r +) +{ + Eurydice_arr_d6 + t = libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(b, zeta_r); + b = libcrux_ml_kem_vector_portable_sub_b8(a, &t); + a = libcrux_ml_kem_vector_portable_add_b8(a, &t); + return + ( + KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){ + .fst = a, + .snd = b + } + ); +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_4_plus +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea( + size_t *zeta_i, + Eurydice_arr_9e *re, + size_t layer, + size_t _initial_coefficient_bound +) +{ + size_t step = (size_t)1U << (uint32_t)layer; + for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) + { + size_t round = i0; + zeta_i[0U]++; + size_t offset = round * step * (size_t)2U; + size_t offset_vec = offset / (size_t)16U; + size_t step_vec = step / (size_t)16U; + for (size_t i = offset_vec; i < offset_vec + step_vec; i++) + { + size_t j = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 + uu____0 = + libcrux_ml_kem_ntt_ntt_layer_int_vec_step_ea(re->data[j], + re->data[j + step_vec], + libcrux_ml_kem_polynomial_zeta(zeta_i[0U])); + Eurydice_arr_d6 x = uu____0.fst; + Eurydice_arr_d6 y = uu____0.snd; + re->data[j] = x; + re->data[j + step_vec] = y; + } + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_3 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ntt_ntt_at_layer_3_ea( + size_t *zeta_i, + Eurydice_arr_9e *re, + size_t _initial_coefficient_bound +) +{ + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t round = i; + zeta_i[0U]++; + Eurydice_arr_d6 + uu____0 = + libcrux_ml_kem_vector_portable_ntt_layer_3_step_b8(re->data[round], + libcrux_ml_kem_polynomial_zeta(zeta_i[0U])); + re->data[round] = uu____0; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_2 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ntt_ntt_at_layer_2_ea( + size_t *zeta_i, + Eurydice_arr_9e *re, + size_t _initial_coefficient_bound +) +{ + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t round = i; + zeta_i[0U]++; + re->data[round] = + libcrux_ml_kem_vector_portable_ntt_layer_2_step_b8(re->data[round], + libcrux_ml_kem_polynomial_zeta(zeta_i[0U]), + libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)1U)); + zeta_i[0U]++; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_1 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ntt_ntt_at_layer_1_ea( + size_t *zeta_i, + Eurydice_arr_9e *re, + size_t _initial_coefficient_bound +) +{ + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t round = i; + zeta_i[0U]++; + re->data[round] = + libcrux_ml_kem_vector_portable_ntt_layer_1_step_b8(re->data[round], + libcrux_ml_kem_polynomial_zeta(zeta_i[0U]), + libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)1U), + libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)2U), + libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)3U)); + zeta_i[0U] += (size_t)3U; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.poly_barrett_reduce +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_poly_barrett_reduce_ea(Eurydice_arr_9e *myself) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + Eurydice_arr_d6 uu____0 = libcrux_ml_kem_vector_portable_barrett_reduce_b8(myself->data[i0]); + myself->data[i0] = uu____0; + } +} + +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.poly_barrett_reduce_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(Eurydice_arr_9e *self) +{ + libcrux_ml_kem_polynomial_poly_barrett_reduce_ea(self); +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_vector_u +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- VECTOR_U_COMPRESSION_FACTOR= 10 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_vector_u_f7(Eurydice_arr_9e *re) +{ + size_t zeta_i = (size_t)0U; + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)7U, (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)6U, (size_t)2U * (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)5U, (size_t)3U * (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)4U, (size_t)4U * (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_3_ea(&zeta_i, re, (size_t)5U * (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_2_ea(&zeta_i, re, (size_t)6U * (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_1_ea(&zeta_i, re, (size_t)7U * (size_t)3328U); + libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re); +} + +/** + Call [`deserialize_then_decompress_ring_element_u`] on each ring element + in the `ciphertext`. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- U_COMPRESSION_FACTOR= 10 +*/ +static KRML_MUSTINLINE Eurydice_arr_bb0 +libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_30(const Eurydice_arr_2b *ciphertext) +{ + Eurydice_arr_bb0 arr_struct; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct.data[i] = + libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_call_mut_35_30(&lvalue, + i); + } + Eurydice_arr_bb0 u_as_ntt = arr_struct; + for + (size_t + i = (size_t)0U; + i < + (size_t)1088U / + (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * (size_t)10U / (size_t)8U); + i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + u_bytes = + Eurydice_array_to_subslice_shared_d44(ciphertext, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * + (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * (size_t)10U / (size_t)8U), + .end = i0 * + (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * (size_t)10U / (size_t)8U) + + LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * (size_t)10U / (size_t)8U + } + )); + u_as_ntt.data[i0] = + libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_f7(u_bytes); + libcrux_ml_kem_ntt_ntt_vector_u_f7(&u_as_ntt.data[i0]); + } + return u_as_ntt; +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient +with const generics +- COEFFICIENT_BITS= 4 +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_d1(Eurydice_arr_d6 a) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + int32_t + decompressed = + libcrux_secrets_int_as_i32_f5(a.data[i0]) * + libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_public_integers_classify_27_39(LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS)); + decompressed = (int32_t)((uint32_t)decompressed << 1U) + (int32_t)((uint32_t)1 << (uint32_t)4); + decompressed >>= (uint32_t)(4 + 1); + a.data[i0] = libcrux_secrets_int_as_i16_36(decompressed); + } + return a; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_b8 +with const generics +- COEFFICIENT_BITS= 4 +*/ +static inline Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_d1(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_d1(a); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_4 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_serialize_deserialize_then_decompress_4_ea(Eurydice_borrow_slice_u8 serialized) +{ + Eurydice_arr_9e re = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + for (size_t i = (size_t)0U; i < serialized.meta / (size_t)8U; i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)8U, + .end = i0 * (size_t)8U + (size_t)8U + } + )); + Eurydice_arr_d6 coefficient = libcrux_ml_kem_vector_portable_deserialize_4_b8(bytes); + Eurydice_arr_d6 + uu____0 = libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_d1(coefficient); + re.data[i0] = uu____0; + } + return re; +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_v +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- COMPRESSION_FACTOR= 4 +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_b6( + Eurydice_borrow_slice_u8 serialized +) +{ + return libcrux_ml_kem_serialize_deserialize_then_decompress_4_ea(serialized); +} + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.ZERO +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static inline Eurydice_arr_9e libcrux_ml_kem_polynomial_ZERO_ea(void) +{ + Eurydice_arr_9e lit; + Eurydice_arr_d6 repeat_expression[16U]; + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + repeat_expression[i] = libcrux_ml_kem_vector_portable_ZERO_b8(); + } + memcpy(lit.data, repeat_expression, (size_t)16U * sizeof (Eurydice_arr_d6)); + return lit; +} + +/** + Given two `KyberPolynomialRingElement`s in their NTT representations, + compute their product. Given two polynomials in the NTT domain `f^` and `ĵ`, + the `iᵗʰ` coefficient of the product `k̂` is determined by the calculation: + + ```plaintext + ĥ[2·i] + ĥ[2·i + 1]X = (f^[2·i] + f^[2·i + 1]X)·(ĝ[2·i] + ĝ[2·i + 1]X) mod (X² - ζ^(2·BitRev₇(i) + 1)) + ``` + + This function almost implements Algorithm 10 of the + NIST FIPS 203 standard, which is reproduced below: + + ```plaintext + Input: Two arrays fˆ ∈ ℤ₂₅₆ and ĝ ∈ ℤ₂₅₆. + Output: An array ĥ ∈ ℤq. + + for(i ← 0; i < 128; i++) + (ĥ[2i], ĥ[2i+1]) ← BaseCaseMultiply(fˆ[2i], fˆ[2i+1], ĝ[2i], ĝ[2i+1], ζ^(2·BitRev₇(i) + 1)) + end for + return ĥ + ``` + We say "almost" because the coefficients of the ring element output by + this function are in the Montgomery domain. + + The NIST FIPS 203 standard can be found at + . +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.ntt_multiply +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_polynomial_ntt_multiply_ea( + const Eurydice_arr_9e *myself, + const Eurydice_arr_9e *rhs +) +{ + Eurydice_arr_9e out = libcrux_ml_kem_polynomial_ZERO_ea(); + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + uu____0 = + libcrux_ml_kem_vector_portable_ntt_multiply_b8(&myself->data[i0], + &rhs->data[i0], + libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0), + libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 + (size_t)1U), + libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 + (size_t)2U), + libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 + (size_t)3U)); + out.data[i0] = uu____0; + } + return out; +} + +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.ntt_multiply_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_polynomial_ntt_multiply_d6_ea( + const Eurydice_arr_9e *self, + const Eurydice_arr_9e *rhs +) +{ + return libcrux_ml_kem_polynomial_ntt_multiply_ea(self, rhs); +} + +/** + Given two polynomial ring elements `lhs` and `rhs`, compute the pointwise + sum of their constituent coefficients. +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_to_ring_element +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_add_to_ring_element_68( + Eurydice_arr_9e *myself, + const Eurydice_arr_9e *rhs +) +{ + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + uu____0 = libcrux_ml_kem_vector_portable_add_b8(myself->data[i0], &rhs->data[i0]); + myself->data[i0] = uu____0; + } +} + +/** + Given two polynomial ring elements `lhs` and `rhs`, compute the pointwise + sum of their constituent coefficients. +*/ +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_to_ring_element_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_add_to_ring_element_d6_68( + Eurydice_arr_9e *self, + const Eurydice_arr_9e *rhs +) +{ + libcrux_ml_kem_polynomial_add_to_ring_element_68(self, rhs); +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_1 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_ea(size_t *zeta_i, Eurydice_arr_9e *re) +{ + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t round = i; + zeta_i[0U]--; + re->data[round] = + libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_b8(re->data[round], + libcrux_ml_kem_polynomial_zeta(zeta_i[0U]), + libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)1U), + libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)2U), + libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)3U)); + zeta_i[0U] -= (size_t)3U; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_2 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_ea(size_t *zeta_i, Eurydice_arr_9e *re) +{ + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t round = i; + zeta_i[0U]--; + re->data[round] = + libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_b8(re->data[round], + libcrux_ml_kem_polynomial_zeta(zeta_i[0U]), + libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)1U)); + zeta_i[0U]--; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_3 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_ea(size_t *zeta_i, Eurydice_arr_9e *re) +{ + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t round = i; + zeta_i[0U]--; + Eurydice_arr_d6 + uu____0 = + libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_b8(re->data[round], + libcrux_ml_kem_polynomial_zeta(zeta_i[0U])); + re->data[round] = uu____0; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.inv_ntt_layer_int_vec_step_reduce +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 +libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_ea( + Eurydice_arr_d6 a, + Eurydice_arr_d6 b, + int16_t zeta_r +) +{ + Eurydice_arr_d6 a_minus_b = libcrux_ml_kem_vector_portable_sub_b8(b, &a); + a = + libcrux_ml_kem_vector_portable_barrett_reduce_b8(libcrux_ml_kem_vector_portable_add_b8(a, &b)); + b = libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(a_minus_b, zeta_r); + return + ( + KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){ + .fst = a, + .snd = b + } + ); +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_4_plus +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea( + size_t *zeta_i, + Eurydice_arr_9e *re, + size_t layer +) +{ + size_t step = (size_t)1U << (uint32_t)layer; + for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) + { + size_t round = i0; + zeta_i[0U]--; + size_t offset = round * step * (size_t)2U; + size_t offset_vec = offset / LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; + size_t step_vec = step / LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; + for (size_t i = offset_vec; i < offset_vec + step_vec; i++) + { + size_t j = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 + uu____0 = + libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_ea(re->data[j], + re->data[j + step_vec], + libcrux_ml_kem_polynomial_zeta(zeta_i[0U])); + Eurydice_arr_d6 x = uu____0.fst; + Eurydice_arr_d6 y = uu____0.snd; + re->data[j] = x; + re->data[j + step_vec] = y; + } + } +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_montgomery +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_68(Eurydice_arr_9e *re) +{ + size_t zeta_i = LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / (size_t)2U; + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_ea(&zeta_i, re); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_ea(&zeta_i, re); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_ea(&zeta_i, re); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)4U); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)5U); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)6U); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)7U); + libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re); +} + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.subtract_reduce +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_polynomial_subtract_reduce_ea(const Eurydice_arr_9e *myself, Eurydice_arr_9e b) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + coefficient_normal_form = + libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(b.data[i0], + 1441); + Eurydice_arr_d6 + diff = libcrux_ml_kem_vector_portable_sub_b8(myself->data[i0], &coefficient_normal_form); + Eurydice_arr_d6 red = libcrux_ml_kem_vector_portable_barrett_reduce_b8(diff); + b.data[i0] = red; + } + return b; +} + +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.subtract_reduce_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_polynomial_subtract_reduce_d6_ea(const Eurydice_arr_9e *self, Eurydice_arr_9e b) +{ + return libcrux_ml_kem_polynomial_subtract_reduce_ea(self, b); +} + +/** + The following functions compute various expressions involving + vectors and matrices. The computation of these expressions has been + abstracted away into these functions in order to save on loop iterations. + Compute v − InverseNTT(sᵀ ◦ NTT(u)) +*/ +/** +A monomorphic instance of libcrux_ml_kem.matrix.compute_message +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_matrix_compute_message_68( + const Eurydice_arr_9e *v, + const Eurydice_arr_bb0 *secret_as_ntt, + const Eurydice_arr_bb0 *u_as_ntt +) +{ + Eurydice_arr_9e result = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + Eurydice_arr_9e + product = + libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(&secret_as_ntt->data[i0], + &u_as_ntt->data[i0]); + libcrux_ml_kem_polynomial_add_to_ring_element_d6_68(&result, &product); + } + libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_68(&result); + return libcrux_ml_kem_polynomial_subtract_reduce_d6_ea(v, result); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.to_unsigned_field_modulus +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_to_unsigned_representative_b8(a); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_message +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_serialize_compress_then_serialize_message_ea(Eurydice_arr_9e re) +{ + Eurydice_arr_ec serialized = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + coefficient = libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(re.data[i0]); + Eurydice_arr_d6 + coefficient_compressed = libcrux_ml_kem_vector_portable_compress_1_b8(coefficient); + Eurydice_array_u8x2 + bytes = libcrux_ml_kem_vector_portable_serialize_1_b8(coefficient_compressed); + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d46(&serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)2U * i0, + .end = (size_t)2U * i0 + (size_t)2U + } + )), + Eurydice_array_to_slice_shared_82(&bytes), + uint8_t); + } + return serialized; +} + +/** + This function implements Algorithm 14 of the + NIST FIPS 203 specification; this is the Kyber CPA-PKE decryption algorithm. + + Algorithm 14 is reproduced below: + + ```plaintext + Input: decryption key dkₚₖₑ ∈ 𝔹^{384k}. + Input: ciphertext c ∈ 𝔹^{32(dᵤk + dᵥ)}. + Output: message m ∈ 𝔹^{32}. + + c₁ ← c[0 : 32dᵤk] + c₂ ← c[32dᵤk : 32(dᵤk + dᵥ)] + u ← Decompress_{dᵤ}(ByteDecode_{dᵤ}(c₁)) + v ← Decompress_{dᵥ}(ByteDecode_{dᵥ}(c₂)) + ŝ ← ByteDecode₁₂(dkₚₖₑ) + w ← v - NTT-¹(ŝᵀ ◦ NTT(u)) + m ← ByteEncode₁(Compress₁(w)) + return m + ``` + + The NIST FIPS 203 standard can be found at + . +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt_unpacked +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- VECTOR_U_ENCODED_SIZE= 960 +- U_COMPRESSION_FACTOR= 10 +- V_COMPRESSION_FACTOR= 4 +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_ind_cpa_decrypt_unpacked_01( + const Eurydice_arr_bb0 *secret_key, + const Eurydice_arr_2b *ciphertext +) +{ + Eurydice_arr_bb0 + u_as_ntt = libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_30(ciphertext); + Eurydice_arr_9e + v = + libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_b6(Eurydice_array_to_subslice_from_shared_5f0(ciphertext, + (size_t)960U)); + Eurydice_arr_9e message = libcrux_ml_kem_matrix_compute_message_68(&v, secret_key, &u_as_ntt); + return libcrux_ml_kem_serialize_compress_then_serialize_message_ea(message); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- VECTOR_U_ENCODED_SIZE= 960 +- U_COMPRESSION_FACTOR= 10 +- V_COMPRESSION_FACTOR= 4 +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_ind_cpa_decrypt_01( + Eurydice_borrow_slice_u8 secret_key, + const Eurydice_arr_2b *ciphertext +) +{ + Eurydice_arr_bb0 arr_struct; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct.data[i] = libcrux_ml_kem_ind_cpa_decrypt_call_mut_0b_01(&lvalue, i); + } + Eurydice_arr_bb0 secret_key_unpacked = arr_struct; + libcrux_ml_kem_ind_cpa_deserialize_vector_68(secret_key, &secret_key_unpacked); + return libcrux_ml_kem_ind_cpa_decrypt_unpacked_01(&secret_key_unpacked, ciphertext); +} + +/** +This function found in impl {libcrux_ml_kem::hash_functions::Hash for libcrux_ml_kem::hash_functions::portable::PortableHash} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.G_4a +with const generics +- K= 3 +*/ +static inline Eurydice_arr_c7 +libcrux_ml_kem_hash_functions_portable_G_4a_78(Eurydice_borrow_slice_u8 input) +{ + return libcrux_ml_kem_hash_functions_portable_G(input); +} + +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF +with const generics +- LEN= 32 +*/ +static inline Eurydice_arr_ec +libcrux_ml_kem_hash_functions_portable_PRF_ce(Eurydice_borrow_slice_u8 input) +{ + Eurydice_arr_ec digest = { .data = { 0U } }; + libcrux_sha3_portable_shake256(Eurydice_array_to_slice_mut_01(&digest), input); + return digest; +} + +/** +This function found in impl {libcrux_ml_kem::hash_functions::Hash for libcrux_ml_kem::hash_functions::portable::PortableHash} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_4a +with const generics +- K= 3 +- LEN= 32 +*/ +static inline Eurydice_arr_ec +libcrux_ml_kem_hash_functions_portable_PRF_4a_3b(Eurydice_borrow_slice_u8 input) +{ + return libcrux_ml_kem_hash_functions_portable_PRF_ce(input); +} + +/** +A monomorphic instance of Eurydice.arr +with types Eurydice_arr_bb0 +with const generics +- $3size_t +*/ +typedef struct Eurydice_arr_c10_s { Eurydice_arr_bb0 data[3U]; } Eurydice_arr_c10; + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.IndCpaPublicKeyUnpacked +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- $3size_t +*/ +typedef struct libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51_s +{ + Eurydice_arr_bb0 t_as_ntt; + Eurydice_arr_ec seed_for_A; + Eurydice_arr_c10 A; +} +libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51; + +/** +This function found in impl {core::default::Default for libcrux_ml_kem::ind_cpa::unpacked::IndCpaPublicKeyUnpacked[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.default_8b +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 +libcrux_ml_kem_ind_cpa_unpacked_default_8b_68(void) +{ + Eurydice_arr_bb0 uu____0; + Eurydice_arr_9e repeat_expression0[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + repeat_expression0[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + } + memcpy(uu____0.data, repeat_expression0, (size_t)3U * sizeof (Eurydice_arr_9e)); + Eurydice_arr_ec uu____1 = { .data = { 0U } }; + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 lit0; + lit0.t_as_ntt = uu____0; + lit0.seed_for_A = uu____1; + Eurydice_arr_bb0 repeat_expression1[3U]; + for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) + { + Eurydice_arr_bb0 lit; + Eurydice_arr_9e repeat_expression[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + repeat_expression[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + } + memcpy(lit.data, repeat_expression, (size_t)3U * sizeof (Eurydice_arr_9e)); + repeat_expression1[i0] = lit; + } + memcpy(lit0.A.data, repeat_expression1, (size_t)3U * sizeof (Eurydice_arr_bb0)); + return lit0; +} + +/** + Only use with public values. + + This MUST NOT be used with secret inputs, like its caller `deserialize_ring_elements_reduced`. +*/ +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_to_reduced_ring_element +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_ea( + Eurydice_borrow_slice_u8 serialized +) +{ + Eurydice_arr_9e re = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + for (size_t i = (size_t)0U; i < serialized.meta / (size_t)24U; i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + bytes = + Eurydice_slice_subslice_shared_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)24U, + .end = i0 * (size_t)24U + (size_t)24U + } + )); + Eurydice_arr_d6 coefficient = libcrux_ml_kem_vector_portable_deserialize_12_b8(bytes); + Eurydice_arr_d6 uu____0 = libcrux_ml_kem_vector_portable_cond_subtract_3329_b8(coefficient); + re.data[i0] = uu____0; + } + return re; +} + +/** + See [deserialize_ring_elements_reduced_out]. +*/ +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_ring_elements_reduced +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_68( + Eurydice_borrow_slice_u8 public_key, + Eurydice_arr_bb0 *deserialized_pk +) +{ + for + (size_t + i = (size_t)0U; + i < public_key.meta / LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT; + i++) + { + size_t i0 = i; + Eurydice_borrow_slice_u8 + ring_element = + Eurydice_slice_subslice_shared_c8(public_key, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, + .end = i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT + + LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT + } + )); + Eurydice_arr_9e + uu____0 = libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_ea(ring_element); + deserialized_pk->data[i0] = uu____0; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.shake128_init_absorb_final +with const generics +- K= 3 +*/ +static inline Eurydice_arr_1b0 +libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_78( + const Eurydice_arr_810 *input +) +{ + Eurydice_arr_1b0 shake128_state; + Eurydice_arr_7c repeat_expression[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + repeat_expression[i] = libcrux_sha3_portable_incremental_shake128_init(); + } + memcpy(shake128_state.data, repeat_expression, (size_t)3U * sizeof (Eurydice_arr_7c)); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + libcrux_sha3_portable_incremental_shake128_absorb_final(&shake128_state.data[i0], + Eurydice_array_to_slice_shared_e9(&input->data[i0])); + } + return shake128_state; +} + +/** +This function found in impl {libcrux_ml_kem::hash_functions::Hash for libcrux_ml_kem::hash_functions::portable::PortableHash} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.shake128_init_absorb_final_4a +with const generics +- K= 3 +*/ +static inline Eurydice_arr_1b0 +libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_4a_78( + const Eurydice_arr_810 *input +) +{ + return libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_78(input); +} + +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.shake128_squeeze_first_three_blocks +with const generics +- K= 3 +*/ +static inline Eurydice_arr_7e +libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_78( + Eurydice_arr_1b0 *st +) +{ + Eurydice_arr_7e + out = { .data = { { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } } }; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks(&st->data[i0], + Eurydice_array_to_slice_mut_48(&out.data[i0])); + } + return out; +} + +/** +This function found in impl {libcrux_ml_kem::hash_functions::Hash for libcrux_ml_kem::hash_functions::portable::PortableHash} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.shake128_squeeze_first_three_blocks_4a +with const generics +- K= 3 +*/ +static inline Eurydice_arr_7e +libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_4a_78( + Eurydice_arr_1b0 *self +) +{ + return libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_78(self); +} + +/** + If `bytes` contains a set of uniformly random bytes, this function + uniformly samples a ring element `â` that is treated as being the NTT representation + of the corresponding polynomial `a`. + + Since rejection sampling is used, it is possible the supplied bytes are + not enough to sample the element, in which case an `Err` is returned and the + caller must try again with a fresh set of bytes. + + This function partially implements Algorithm 6 of the NIST FIPS 203 standard, + We say "partially" because this implementation only accepts a finite set of + bytes as input and returns an error if the set is not enough; Algorithm 6 of + the FIPS 203 standard on the other hand samples from an infinite stream of bytes + until the ring element is filled. Algorithm 6 is reproduced below: + + ```plaintext + Input: byte stream B ∈ 𝔹*. + Output: array â ∈ ℤ₂₅₆. + + i ← 0 + j ← 0 + while j < 256 do + d₁ ← B[i] + 256·(B[i+1] mod 16) + d₂ ← ⌊B[i+1]/16⌋ + 16·B[i+2] + if d₁ < q then + â[j] ← d₁ + j ← j + 1 + end if + if d₂ < q and j < 256 then + â[j] ← d₂ + j ← j + 1 + end if + i ← i + 3 + end while + return â + ``` + + The NIST FIPS 203 standard can be found at + . +*/ +/** +A monomorphic instance of libcrux_ml_kem.sampling.sample_from_uniform_distribution_next +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- N= 504 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_b6( + const Eurydice_arr_7e *randomness, + Eurydice_arr_eb *sampled_coefficients, + Eurydice_arr_b1 *out +) +{ + for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)504U / (size_t)24U; i++) + { + size_t r = i; + if (sampled_coefficients->data[i1] < LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) + { + size_t + sampled = + libcrux_ml_kem_vector_portable_rej_sample_b8(Eurydice_array_to_subslice_shared_d45(&randomness->data[i1], + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = r * (size_t)24U, + .end = r * (size_t)24U + (size_t)24U + } + )), + Eurydice_array_to_subslice_mut_e7(&out->data[i1], + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = sampled_coefficients->data[i1], + .end = sampled_coefficients->data[i1] + (size_t)16U + } + ))); + size_t uu____0 = i1; + sampled_coefficients->data[uu____0] += sampled; + } + } + } + bool done = true; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + if (sampled_coefficients->data[i0] >= LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) + { + sampled_coefficients->data[i0] = LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT; + } + else + { + done = false; + } + } + return done; +} + +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.shake128_squeeze_next_block +with const generics +- K= 3 +*/ +static inline Eurydice_arr_2c +libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_78(Eurydice_arr_1b0 *st) +{ + Eurydice_arr_2c + out = { .data = { { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } } }; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + libcrux_sha3_portable_incremental_shake128_squeeze_next_block(&st->data[i0], + Eurydice_array_to_slice_mut_2c(&out.data[i0])); + } + return out; +} + +/** +This function found in impl {libcrux_ml_kem::hash_functions::Hash for libcrux_ml_kem::hash_functions::portable::PortableHash} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.shake128_squeeze_next_block_4a +with const generics +- K= 3 +*/ +static inline Eurydice_arr_2c +libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_4a_78( + Eurydice_arr_1b0 *self +) +{ + return libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_78(self); +} + +/** + If `bytes` contains a set of uniformly random bytes, this function + uniformly samples a ring element `â` that is treated as being the NTT representation + of the corresponding polynomial `a`. + + Since rejection sampling is used, it is possible the supplied bytes are + not enough to sample the element, in which case an `Err` is returned and the + caller must try again with a fresh set of bytes. + + This function partially implements Algorithm 6 of the NIST FIPS 203 standard, + We say "partially" because this implementation only accepts a finite set of + bytes as input and returns an error if the set is not enough; Algorithm 6 of + the FIPS 203 standard on the other hand samples from an infinite stream of bytes + until the ring element is filled. Algorithm 6 is reproduced below: + + ```plaintext + Input: byte stream B ∈ 𝔹*. + Output: array â ∈ ℤ₂₅₆. + + i ← 0 + j ← 0 + while j < 256 do + d₁ ← B[i] + 256·(B[i+1] mod 16) + d₂ ← ⌊B[i+1]/16⌋ + 16·B[i+2] + if d₁ < q then + â[j] ← d₁ + j ← j + 1 + end if + if d₂ < q and j < 256 then + â[j] ← d₂ + j ← j + 1 + end if + i ← i + 3 + end while + return â + ``` + + The NIST FIPS 203 standard can be found at + . +*/ +/** +A monomorphic instance of libcrux_ml_kem.sampling.sample_from_uniform_distribution_next +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- N= 168 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_b60( + const Eurydice_arr_2c *randomness, + Eurydice_arr_eb *sampled_coefficients, + Eurydice_arr_b1 *out +) +{ + for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)24U; i++) + { + size_t r = i; + if (sampled_coefficients->data[i1] < LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) + { + size_t + sampled = + libcrux_ml_kem_vector_portable_rej_sample_b8(Eurydice_array_to_subslice_shared_d46(&randomness->data[i1], + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = r * (size_t)24U, + .end = r * (size_t)24U + (size_t)24U + } + )), + Eurydice_array_to_subslice_mut_e7(&out->data[i1], + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = sampled_coefficients->data[i1], + .end = sampled_coefficients->data[i1] + (size_t)16U + } + ))); + size_t uu____0 = i1; + sampled_coefficients->data[uu____0] += sampled; + } + } + } + bool done = true; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + if (sampled_coefficients->data[i0] >= LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) + { + sampled_coefficients->data[i0] = LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT; + } + else + { + done = false; + } + } + return done; +} + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.from_i16_array +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_polynomial_from_i16_array_ea(Eurydice_borrow_slice_i16 a) +{ + Eurydice_arr_9e result = libcrux_ml_kem_polynomial_ZERO_ea(); + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + uu____0 = + libcrux_ml_kem_vector_portable_from_i16_array_b8(Eurydice_slice_subslice_shared_a6(a, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * (size_t)16U, + .end = (i0 + (size_t)1U) * (size_t)16U + } + ))); + result.data[i0] = uu____0; + } + return result; +} + +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.from_i16_array_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_polynomial_from_i16_array_d6_ea(Eurydice_borrow_slice_i16 a) +{ + return libcrux_ml_kem_polynomial_from_i16_array_ea(a); +} + +/** +This function found in impl {core::ops::function::FnMut<([i16; 272usize]), libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@2]> for libcrux_ml_kem::sampling::sample_from_xof::closure[TraitClause@0, TraitClause@1, TraitClause@2, TraitClause@3]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof.call_mut_0a +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_sampling_sample_from_xof_call_mut_0a_91(void **_, Eurydice_arr_5b tupled_args) +{ + Eurydice_arr_5b s = tupled_args; + return + libcrux_ml_kem_polynomial_from_i16_array_d6_ea(Eurydice_array_to_subslice_shared_e70(&s, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)256U }))); +} + +/** +A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE Eurydice_arr_bb0 +libcrux_ml_kem_sampling_sample_from_xof_91(const Eurydice_arr_810 *seeds) +{ + Eurydice_arr_eb sampled_coefficients = { .data = { 0U } }; + Eurydice_arr_b1 + out = { .data = { { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } } }; + Eurydice_arr_1b0 + xof_state = libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_4a_78(seeds); + Eurydice_arr_7e + randomness0 = + libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_4a_78(&xof_state); + bool + done = + libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_b6(&randomness0, + &sampled_coefficients, + &out); + while (true) + { + if (done) + { + break; + } + else + { + Eurydice_arr_2c + randomness = + libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_4a_78(&xof_state); + done = + libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_b60(&randomness, + &sampled_coefficients, + &out); + } + } + Eurydice_arr_bb0 arr_mapped_str; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_mapped_str.data[i] = + libcrux_ml_kem_sampling_sample_from_xof_call_mut_0a_91(&lvalue, + out.data[i]); + } + return arr_mapped_str; +} + +/** +A monomorphic instance of libcrux_ml_kem.matrix.sample_matrix_A +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_matrix_sample_matrix_A_91( + Eurydice_arr_c10 *A_transpose, + const Eurydice_arr_31 *seed, + bool transpose +) +{ + for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) + { + size_t i1 = i0; + Eurydice_arr_810 seeds; + Eurydice_arr_31 repeat_expression[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + repeat_expression[i] = + core_array__core__clone__Clone_for__T__N___clone((size_t)34U, + seed, + uint8_t, + Eurydice_arr_31); + } + memcpy(seeds.data, repeat_expression, (size_t)3U * sizeof (Eurydice_arr_31)); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t j = i; + seeds.data[j].data[32U] = (uint8_t)i1; + seeds.data[j].data[33U] = (uint8_t)j; + } + Eurydice_arr_bb0 sampled = libcrux_ml_kem_sampling_sample_from_xof_91(&seeds); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t j = i; + Eurydice_arr_9e sample = sampled.data[j]; + if (transpose) + { + A_transpose->data[j].data[i1] = sample; + } + else + { + A_transpose->data[i1].data[j] = sample; + } + } + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.build_unpacked_public_key_mut +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- T_AS_NTT_ENCODED_SIZE= 1152 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_05( + Eurydice_borrow_slice_u8 public_key, + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 *unpacked_public_key +) +{ + libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_68(Eurydice_slice_subslice_to_shared_72(public_key, + (size_t)1152U), + &unpacked_public_key->t_as_ntt); + Eurydice_borrow_slice_u8 + seed = Eurydice_slice_subslice_from_shared_6d(public_key, (size_t)1152U); + Eurydice_arr_c10 *uu____0 = &unpacked_public_key->A; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_31 lvalue = libcrux_ml_kem_utils_into_padded_array_de(seed); + libcrux_ml_kem_matrix_sample_matrix_A_91(uu____0, &lvalue, false); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.build_unpacked_public_key +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- T_AS_NTT_ENCODED_SIZE= 1152 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 +libcrux_ml_kem_ind_cpa_build_unpacked_public_key_05(Eurydice_borrow_slice_u8 public_key) +{ + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 + unpacked_public_key = libcrux_ml_kem_ind_cpa_unpacked_default_8b_68(); + libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_05(public_key, &unpacked_public_key); + return unpacked_public_key; +} + +/** +A monomorphic instance of n-tuple +with types Eurydice_arr_bb0, libcrux_ml_kem_polynomial_PolynomialRingElement_1d + +*/ +typedef struct tuple_c6_s +{ + Eurydice_arr_bb0 fst; + Eurydice_arr_9e snd; +} +tuple_c6; + +/** +This function found in impl {core::ops::function::FnMut<(usize), libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@2]> for libcrux_ml_kem::ind_cpa::encrypt_c1::closure[TraitClause@0, TraitClause@1, TraitClause@2, TraitClause@3]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1.call_mut_f1 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- C1_LEN= 960 +- U_COMPRESSION_FACTOR= 10 +- BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_f1_87(void **_, size_t tupled_args) +{ + return libcrux_ml_kem_polynomial_ZERO_d6_ea(); +} + +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN +with const generics +- K= 3 +- LEN= 128 +*/ +static inline Eurydice_arr_58 +libcrux_ml_kem_hash_functions_portable_PRFxN_3b(const Eurydice_arr_fd *input) +{ + Eurydice_arr_58 + out = { .data = { { .data = { 0U } }, { .data = { 0U } }, { .data = { 0U } } } }; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + libcrux_sha3_portable_shake256(Eurydice_array_to_slice_mut_78(&out.data[i0]), + Eurydice_array_to_slice_shared_b5(&input->data[i0])); + } + return out; +} + +/** +This function found in impl {libcrux_ml_kem::hash_functions::Hash for libcrux_ml_kem::hash_functions::portable::PortableHash} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN_4a +with const generics +- K= 3 +- LEN= 128 +*/ +static inline Eurydice_arr_58 +libcrux_ml_kem_hash_functions_portable_PRFxN_4a_3b(const Eurydice_arr_fd *input) +{ + return libcrux_ml_kem_hash_functions_portable_PRFxN_3b(input); +} + +/** + Given a series of uniformly random bytes in `randomness`, for some number `eta`, + the `sample_from_binomial_distribution_{eta}` functions sample + a ring element from a binomial distribution centered at 0 that uses two sets + of `eta` coin flips. If, for example, + `eta = ETA`, each ring coefficient is a value `v` such + such that `v ∈ {-ETA, -ETA + 1, ..., 0, ..., ETA + 1, ETA}` and: + + ```plaintext + - If v < 0, Pr[v] = Pr[-v] + - If v >= 0, Pr[v] = BINOMIAL_COEFFICIENT(2 * ETA; ETA - v) / 2 ^ (2 * ETA) + ``` + + The values `v < 0` are mapped to the appropriate `KyberFieldElement`. + + The expected value is: + + ```plaintext + E[X] = (-ETA)Pr[-ETA] + (-(ETA - 1))Pr[-(ETA - 1)] + ... + (ETA - 1)Pr[ETA - 1] + (ETA)Pr[ETA] + = 0 since Pr[-v] = Pr[v] when v < 0. + ``` + + And the variance is: + + ```plaintext + Var(X) = E[(X - E[X])^2] + = E[X^2] + = sum_(v=-ETA to ETA)v^2 * (BINOMIAL_COEFFICIENT(2 * ETA; ETA - v) / 2^(2 * ETA)) + = ETA / 2 + ``` + + This function implements Algorithm 7 of the NIST FIPS 203 standard, which is + reproduced below: + + ```plaintext + Input: byte array B ∈ 𝔹^{64η}. + Output: array f ∈ ℤ₂₅₆. + + b ← BytesToBits(B) + for (i ← 0; i < 256; i++) + x ← ∑(j=0 to η - 1) b[2iη + j] + y ← ∑(j=0 to η - 1) b[2iη + η + j] + f[i] ← x−y mod q + end for + return f + ``` + + The NIST FIPS 203 standard can be found at + . +*/ +/** +A monomorphic instance of libcrux_ml_kem.sampling.sample_from_binomial_distribution_2 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_ea( + Eurydice_borrow_slice_u8 randomness +) +{ + Eurydice_arr_04 sampled_i16s = { .data = { 0U } }; + for (size_t i0 = (size_t)0U; i0 < randomness.meta / (size_t)4U; i0++) + { + size_t chunk_number = i0; + Eurydice_borrow_slice_u8 + byte_chunk = + Eurydice_slice_subslice_shared_c8(randomness, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = chunk_number * (size_t)4U, + .end = chunk_number * (size_t)4U + (size_t)4U + } + )); + uint32_t + random_bits_as_u32 = + (((uint32_t)byte_chunk.ptr[0U] | (uint32_t)byte_chunk.ptr[1U] << 8U) | + (uint32_t)byte_chunk.ptr[2U] << 16U) + | (uint32_t)byte_chunk.ptr[3U] << 24U; + uint32_t even_bits = random_bits_as_u32 & 1431655765U; + uint32_t odd_bits = random_bits_as_u32 >> 1U & 1431655765U; + uint32_t coin_toss_outcomes = even_bits + odd_bits; + for (uint32_t i = 0U; i < 32U / 4U; i++) + { + uint32_t outcome_set = i; + uint32_t outcome_set0 = outcome_set * 4U; + int16_t outcome_1 = (int16_t)(coin_toss_outcomes >> (uint32_t)outcome_set0 & 3U); + int16_t outcome_2 = (int16_t)(coin_toss_outcomes >> (uint32_t)(outcome_set0 + 2U) & 3U); + size_t offset = (size_t)(outcome_set0 >> 2U); + sampled_i16s.data[(size_t)8U * chunk_number + offset] = outcome_1 - outcome_2; + } + } + return + libcrux_ml_kem_polynomial_from_i16_array_d6_ea(Eurydice_array_to_slice_shared_99(&sampled_i16s)); +} + +/** +A monomorphic instance of libcrux_ml_kem.sampling.sample_from_binomial_distribution +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- ETA= 2 +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_sampling_sample_from_binomial_distribution_66( + Eurydice_borrow_slice_u8 randomness +) +{ + return libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_ea(randomness); +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_7 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_7_ea(Eurydice_arr_9e *re) +{ + size_t step = LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT / (size_t)2U; + for (size_t i = (size_t)0U; i < step; i++) + { + size_t j = i; + Eurydice_arr_d6 + t = libcrux_ml_kem_vector_portable_multiply_by_constant_b8(re->data[j + step], -1600); + re->data[j + step] = libcrux_ml_kem_vector_portable_sub_b8(re->data[j], &t); + Eurydice_arr_d6 uu____1 = libcrux_ml_kem_vector_portable_add_b8(re->data[j], &t); + re->data[j] = uu____1; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_binomially_sampled_ring_element +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_ea(Eurydice_arr_9e *re) +{ + libcrux_ml_kem_ntt_ntt_at_layer_7_ea(re); + size_t zeta_i = (size_t)1U; + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)6U, (size_t)11207U); + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, + re, + (size_t)5U, + (size_t)11207U + (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, + re, + (size_t)4U, + (size_t)11207U + (size_t)2U * (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_3_ea(&zeta_i, re, (size_t)11207U + (size_t)3U * (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_2_ea(&zeta_i, re, (size_t)11207U + (size_t)4U * (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_1_ea(&zeta_i, re, (size_t)11207U + (size_t)5U * (size_t)3328U); + libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re); +} + +/** + Sample a vector of ring elements from a centered binomial distribution and + convert them into their NTT representations. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_vector_cbd_then_ntt +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- ETA= 2 +- ETA_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE uint8_t +libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_bf( + Eurydice_arr_bb0 *re_as_ntt, + const Eurydice_arr_fa0 *prf_input, + uint8_t domain_separator +) +{ + Eurydice_arr_fd prf_inputs; + Eurydice_arr_fa0 repeat_expression[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + repeat_expression[i] = + core_array__core__clone__Clone_for__T__N___clone((size_t)33U, + prf_input, + uint8_t, + Eurydice_arr_fa0); + } + memcpy(prf_inputs.data, repeat_expression, (size_t)3U * sizeof (Eurydice_arr_fa0)); + domain_separator = libcrux_ml_kem_utils_prf_input_inc_78(&prf_inputs, domain_separator); + Eurydice_arr_58 prf_outputs = libcrux_ml_kem_hash_functions_portable_PRFxN_4a_3b(&prf_inputs); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + Eurydice_arr_9e + uu____0 = + libcrux_ml_kem_sampling_sample_from_binomial_distribution_66(Eurydice_array_to_slice_shared_78(&prf_outputs.data[i0])); + re_as_ntt->data[i0] = uu____0; + libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_ea(&re_as_ntt->data[i0]); + } + return domain_separator; +} + +/** +This function found in impl {core::ops::function::FnMut<(usize), libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@2]> for libcrux_ml_kem::ind_cpa::encrypt_c1::closure#1[TraitClause@0, TraitClause@1, TraitClause@2, TraitClause@3]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1.call_mut_dd +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- C1_LEN= 960 +- U_COMPRESSION_FACTOR= 10 +- BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_dd_87(void **_, size_t tupled_args) +{ + return libcrux_ml_kem_polynomial_ZERO_d6_ea(); +} + +/** + Sample a vector of ring elements from a centered binomial distribution. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_ring_element_cbd +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- ETA2_RANDOMNESS_SIZE= 128 +- ETA2= 2 +*/ +static KRML_MUSTINLINE uint8_t +libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_bf( + const Eurydice_arr_fa0 *prf_input, + uint8_t domain_separator, + Eurydice_arr_bb0 *error_1 +) +{ + Eurydice_arr_fd prf_inputs; + Eurydice_arr_fa0 repeat_expression[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + repeat_expression[i] = + core_array__core__clone__Clone_for__T__N___clone((size_t)33U, + prf_input, + uint8_t, + Eurydice_arr_fa0); + } + memcpy(prf_inputs.data, repeat_expression, (size_t)3U * sizeof (Eurydice_arr_fa0)); + domain_separator = libcrux_ml_kem_utils_prf_input_inc_78(&prf_inputs, domain_separator); + Eurydice_arr_58 prf_outputs = libcrux_ml_kem_hash_functions_portable_PRFxN_4a_3b(&prf_inputs); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + Eurydice_arr_9e + uu____0 = + libcrux_ml_kem_sampling_sample_from_binomial_distribution_66(Eurydice_array_to_slice_shared_78(&prf_outputs.data[i0])); + error_1->data[i0] = uu____0; + } + return domain_separator; +} + +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF +with const generics +- LEN= 128 +*/ +static inline Eurydice_arr_89 +libcrux_ml_kem_hash_functions_portable_PRF_ec(Eurydice_borrow_slice_u8 input) +{ + Eurydice_arr_89 digest = { .data = { 0U } }; + libcrux_sha3_portable_shake256(Eurydice_array_to_slice_mut_78(&digest), input); + return digest; +} + +/** +This function found in impl {libcrux_ml_kem::hash_functions::Hash for libcrux_ml_kem::hash_functions::portable::PortableHash} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_4a +with const generics +- K= 3 +- LEN= 128 +*/ +static inline Eurydice_arr_89 +libcrux_ml_kem_hash_functions_portable_PRF_4a_3b0(Eurydice_borrow_slice_u8 input) +{ + return libcrux_ml_kem_hash_functions_portable_PRF_ec(input); +} + +/** +This function found in impl {core::ops::function::FnMut<(usize), libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]> for libcrux_ml_kem::matrix::compute_vector_u::closure[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u.call_mut_a8 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_matrix_compute_vector_u_call_mut_a8_68(void **_, size_t tupled_args) +{ + return libcrux_ml_kem_polynomial_ZERO_d6_ea(); +} + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_error_reduce +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_add_error_reduce_ea( + Eurydice_arr_9e *myself, + const Eurydice_arr_9e *error +) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t j = i; + Eurydice_arr_d6 + coefficient_normal_form = + libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(myself->data[j], + 1441); + Eurydice_arr_d6 + sum = libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form, &error->data[j]); + Eurydice_arr_d6 red = libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum); + myself->data[j] = red; + } +} + +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_error_reduce_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_add_error_reduce_d6_ea( + Eurydice_arr_9e *self, + const Eurydice_arr_9e *error +) +{ + libcrux_ml_kem_polynomial_add_error_reduce_ea(self, error); +} + +/** + Compute u := InvertNTT(Aᵀ ◦ r̂) + e₁ +*/ +/** +A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE Eurydice_arr_bb0 +libcrux_ml_kem_matrix_compute_vector_u_68( + const Eurydice_arr_c10 *a_as_ntt, + const Eurydice_arr_bb0 *r_as_ntt, + const Eurydice_arr_bb0 *error_1 +) +{ + Eurydice_arr_bb0 arr_struct; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct.data[i] = libcrux_ml_kem_matrix_compute_vector_u_call_mut_a8_68(&lvalue, i); + } + Eurydice_arr_bb0 result = arr_struct; + for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) + { + size_t i1 = i0; + const Eurydice_arr_bb0 *row = &a_as_ntt->data[i1]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t j = i; + const Eurydice_arr_9e *a_element = &row->data[j]; + Eurydice_arr_9e + product = libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(a_element, &r_as_ntt->data[j]); + libcrux_ml_kem_polynomial_add_to_ring_element_d6_68(&result.data[i1], &product); + } + libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_68(&result.data[i1]); + libcrux_ml_kem_polynomial_add_error_reduce_d6_ea(&result.data[i1], &error_1->data[i1]); + } + return result; +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress +with const generics +- COEFFICIENT_BITS= 10 +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_compress_compress_ef(Eurydice_arr_d6 a) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + int16_t + uu____0 = + libcrux_secrets_int_as_i16_f5(libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient((uint8_t)10, + libcrux_secrets_int_as_u16_f5(a.data[i0]))); + a.data[i0] = uu____0; + } + return a; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress_b8 +with const generics +- COEFFICIENT_BITS= 10 +*/ +static inline Eurydice_arr_d6 libcrux_ml_kem_vector_portable_compress_b8_ef(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_compress_compress_ef(a); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_10 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- OUT_LEN= 320 +*/ +static KRML_MUSTINLINE Eurydice_arr_b0 +libcrux_ml_kem_serialize_compress_then_serialize_10_e1(const Eurydice_arr_9e *re) +{ + Eurydice_arr_b0 serialized = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + coefficient = + libcrux_ml_kem_vector_portable_compress_b8_ef(libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(re->data[i0])); + Eurydice_arr_fc bytes = libcrux_ml_kem_vector_portable_serialize_10_b8(coefficient); + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d413(&serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)20U * i0, + .end = (size_t)20U * i0 + (size_t)20U + } + )), + Eurydice_array_to_slice_shared_8f(&bytes), + uint8_t); + } + return serialized; +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_ring_element_u +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- COMPRESSION_FACTOR= 10 +- OUT_LEN= 320 +*/ +static KRML_MUSTINLINE Eurydice_arr_b0 +libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_f7(const Eurydice_arr_9e *re) +{ + return libcrux_ml_kem_serialize_compress_then_serialize_10_e1(re); +} + +/** + Call [`compress_then_serialize_ring_element_u`] on each ring element. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.compress_then_serialize_u +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- OUT_LEN= 960 +- COMPRESSION_FACTOR= 10 +- BLOCK_LEN= 320 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cpa_compress_then_serialize_u_21( + Eurydice_arr_bb0 input, + Eurydice_mut_borrow_slice_u8 out +) +{ + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + Eurydice_arr_9e re = input.data[i0]; + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_slice_subslice_mut_c8(out, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * ((size_t)960U / (size_t)3U), + .end = (i0 + (size_t)1U) * ((size_t)960U / (size_t)3U) + } + )); + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_b0 + lvalue = libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_f7(&re); + Eurydice_slice_copy(uu____0, Eurydice_array_to_slice_shared_56(&lvalue), uint8_t); + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- C1_LEN= 960 +- U_COMPRESSION_FACTOR= 10 +- BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE tuple_c6 +libcrux_ml_kem_ind_cpa_encrypt_c1_87( + Eurydice_borrow_slice_u8 randomness, + const Eurydice_arr_c10 *matrix, + Eurydice_mut_borrow_slice_u8 ciphertext +) +{ + Eurydice_arr_fa0 prf_input = libcrux_ml_kem_utils_into_padded_array_29(randomness); + Eurydice_arr_bb0 arr_struct0; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct0.data[i] = libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_f1_87(&lvalue, i); + } + Eurydice_arr_bb0 r_as_ntt = arr_struct0; + uint8_t + domain_separator0 = + libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_bf(&r_as_ntt, + &prf_input, + 0U); + Eurydice_arr_bb0 arr_struct; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct.data[i] = libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_dd_87(&lvalue, i); + } + Eurydice_arr_bb0 error_1 = arr_struct; + uint8_t + domain_separator = + libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_bf(&prf_input, + domain_separator0, + &error_1); + prf_input.data[32U] = domain_separator; + Eurydice_arr_89 + prf_output = + libcrux_ml_kem_hash_functions_portable_PRF_4a_3b0(Eurydice_array_to_slice_shared_b5(&prf_input)); + Eurydice_arr_9e + error_2 = + libcrux_ml_kem_sampling_sample_from_binomial_distribution_66(Eurydice_array_to_slice_shared_78(&prf_output)); + Eurydice_arr_bb0 u = libcrux_ml_kem_matrix_compute_vector_u_68(matrix, &r_as_ntt, &error_1); + libcrux_ml_kem_ind_cpa_compress_then_serialize_u_21(u, ciphertext); + return (KRML_CLITERAL(tuple_c6){ .fst = r_as_ntt, .snd = error_2 }); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_message +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_serialize_deserialize_then_decompress_message_ea( + const Eurydice_arr_ec *serialized +) +{ + Eurydice_arr_9e re = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + for (size_t i = (size_t)0U; i < (size_t)16U; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + coefficient_compressed = + libcrux_ml_kem_vector_portable_deserialize_1_b8(Eurydice_array_to_subslice_shared_d4(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)2U * i0, + .end = (size_t)2U * i0 + (size_t)2U + } + ))); + Eurydice_arr_d6 + uu____0 = libcrux_ml_kem_vector_portable_decompress_1_b8(coefficient_compressed); + re.data[i0] = uu____0; + } + return re; +} + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_message_error_reduce +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_polynomial_add_message_error_reduce_ea( + const Eurydice_arr_9e *myself, + const Eurydice_arr_9e *message, + Eurydice_arr_9e result +) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + coefficient_normal_form = + libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(result.data[i0], + 1441); + Eurydice_arr_d6 + sum1 = libcrux_ml_kem_vector_portable_add_b8(myself->data[i0], &message->data[i0]); + Eurydice_arr_d6 sum2 = libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form, &sum1); + Eurydice_arr_d6 red = libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum2); + result.data[i0] = red; + } + return result; +} + +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_message_error_reduce_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_polynomial_add_message_error_reduce_d6_ea( + const Eurydice_arr_9e *self, + const Eurydice_arr_9e *message, + Eurydice_arr_9e result +) +{ + return libcrux_ml_kem_polynomial_add_message_error_reduce_ea(self, message, result); +} + +/** + Compute InverseNTT(tᵀ ◦ r̂) + e₂ + message +*/ +/** +A monomorphic instance of libcrux_ml_kem.matrix.compute_ring_element_v +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE Eurydice_arr_9e +libcrux_ml_kem_matrix_compute_ring_element_v_68( + const Eurydice_arr_bb0 *t_as_ntt, + const Eurydice_arr_bb0 *r_as_ntt, + const Eurydice_arr_9e *error_2, + const Eurydice_arr_9e *message +) +{ + Eurydice_arr_9e result = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + Eurydice_arr_9e + product = + libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(&t_as_ntt->data[i0], + &r_as_ntt->data[i0]); + libcrux_ml_kem_polynomial_add_to_ring_element_d6_68(&result, &product); + } + libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_68(&result); + return libcrux_ml_kem_polynomial_add_message_error_reduce_d6_ea(error_2, message, result); +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress +with const generics +- COEFFICIENT_BITS= 4 +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_vector_portable_compress_compress_d1(Eurydice_arr_d6 a) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) + { + size_t i0 = i; + int16_t + uu____0 = + libcrux_secrets_int_as_i16_f5(libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient((uint8_t)4, + libcrux_secrets_int_as_u16_f5(a.data[i0]))); + a.data[i0] = uu____0; + } + return a; +} + +/** +This function found in impl {libcrux_ml_kem::vector::traits::Operations for libcrux_ml_kem::vector::portable::vector_type::PortableVector} +*/ +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress_b8 +with const generics +- COEFFICIENT_BITS= 4 +*/ +static inline Eurydice_arr_d6 libcrux_ml_kem_vector_portable_compress_b8_d1(Eurydice_arr_d6 a) +{ + return libcrux_ml_kem_vector_portable_compress_compress_d1(a); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_4 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_serialize_compress_then_serialize_4_ea( + Eurydice_arr_9e re, + Eurydice_mut_borrow_slice_u8 serialized +) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + coefficient = + libcrux_ml_kem_vector_portable_compress_b8_d1(libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(re.data[i0])); + Eurydice_array_u8x8 bytes = libcrux_ml_kem_vector_portable_serialize_4_b8(coefficient); + Eurydice_slice_copy(Eurydice_slice_subslice_mut_c8(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)8U * i0, + .end = (size_t)8U * i0 + (size_t)8U + } + )), + Eurydice_array_to_slice_shared_6e(&bytes), + uint8_t); + } +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_ring_element_v +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- COMPRESSION_FACTOR= 4 +- OUT_LEN= 128 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_30( + Eurydice_arr_9e re, + Eurydice_mut_borrow_slice_u8 out +) +{ + libcrux_ml_kem_serialize_compress_then_serialize_4_ea(re, out); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c2 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- V_COMPRESSION_FACTOR= 4 +- C2_LEN= 128 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cpa_encrypt_c2_30( + const Eurydice_arr_bb0 *t_as_ntt, + const Eurydice_arr_bb0 *r_as_ntt, + const Eurydice_arr_9e *error_2, + const Eurydice_arr_ec *message, + Eurydice_mut_borrow_slice_u8 ciphertext +) +{ + Eurydice_arr_9e + message_as_ring_element = + libcrux_ml_kem_serialize_deserialize_then_decompress_message_ea(message); + Eurydice_arr_9e + v = + libcrux_ml_kem_matrix_compute_ring_element_v_68(t_as_ntt, + r_as_ntt, + error_2, + &message_as_ring_element); + libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_30(v, ciphertext); +} + +/** + This function implements Algorithm 13 of the + NIST FIPS 203 specification; this is the Kyber CPA-PKE encryption algorithm. + + Algorithm 13 is reproduced below: + + ```plaintext + Input: encryption key ekₚₖₑ ∈ 𝔹^{384k+32}. + Input: message m ∈ 𝔹^{32}. + Input: encryption randomness r ∈ 𝔹^{32}. + Output: ciphertext c ∈ 𝔹^{32(dᵤk + dᵥ)}. + + N ← 0 + t̂ ← ByteDecode₁₂(ekₚₖₑ[0:384k]) + ρ ← ekₚₖₑ[384k: 384k + 32] + for (i ← 0; i < k; i++) + for(j ← 0; j < k; j++) + Â[i,j] ← SampleNTT(XOF(ρ, i, j)) + end for + end for + for(i ← 0; i < k; i++) + r[i] ← SamplePolyCBD_{η₁}(PRF_{η₁}(r,N)) + N ← N + 1 + end for + for(i ← 0; i < k; i++) + e₁[i] ← SamplePolyCBD_{η₂}(PRF_{η₂}(r,N)) + N ← N + 1 + end for + e₂ ← SamplePolyCBD_{η₂}(PRF_{η₂}(r,N)) + r̂ ← NTT(r) + u ← NTT-¹(Âᵀ ◦ r̂) + e₁ + μ ← Decompress₁(ByteDecode₁(m))) + v ← NTT-¹(t̂ᵀ ◦ rˆ) + e₂ + μ + c₁ ← ByteEncode_{dᵤ}(Compress_{dᵤ}(u)) + c₂ ← ByteEncode_{dᵥ}(Compress_{dᵥ}(v)) + return c ← (c₁ ‖ c₂) + ``` + + The NIST FIPS 203 standard can be found at + . +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_unpacked +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_LEN= 960 +- C2_LEN= 128 +- U_COMPRESSION_FACTOR= 10 +- V_COMPRESSION_FACTOR= 4 +- BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE Eurydice_arr_2b +libcrux_ml_kem_ind_cpa_encrypt_unpacked_d5( + const libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 *public_key, + const Eurydice_arr_ec *message, + Eurydice_borrow_slice_u8 randomness +) +{ + Eurydice_arr_2b ciphertext = { .data = { 0U } }; + tuple_c6 + uu____0 = + libcrux_ml_kem_ind_cpa_encrypt_c1_87(randomness, + &public_key->A, + Eurydice_array_to_subslice_mut_d414(&ciphertext, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = (size_t)0U, .end = (size_t)960U }))); + Eurydice_arr_bb0 r_as_ntt = uu____0.fst; + Eurydice_arr_9e error_2 = uu____0.snd; + libcrux_ml_kem_ind_cpa_encrypt_c2_30(&public_key->t_as_ntt, + &r_as_ntt, + &error_2, + message, + Eurydice_array_to_subslice_from_mut_5f3(&ciphertext, (size_t)960U)); + return ciphertext; +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_LEN= 960 +- C2_LEN= 128 +- U_COMPRESSION_FACTOR= 10 +- V_COMPRESSION_FACTOR= 4 +- BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE Eurydice_arr_2b +libcrux_ml_kem_ind_cpa_encrypt_d5( + Eurydice_borrow_slice_u8 public_key, + const Eurydice_arr_ec *message, + Eurydice_borrow_slice_u8 randomness +) +{ + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 + unpacked_public_key = libcrux_ml_kem_ind_cpa_build_unpacked_public_key_05(public_key); + return libcrux_ml_kem_ind_cpa_encrypt_unpacked_d5(&unpacked_public_key, message, randomness); +} + +/** +This function found in impl {libcrux_ml_kem::variant::Variant for libcrux_ml_kem::variant::MlKem} +*/ +/** +A monomorphic instance of libcrux_ml_kem.variant.kdf_39 +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_variant_kdf_39_52( + Eurydice_borrow_slice_u8 shared_secret, + const Eurydice_arr_2b *_ +) +{ + Eurydice_arr_ec out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_slice_mut_01(&out), shared_secret, uint8_t); + return out; +} + +/** + This code verifies on some machines, runs out of memory on others +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.decapsulate +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], libcrux_ml_kem_variant_MlKem +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- C1_BLOCK_SIZE= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_ind_cca_decapsulate_fd( + const Eurydice_arr_7d *private_key, + const Eurydice_arr_2b *ciphertext +) +{ + Eurydice_borrow_slice_u8_x4 + uu____0 = + libcrux_ml_kem_types_unpack_private_key_64(Eurydice_array_to_slice_shared_51(private_key)); + Eurydice_borrow_slice_u8 ind_cpa_secret_key = uu____0.fst; + Eurydice_borrow_slice_u8 ind_cpa_public_key = uu____0.snd; + Eurydice_borrow_slice_u8 ind_cpa_public_key_hash = uu____0.thd; + Eurydice_borrow_slice_u8 implicit_rejection_value = uu____0.f3; + Eurydice_arr_ec decrypted = libcrux_ml_kem_ind_cpa_decrypt_01(ind_cpa_secret_key, ciphertext); + Eurydice_arr_c7 + to_hash0 = + libcrux_ml_kem_utils_into_padded_array_c9(Eurydice_array_to_slice_shared_01(&decrypted)); + Eurydice_slice_copy(Eurydice_array_to_subslice_from_mut_5f1(&to_hash0, + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE), + ind_cpa_public_key_hash, + uint8_t); + Eurydice_arr_c7 + hashed = + libcrux_ml_kem_hash_functions_portable_G_4a_78(Eurydice_array_to_slice_shared_17(&to_hash0)); + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_17(&hashed), + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 shared_secret0 = uu____1.fst; + Eurydice_borrow_slice_u8 pseudorandomness = uu____1.snd; + Eurydice_arr_af to_hash = libcrux_ml_kem_utils_into_padded_array_66(implicit_rejection_value); + Eurydice_mut_borrow_slice_u8 + uu____2 = + Eurydice_array_to_subslice_from_mut_5f2(&to_hash, + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE); + Eurydice_slice_copy(uu____2, libcrux_ml_kem_types_as_ref_c1_52(ciphertext), uint8_t); + Eurydice_arr_ec + implicit_rejection_shared_secret = + libcrux_ml_kem_hash_functions_portable_PRF_4a_3b(Eurydice_array_to_slice_shared_81(&to_hash)); + Eurydice_arr_2b + expected_ciphertext = + libcrux_ml_kem_ind_cpa_encrypt_d5(ind_cpa_public_key, + &decrypted, + pseudorandomness); + Eurydice_borrow_slice_u8 + uu____3 = Eurydice_array_to_slice_shared_01(&implicit_rejection_shared_secret); + Eurydice_arr_ec + implicit_rejection_shared_secret0 = + libcrux_ml_kem_variant_kdf_39_52(uu____3, + libcrux_ml_kem_types_as_slice_a9_52(ciphertext)); + Eurydice_arr_ec + shared_secret = + libcrux_ml_kem_variant_kdf_39_52(shared_secret0, + libcrux_ml_kem_types_as_slice_a9_52(ciphertext)); + Eurydice_borrow_slice_u8 uu____4 = libcrux_ml_kem_types_as_ref_c1_52(ciphertext); + return + libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time(uu____4, + Eurydice_array_to_slice_shared_06(&expected_ciphertext), + Eurydice_array_to_slice_shared_01(&shared_secret), + Eurydice_array_to_slice_shared_01(&implicit_rejection_shared_secret0)); +} + +/** + Portable decapsulate +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.decapsulate +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- C1_BLOCK_SIZE= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 +*/ +static inline Eurydice_arr_ec +libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_19( + const Eurydice_arr_7d *private_key, + const Eurydice_arr_2b *ciphertext +) +{ + return libcrux_ml_kem_ind_cca_decapsulate_fd(private_key, ciphertext); +} + +/** + Decapsulate ML-KEM 768 + + Generates an [`MlKemSharedSecret`]. + The input is a reference to an [`MlKem768PrivateKey`] and an [`MlKem768Ciphertext`]. +*/ +static inline Eurydice_arr_ec +libcrux_ml_kem_mlkem768_portable_decapsulate( + const Eurydice_arr_7d *private_key, + const Eurydice_arr_2b *ciphertext +) +{ + return libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_19(private_key, ciphertext); +} + +/** +This function found in impl {libcrux_ml_kem::variant::Variant for libcrux_ml_kem::variant::MlKem} +*/ +/** +A monomorphic instance of libcrux_ml_kem.variant.entropy_preprocess_39 +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_variant_entropy_preprocess_39_13(Eurydice_borrow_slice_u8 randomness) +{ + Eurydice_arr_ec out = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_slice_mut_01(&out), randomness, uint8_t); + return out; +} + +/** +This function found in impl {libcrux_ml_kem::hash_functions::Hash for libcrux_ml_kem::hash_functions::portable::PortableHash} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.H_4a +with const generics +- K= 3 +*/ +static inline Eurydice_arr_ec +libcrux_ml_kem_hash_functions_portable_H_4a_78(Eurydice_borrow_slice_u8 input) +{ + return libcrux_ml_kem_hash_functions_portable_H(input); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.encapsulate +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], libcrux_ml_kem_variant_MlKem +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- PUBLIC_KEY_SIZE= 1184 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- C1_BLOCK_SIZE= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE tuple_f4 +libcrux_ml_kem_ind_cca_encapsulate_99( + const Eurydice_arr_5f *public_key, + const Eurydice_arr_ec *randomness +) +{ + Eurydice_arr_ec + randomness0 = + libcrux_ml_kem_variant_entropy_preprocess_39_13(Eurydice_array_to_slice_shared_01(randomness)); + Eurydice_arr_c7 + to_hash = + libcrux_ml_kem_utils_into_padded_array_c9(Eurydice_array_to_slice_shared_01(&randomness0)); + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_array_to_subslice_from_mut_5f1(&to_hash, + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE); + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_ec + lvalue = + libcrux_ml_kem_hash_functions_portable_H_4a_78(Eurydice_array_to_slice_shared_ff(libcrux_ml_kem_types_as_slice_e6_3d(public_key))); + Eurydice_slice_copy(uu____0, Eurydice_array_to_slice_shared_01(&lvalue), uint8_t); + Eurydice_arr_c7 + hashed = + libcrux_ml_kem_hash_functions_portable_G_4a_78(Eurydice_array_to_slice_shared_17(&to_hash)); + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_17(&hashed), + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 shared_secret = uu____1.fst; + Eurydice_borrow_slice_u8 pseudorandomness = uu____1.snd; + Eurydice_arr_2b + ciphertext = + libcrux_ml_kem_ind_cpa_encrypt_d5(Eurydice_array_to_slice_shared_ff(libcrux_ml_kem_types_as_slice_e6_3d(public_key)), + &randomness0, + pseudorandomness); + Eurydice_arr_2b uu____2 = libcrux_ml_kem_types_from_19_52(ciphertext); + return + ( + KRML_CLITERAL(tuple_f4){ + .fst = uu____2, + .snd = libcrux_ml_kem_variant_kdf_39_52(shared_secret, &ciphertext) + } + ); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.encapsulate +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- PUBLIC_KEY_SIZE= 1184 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- C1_BLOCK_SIZE= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static inline tuple_f4 +libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_26( + const Eurydice_arr_5f *public_key, + const Eurydice_arr_ec *randomness +) +{ + return libcrux_ml_kem_ind_cca_encapsulate_99(public_key, randomness); +} + +/** + Encapsulate ML-KEM 768 + + Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple. + The input is a reference to an [`MlKem768PublicKey`] and [`SHARED_SECRET_SIZE`] + bytes of `randomness`. +*/ +static inline tuple_f4 +libcrux_ml_kem_mlkem768_portable_encapsulate( + const Eurydice_arr_5f *public_key, + Eurydice_arr_ec randomness +) +{ + return libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_26(public_key, &randomness); +} + +/** +This function found in impl {core::default::Default for libcrux_ml_kem::ind_cpa::unpacked::IndCpaPrivateKeyUnpacked[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.default_70 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline Eurydice_arr_bb0 libcrux_ml_kem_ind_cpa_unpacked_default_70_68(void) +{ + Eurydice_arr_bb0 lit; + Eurydice_arr_9e repeat_expression[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + repeat_expression[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + } + memcpy(lit.data, repeat_expression, (size_t)3U * sizeof (Eurydice_arr_9e)); + return lit; +} + +/** +This function found in impl {libcrux_ml_kem::variant::Variant for libcrux_ml_kem::variant::MlKem} +*/ +/** +A monomorphic instance of libcrux_ml_kem.variant.cpa_keygen_seed_39 +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE Eurydice_arr_c7 +libcrux_ml_kem_variant_cpa_keygen_seed_39_13(Eurydice_borrow_slice_u8 key_generation_seed) +{ + Eurydice_arr_fa0 seed = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d412(&seed, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE + } + )), + key_generation_seed, + uint8_t); + seed.data[LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE] = (uint8_t)(size_t)3U; + return + libcrux_ml_kem_hash_functions_portable_G_4a_78(Eurydice_array_to_slice_shared_b5(&seed)); +} + +/** +This function found in impl {core::ops::function::FnMut<(usize), libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@3]> for libcrux_ml_kem::ind_cpa::generate_keypair_unpacked::closure[TraitClause@0, TraitClause@1, TraitClause@2, TraitClause@3, TraitClause@4, TraitClause@5]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair_unpacked.call_mut_73 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], libcrux_ml_kem_variant_MlKem +with const generics +- K= 3 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_call_mut_73_39(void **_, size_t tupled_args) +{ + return libcrux_ml_kem_polynomial_ZERO_d6_ea(); +} + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.to_standard_domain +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_d6 +libcrux_ml_kem_polynomial_to_standard_domain_ea(Eurydice_arr_d6 vector) +{ + return + libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(vector, + LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS); +} + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_standard_error_reduce +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_add_standard_error_reduce_ea( + Eurydice_arr_9e *myself, + const Eurydice_arr_9e *error +) +{ + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t j = i; + Eurydice_arr_d6 + coefficient_normal_form = libcrux_ml_kem_polynomial_to_standard_domain_ea(myself->data[j]); + Eurydice_arr_d6 + sum = libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form, &error->data[j]); + Eurydice_arr_d6 red = libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum); + myself->data[j] = red; + } +} + +/** +This function found in impl {libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_standard_error_reduce_d6 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_add_standard_error_reduce_d6_ea( + Eurydice_arr_9e *self, + const Eurydice_arr_9e *error +) +{ + libcrux_ml_kem_polynomial_add_standard_error_reduce_ea(self, error); +} + +/** + Compute  ◦ ŝ + ê +*/ +/** +A monomorphic instance of libcrux_ml_kem.matrix.compute_As_plus_e +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_matrix_compute_As_plus_e_68( + Eurydice_arr_bb0 *t_as_ntt, + const Eurydice_arr_c10 *matrix_A, + const Eurydice_arr_bb0 *s_as_ntt, + const Eurydice_arr_bb0 *error_as_ntt +) +{ + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + const Eurydice_arr_bb0 *row = &matrix_A->data[i0]; + Eurydice_arr_9e uu____0 = libcrux_ml_kem_polynomial_ZERO_d6_ea(); + t_as_ntt->data[i0] = uu____0; + for (size_t i1 = (size_t)0U; i1 < (size_t)3U; i1++) + { + size_t j = i1; + const Eurydice_arr_9e *matrix_element = &row->data[j]; + Eurydice_arr_9e + product = libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(matrix_element, &s_as_ntt->data[j]); + libcrux_ml_kem_polynomial_add_to_ring_element_d6_68(&t_as_ntt->data[i0], &product); + } + libcrux_ml_kem_polynomial_add_standard_error_reduce_d6_ea(&t_as_ntt->data[i0], + &error_as_ntt->data[i0]); + } +} + +/** + This function implements most of Algorithm 12 of the + NIST FIPS 203 specification; this is the Kyber CPA-PKE key generation algorithm. + + We say "most of" since Algorithm 12 samples the required randomness within + the function itself, whereas this implementation expects it to be provided + through the `key_generation_seed` parameter. + + Algorithm 12 is reproduced below: + + ```plaintext + Output: encryption key ekₚₖₑ ∈ 𝔹^{384k+32}. + Output: decryption key dkₚₖₑ ∈ 𝔹^{384k}. + + d ←$ B + (ρ,σ) ← G(d) + N ← 0 + for (i ← 0; i < k; i++) + for(j ← 0; j < k; j++) + Â[i,j] ← SampleNTT(XOF(ρ, i, j)) + end for + end for + for(i ← 0; i < k; i++) + s[i] ← SamplePolyCBD_{η₁}(PRF_{η₁}(σ,N)) + N ← N + 1 + end for + for(i ← 0; i < k; i++) + e[i] ← SamplePolyCBD_{η₂}(PRF_{η₂}(σ,N)) + N ← N + 1 + end for + ŝ ← NTT(s) + ê ← NTT(e) + t̂ ← Â◦ŝ + ê + ekₚₖₑ ← ByteEncode₁₂(t̂) ‖ ρ + dkₚₖₑ ← ByteEncode₁₂(ŝ) + ``` + + The NIST FIPS 203 standard can be found at + . +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair_unpacked +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], libcrux_ml_kem_variant_MlKem +with const generics +- K= 3 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_39( + Eurydice_borrow_slice_u8 key_generation_seed, + Eurydice_arr_bb0 *private_key, + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 *public_key +) +{ + Eurydice_arr_c7 hashed = libcrux_ml_kem_variant_cpa_keygen_seed_39_13(key_generation_seed); + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_17(&hashed), + (size_t)32U, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 seed_for_A = uu____0.fst; + Eurydice_borrow_slice_u8 seed_for_secret_and_error = uu____0.snd; + Eurydice_arr_c10 *uu____1 = &public_key->A; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_31 lvalue0 = libcrux_ml_kem_utils_into_padded_array_de(seed_for_A); + libcrux_ml_kem_matrix_sample_matrix_A_91(uu____1, &lvalue0, true); + Eurydice_arr_fa0 + prf_input = libcrux_ml_kem_utils_into_padded_array_29(seed_for_secret_and_error); + uint8_t + domain_separator = + libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_bf(private_key, + &prf_input, + 0U); + Eurydice_arr_bb0 arr_struct; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct.data[i] = + libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_call_mut_73_39(&lvalue, + i); + } + Eurydice_arr_bb0 error_as_ntt = arr_struct; + libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_bf(&error_as_ntt, + &prf_input, + domain_separator); + libcrux_ml_kem_matrix_compute_As_plus_e_68(&public_key->t_as_ntt, + &public_key->A, + &private_key[0U], + &error_as_ntt); + Eurydice_arr_ec arr; + memcpy(arr.data, seed_for_A.ptr, (size_t)32U * sizeof (uint8_t)); + Eurydice_arr_ec + uu____2 = + core_result_unwrap_26_39(( + KRML_CLITERAL(core_result_Result_07){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + )); + public_key->seed_for_A = uu____2; +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.serialize_uncompressed_ring_element +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE Eurydice_arr_b20 +libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_ea(const Eurydice_arr_9e *re) +{ + Eurydice_arr_b20 serialized = { .data = { 0U } }; + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) + { + size_t i0 = i; + Eurydice_arr_d6 + coefficient = libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(re->data[i0]); + Eurydice_arr_94 bytes = libcrux_ml_kem_vector_portable_serialize_12_b8(coefficient); + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d415(&serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)24U * i0, + .end = (size_t)24U * i0 + (size_t)24U + } + )), + Eurydice_array_to_slice_shared_ed(&bytes), + uint8_t); + } + return serialized; +} + +/** + Call [`serialize_uncompressed_ring_element`] for each ring element. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_vector +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cpa_serialize_vector_68( + const Eurydice_arr_bb0 *key, + Eurydice_mut_borrow_slice_u8 out +) +{ + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t i0 = i; + Eurydice_arr_9e re = key->data[i0]; + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_slice_subslice_mut_c8(out, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, + .end = (i0 + (size_t)1U) * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT + } + )); + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_b20 lvalue = libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_ea(&re); + Eurydice_slice_copy(uu____0, Eurydice_array_to_slice_shared_a9(&lvalue), uint8_t); + } +} + +/** + Concatenate `t` and `ρ` into the public key. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_public_key_mut +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cpa_serialize_public_key_mut_b6( + const Eurydice_arr_bb0 *t_as_ntt, + Eurydice_borrow_slice_u8 seed_for_a, + Eurydice_arr_5f *serialized +) +{ + libcrux_ml_kem_ind_cpa_serialize_vector_68(t_as_ntt, + Eurydice_array_to_subslice_mut_d416(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U) + } + ))); + Eurydice_slice_copy(Eurydice_array_to_subslice_from_mut_5f4(serialized, + libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U)), + seed_for_a, + uint8_t); +} + +/** + Concatenate `t` and `ρ` into the public key. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_public_key +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE Eurydice_arr_5f +libcrux_ml_kem_ind_cpa_serialize_public_key_b6( + const Eurydice_arr_bb0 *t_as_ntt, + Eurydice_borrow_slice_u8 seed_for_a +) +{ + Eurydice_arr_5f public_key_serialized = { .data = { 0U } }; + libcrux_ml_kem_ind_cpa_serialize_public_key_mut_b6(t_as_ntt, + seed_for_a, + &public_key_serialized); + return public_key_serialized; +} + +/** + Serialize the secret key from the unpacked key pair generation. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_unpacked_secret_key +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- PRIVATE_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +*/ +static inline libcrux_ml_kem_utils_extraction_helper_Keypair768 +libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_30( + const libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 *public_key, + const Eurydice_arr_bb0 *private_key +) +{ + Eurydice_arr_5f + public_key_serialized = + libcrux_ml_kem_ind_cpa_serialize_public_key_b6(&public_key->t_as_ntt, + Eurydice_array_to_slice_shared_01(&public_key->seed_for_A)); + Eurydice_arr_0e secret_key_serialized = { .data = { 0U } }; + libcrux_ml_kem_ind_cpa_serialize_vector_68(private_key, + Eurydice_array_to_slice_mut_f4(&secret_key_serialized)); + return + ( + KRML_CLITERAL(libcrux_ml_kem_utils_extraction_helper_Keypair768){ + .fst = secret_key_serialized, + .snd = public_key_serialized + } + ); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], libcrux_ml_kem_variant_MlKem +with const generics +- K= 3 +- PRIVATE_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_utils_extraction_helper_Keypair768 +libcrux_ml_kem_ind_cpa_generate_keypair_30(Eurydice_borrow_slice_u8 key_generation_seed) +{ + Eurydice_arr_bb0 private_key = libcrux_ml_kem_ind_cpa_unpacked_default_70_68(); + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 + public_key = libcrux_ml_kem_ind_cpa_unpacked_default_8b_68(); + libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_39(key_generation_seed, + &private_key, + &public_key); + return libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_30(&public_key, &private_key); +} + +/** + Serialize the secret key. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.serialize_kem_secret_key_mut +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- SERIALIZED_KEY_LEN= 2400 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_52( + Eurydice_borrow_slice_u8 private_key, + Eurydice_borrow_slice_u8 public_key, + Eurydice_borrow_slice_u8 implicit_rejection_value, + Eurydice_arr_7d *serialized +) +{ + size_t pointer = (size_t)0U; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d417(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = pointer, + .end = pointer + private_key.meta + } + )), + private_key, + uint8_t); + pointer += private_key.meta; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d417(serialized, + (KRML_CLITERAL(core_ops_range_Range_87){ .start = pointer, .end = pointer + public_key.meta })), + public_key, + uint8_t); + pointer += public_key.meta; + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_array_to_subslice_mut_d417(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = pointer, + .end = pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE + } + )); + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_ec lvalue = libcrux_ml_kem_hash_functions_portable_H_4a_78(public_key); + Eurydice_slice_copy(uu____0, Eurydice_array_to_slice_shared_01(&lvalue), uint8_t); + pointer += LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE; + Eurydice_slice_copy(Eurydice_array_to_subslice_mut_d417(serialized, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = pointer, + .end = pointer + implicit_rejection_value.meta + } + )), + implicit_rejection_value, + uint8_t); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.serialize_kem_secret_key +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- SERIALIZED_KEY_LEN= 2400 +*/ +static KRML_MUSTINLINE Eurydice_arr_7d +libcrux_ml_kem_ind_cca_serialize_kem_secret_key_52( + Eurydice_borrow_slice_u8 private_key, + Eurydice_borrow_slice_u8 public_key, + Eurydice_borrow_slice_u8 implicit_rejection_value +) +{ + Eurydice_arr_7d out = { .data = { 0U } }; + libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_52(private_key, + public_key, + implicit_rejection_value, + &out); + return out; +} + +/** + Packed API + + Generate a key pair. + + Depending on the `Vector` and `Hasher` used, this requires different hardware + features +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.generate_keypair +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], libcrux_ml_kem_variant_MlKem +with const generics +- K= 3 +- CPA_PRIVATE_KEY_SIZE= 1152 +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_mlkem768_MlKem768KeyPair +libcrux_ml_kem_ind_cca_generate_keypair_b8(const Eurydice_arr_c7 *randomness) +{ + Eurydice_borrow_slice_u8 + ind_cpa_keypair_randomness = + Eurydice_array_to_subslice_shared_d47(randomness, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE + } + )); + Eurydice_borrow_slice_u8 + implicit_rejection_value = + Eurydice_array_to_subslice_from_shared_5f1(randomness, + LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE); + libcrux_ml_kem_utils_extraction_helper_Keypair768 + uu____0 = libcrux_ml_kem_ind_cpa_generate_keypair_30(ind_cpa_keypair_randomness); + Eurydice_arr_0e ind_cpa_private_key = uu____0.fst; + Eurydice_arr_5f public_key = uu____0.snd; + Eurydice_arr_7d + secret_key_serialized = + libcrux_ml_kem_ind_cca_serialize_kem_secret_key_52(Eurydice_array_to_slice_shared_f4(&ind_cpa_private_key), + Eurydice_array_to_slice_shared_ff(&public_key), + implicit_rejection_value); + Eurydice_arr_7d private_key = libcrux_ml_kem_types_from_b2_79(secret_key_serialized); + return + libcrux_ml_kem_types_from_17_bc(private_key, + libcrux_ml_kem_types_from_51_3d(public_key)); +} + +/** + Portable generate key pair. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.generate_keypair +with const generics +- K= 3 +- CPA_PRIVATE_KEY_SIZE= 1152 +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair +libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_e9( + const Eurydice_arr_c7 *randomness +) +{ + return libcrux_ml_kem_ind_cca_generate_keypair_b8(randomness); +} + +/** + Generate ML-KEM 768 Key Pair +*/ +static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair +libcrux_ml_kem_mlkem768_portable_generate_key_pair(Eurydice_arr_c7 randomness) +{ + return libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_e9(&randomness); +} + +/** + Validate an ML-KEM private key. + + This implements the Hash check in 7.3 3. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.validate_private_key_only +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_ind_cca_validate_private_key_only_52(const Eurydice_arr_7d *private_key) +{ + Eurydice_arr_ec + t = + libcrux_ml_kem_hash_functions_portable_H_4a_78(Eurydice_array_to_subslice_shared_d48(private_key, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)384U * (size_t)3U, + .end = (size_t)768U * (size_t)3U + (size_t)32U + } + ))); + Eurydice_borrow_slice_u8 + expected = + Eurydice_array_to_subslice_shared_d48(private_key, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)768U * (size_t)3U + (size_t)32U, + .end = (size_t)768U * (size_t)3U + (size_t)64U + } + )); + return Eurydice_array_eq_slice_shared((size_t)32U, &t, &expected, uint8_t, bool); +} + +/** + Validate an ML-KEM private key. + + This implements the Hash check in 7.3 3. + Note that the size checks in 7.2 1 and 2 are covered by the `SECRET_KEY_SIZE` + and `CIPHERTEXT_SIZE` in the `private_key` and `ciphertext` types. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.validate_private_key +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CIPHERTEXT_SIZE= 1088 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_ind_cca_validate_private_key_ba( + const Eurydice_arr_7d *private_key, + const Eurydice_arr_2b *_ciphertext +) +{ + return libcrux_ml_kem_ind_cca_validate_private_key_only_52(private_key); +} + +/** + Private key validation +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.validate_private_key +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CIPHERTEXT_SIZE= 1088 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_d3( + const Eurydice_arr_7d *private_key, + const Eurydice_arr_2b *ciphertext +) +{ + return libcrux_ml_kem_ind_cca_validate_private_key_ba(private_key, ciphertext); +} + +/** + Validate a private key. + + Returns `true` if valid, and `false` otherwise. +*/ +static inline bool +libcrux_ml_kem_mlkem768_portable_validate_private_key( + const Eurydice_arr_7d *private_key, + const Eurydice_arr_2b *ciphertext +) +{ + return + libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_d3(private_key, + ciphertext); +} + +/** + Private key validation +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.validate_private_key_only +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_only_3b( + const Eurydice_arr_7d *private_key +) +{ + return libcrux_ml_kem_ind_cca_validate_private_key_only_52(private_key); +} + +/** + Validate the private key only. + + Returns `true` if valid, and `false` otherwise. +*/ +static inline bool +libcrux_ml_kem_mlkem768_portable_validate_private_key_only(const Eurydice_arr_7d *private_key) +{ + return + libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_only_3b(private_key); +} + +/** +This function found in impl {core::ops::function::FnMut<(usize), libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]> for libcrux_ml_kem::serialize::deserialize_ring_elements_reduced_out::closure[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_ring_elements_reduced_out.call_mut_0b +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_call_mut_0b_68( + void **_, + size_t tupled_args +) +{ + return libcrux_ml_kem_polynomial_ZERO_d6_ea(); +} + +/** + This function deserializes ring elements and reduces the result by the field + modulus. + + This function MUST NOT be used on secret inputs. +*/ +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_ring_elements_reduced_out +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE Eurydice_arr_bb0 +libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_68( + Eurydice_borrow_slice_u8 public_key +) +{ + Eurydice_arr_bb0 arr_struct; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct.data[i] = + libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_call_mut_0b_68(&lvalue, + i); + } + Eurydice_arr_bb0 deserialized_pk = arr_struct; + libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_68(public_key, &deserialized_pk); + return deserialized_pk; +} + +/** + Validate an ML-KEM public key. + + This implements the Modulus check in 7.2 2. + Note that the size check in 7.2 1 is covered by the `PUBLIC_KEY_SIZE` in the + `public_key` type. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.validate_public_key +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_ind_cca_validate_public_key_b6(const Eurydice_arr_5f *public_key) +{ + Eurydice_arr_bb0 + deserialized_pk = + libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_68(Eurydice_array_to_subslice_to_shared_210(public_key, + libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U))); + Eurydice_arr_5f + public_key_serialized = + libcrux_ml_kem_ind_cpa_serialize_public_key_b6(&deserialized_pk, + Eurydice_array_to_subslice_from_shared_5f2(public_key, + libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U))); + return Eurydice_array_eq((size_t)1184U, public_key, &public_key_serialized, uint8_t); +} + +/** + Public key validation +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.validate_public_key +with const generics +- K= 3 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_3b( + const Eurydice_arr_5f *public_key +) +{ + return libcrux_ml_kem_ind_cca_validate_public_key_b6(public_key); +} + +/** + Validate a public key. + + Returns `true` if valid, and `false` otherwise. +*/ +static inline bool +libcrux_ml_kem_mlkem768_portable_validate_public_key(const Eurydice_arr_5f *public_key) +{ + return libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_3b(public_key); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.MlKemPublicKeyUnpacked +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- $3size_t +*/ +typedef struct libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51_s +{ + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 ind_cpa_public_key; + Eurydice_arr_ec public_key_hash; +} +libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51; + +typedef libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 +libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768PublicKeyUnpacked; + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.MlKemPrivateKeyUnpacked +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- $3size_t +*/ +typedef struct libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_51_s +{ + Eurydice_arr_bb0 ind_cpa_private_key; + Eurydice_arr_ec implicit_rejection_value; +} +libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_51; + +typedef struct libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked_s +{ + libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_51 private_key; + libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 public_key; +} +libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked; + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.decapsulate +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- C1_BLOCK_SIZE= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_ind_cca_unpacked_decapsulate_0c( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, + const Eurydice_arr_2b *ciphertext +) +{ + Eurydice_arr_ec + decrypted = + libcrux_ml_kem_ind_cpa_decrypt_unpacked_01(&key_pair->private_key.ind_cpa_private_key, + ciphertext); + Eurydice_arr_c7 + to_hash0 = + libcrux_ml_kem_utils_into_padded_array_c9(Eurydice_array_to_slice_shared_01(&decrypted)); + Eurydice_mut_borrow_slice_u8 + uu____0 = + Eurydice_array_to_subslice_from_mut_5f1(&to_hash0, + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE); + Eurydice_slice_copy(uu____0, + Eurydice_array_to_slice_shared_01(&key_pair->public_key.public_key_hash), + uint8_t); + Eurydice_arr_c7 + hashed = + libcrux_ml_kem_hash_functions_portable_G_4a_78(Eurydice_array_to_slice_shared_17(&to_hash0)); + Eurydice_borrow_slice_u8_x2 + uu____1 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_17(&hashed), + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 shared_secret = uu____1.fst; + Eurydice_borrow_slice_u8 pseudorandomness = uu____1.snd; + Eurydice_arr_af + to_hash = + libcrux_ml_kem_utils_into_padded_array_66(Eurydice_array_to_slice_shared_01(&key_pair->private_key.implicit_rejection_value)); + Eurydice_mut_borrow_slice_u8 + uu____2 = + Eurydice_array_to_subslice_from_mut_5f2(&to_hash, + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE); + Eurydice_slice_copy(uu____2, libcrux_ml_kem_types_as_ref_c1_52(ciphertext), uint8_t); + Eurydice_arr_ec + implicit_rejection_shared_secret = + libcrux_ml_kem_hash_functions_portable_PRF_4a_3b(Eurydice_array_to_slice_shared_81(&to_hash)); + Eurydice_arr_2b + expected_ciphertext = + libcrux_ml_kem_ind_cpa_encrypt_unpacked_d5(&key_pair->public_key.ind_cpa_public_key, + &decrypted, + pseudorandomness); + Eurydice_borrow_slice_u8 uu____3 = libcrux_ml_kem_types_as_ref_c1_52(ciphertext); + uint8_t + selector = + libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time(uu____3, + Eurydice_array_to_slice_shared_06(&expected_ciphertext)); + return + libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time(shared_secret, + Eurydice_array_to_slice_shared_01(&implicit_rejection_shared_secret), + selector); +} + +/** + Unpacked decapsulate +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.decapsulate +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- C1_BLOCK_SIZE= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 +*/ +static KRML_MUSTINLINE Eurydice_arr_ec +libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_decapsulate_19( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, + const Eurydice_arr_2b *ciphertext +) +{ + return libcrux_ml_kem_ind_cca_unpacked_decapsulate_0c(key_pair, ciphertext); +} + +/** + Decapsulate ML-KEM 768 (unpacked) + + Generates an [`MlKemSharedSecret`]. + The input is a reference to an unpacked key pair of type [`MlKem768KeyPairUnpacked`] + and an [`MlKem768Ciphertext`]. +*/ +static inline Eurydice_arr_ec +libcrux_ml_kem_mlkem768_portable_unpacked_decapsulate( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *private_key, + const Eurydice_arr_2b *ciphertext +) +{ + return + libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_decapsulate_19(private_key, + ciphertext); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.encaps_prepare +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +*/ +static inline Eurydice_arr_c7 +libcrux_ml_kem_ind_cca_unpacked_encaps_prepare_13( + Eurydice_borrow_slice_u8 randomness, + Eurydice_borrow_slice_u8 pk_hash +) +{ + Eurydice_arr_c7 to_hash = libcrux_ml_kem_utils_into_padded_array_c9(randomness); + Eurydice_slice_copy(Eurydice_array_to_subslice_from_mut_5f1(&to_hash, + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE), + pk_hash, + uint8_t); + return + libcrux_ml_kem_hash_functions_portable_G_4a_78(Eurydice_array_to_slice_shared_17(&to_hash)); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.encapsulate +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- PUBLIC_KEY_SIZE= 1184 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- VECTOR_U_BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE tuple_f4 +libcrux_ml_kem_ind_cca_unpacked_encapsulate_a7( + const libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *public_key, + const Eurydice_arr_ec *randomness +) +{ + Eurydice_arr_c7 + hashed = + libcrux_ml_kem_ind_cca_unpacked_encaps_prepare_13(Eurydice_array_to_slice_shared_01(randomness), + Eurydice_array_to_slice_shared_01(&public_key->public_key_hash)); + Eurydice_borrow_slice_u8_x2 + uu____0 = + Eurydice_slice_split_at(Eurydice_array_to_slice_shared_17(&hashed), + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, + uint8_t, + Eurydice_borrow_slice_u8_x2); + Eurydice_borrow_slice_u8 shared_secret = uu____0.fst; + Eurydice_borrow_slice_u8 pseudorandomness = uu____0.snd; + Eurydice_arr_2b + ciphertext = + libcrux_ml_kem_ind_cpa_encrypt_unpacked_d5(&public_key->ind_cpa_public_key, + randomness, + pseudorandomness); + Eurydice_arr_ec shared_secret_array = { .data = { 0U } }; + Eurydice_slice_copy(Eurydice_array_to_slice_mut_01(&shared_secret_array), + shared_secret, + uint8_t); + return + ( + KRML_CLITERAL(tuple_f4){ + .fst = libcrux_ml_kem_types_from_19_52(ciphertext), + .snd = shared_secret_array + } + ); +} + +/** + Unpacked encapsulate +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.encapsulate +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- PUBLIC_KEY_SIZE= 1184 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- VECTOR_U_BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE tuple_f4 +libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_encapsulate_26( + const libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *public_key, + const Eurydice_arr_ec *randomness +) +{ + return libcrux_ml_kem_ind_cca_unpacked_encapsulate_a7(public_key, randomness); +} + +/** + Encapsulate ML-KEM 768 (unpacked) + + Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple. + The input is a reference to an unpacked public key of type [`MlKem768PublicKeyUnpacked`], + the SHA3-256 hash of this public key, and [`SHARED_SECRET_SIZE`] bytes of `randomness`. +*/ +static inline tuple_f4 +libcrux_ml_kem_mlkem768_portable_unpacked_encapsulate( + const libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *public_key, + Eurydice_arr_ec randomness +) +{ + return + libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_encapsulate_26(public_key, + &randomness); +} + +/** +This function found in impl {core::ops::function::FnMut<(usize), libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]> for libcrux_ml_kem::ind_cca::unpacked::transpose_a::closure::closure[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.transpose_a.closure.call_mut_b4 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_ind_cca_unpacked_transpose_a_closure_call_mut_b4_68( + void **_, + size_t tupled_args +) +{ + return libcrux_ml_kem_polynomial_ZERO_d6_ea(); +} + +/** +This function found in impl {core::ops::function::FnMut<(usize), [libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@1]; K]> for libcrux_ml_kem::ind_cca::unpacked::transpose_a::closure[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.transpose_a.call_mut_22 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline Eurydice_arr_bb0 +libcrux_ml_kem_ind_cca_unpacked_transpose_a_call_mut_22_68(void **_, size_t tupled_args) +{ + Eurydice_arr_bb0 arr_struct; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct.data[i] = + libcrux_ml_kem_ind_cca_unpacked_transpose_a_closure_call_mut_b4_68(&lvalue, + i); + } + return arr_struct; +} + +/** +This function found in impl {core::clone::Clone for libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, TraitClause@2]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.clone_c1 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static inline Eurydice_arr_9e +libcrux_ml_kem_polynomial_clone_c1_ea(const Eurydice_arr_9e *self) +{ + return + core_array__core__clone__Clone_for__T__N___clone((size_t)16U, + self, + Eurydice_arr_d6, + Eurydice_arr_9e); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.transpose_a +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline Eurydice_arr_c10 +libcrux_ml_kem_ind_cca_unpacked_transpose_a_68(Eurydice_arr_c10 ind_cpa_a) +{ + Eurydice_arr_c10 arr_struct; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + /* original Rust expression is not an lvalue in C */ + void *lvalue = (void *)0U; + arr_struct.data[i] = libcrux_ml_kem_ind_cca_unpacked_transpose_a_call_mut_22_68(&lvalue, i); + } + Eurydice_arr_c10 A = arr_struct; + for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) + { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) + { + size_t j = i; + Eurydice_arr_9e uu____0 = libcrux_ml_kem_polynomial_clone_c1_ea(&ind_cpa_a.data[j].data[i1]); + A.data[i1].data[j] = uu____0; + } + } + return A; +} + +/** + Generate Unpacked Keys +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.generate_keypair +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], libcrux_ml_kem_variant_MlKem +with const generics +- K= 3 +- CPA_PRIVATE_KEY_SIZE= 1152 +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_unpacked_generate_keypair_b8( + Eurydice_arr_c7 randomness, + libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *out +) +{ + Eurydice_borrow_slice_u8 + ind_cpa_keypair_randomness = + Eurydice_array_to_subslice_shared_d47(&randomness, + ( + KRML_CLITERAL(core_ops_range_Range_87){ + .start = (size_t)0U, + .end = LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE + } + )); + Eurydice_borrow_slice_u8 + implicit_rejection_value = + Eurydice_array_to_subslice_from_shared_5f1(&randomness, + LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE); + libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_39(ind_cpa_keypair_randomness, + &out->private_key.ind_cpa_private_key, + &out->public_key.ind_cpa_public_key); + Eurydice_arr_c10 + A = libcrux_ml_kem_ind_cca_unpacked_transpose_a_68(out->public_key.ind_cpa_public_key.A); + out->public_key.ind_cpa_public_key.A = A; + Eurydice_arr_5f + pk_serialized = + libcrux_ml_kem_ind_cpa_serialize_public_key_b6(&out->public_key.ind_cpa_public_key.t_as_ntt, + Eurydice_array_to_slice_shared_01(&out->public_key.ind_cpa_public_key.seed_for_A)); + Eurydice_arr_ec + uu____0 = + libcrux_ml_kem_hash_functions_portable_H_4a_78(Eurydice_array_to_slice_shared_ff(&pk_serialized)); + out->public_key.public_key_hash = uu____0; + Eurydice_arr_ec arr; + memcpy(arr.data, implicit_rejection_value.ptr, (size_t)32U * sizeof (uint8_t)); + Eurydice_arr_ec + uu____1 = + core_result_unwrap_26_39(( + KRML_CLITERAL(core_result_Result_07){ .tag = core_result_Ok, .val = { .case_Ok = arr } } + )); + out->private_key.implicit_rejection_value = uu____1; +} + +/** + Generate a key pair +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.generate_keypair +with const generics +- K= 3 +- CPA_PRIVATE_KEY_SIZE= 1152 +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_generate_keypair_e9( + Eurydice_arr_c7 randomness, + libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *out +) +{ + libcrux_ml_kem_ind_cca_unpacked_generate_keypair_b8(randomness, out); +} + +/** + Generate ML-KEM 768 Key Pair in "unpacked" form. +*/ +static inline void +libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair_mut( + Eurydice_arr_c7 randomness, + libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair +) +{ + libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_generate_keypair_e9(randomness, + key_pair); +} + +/** +This function found in impl {core::default::Default for libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.default_30 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 +libcrux_ml_kem_ind_cca_unpacked_default_30_68(void) +{ + return + ( + KRML_CLITERAL(libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51){ + .ind_cpa_public_key = libcrux_ml_kem_ind_cpa_unpacked_default_8b_68(), + .public_key_hash = { .data = { 0U } } + } + ); +} + +/** +This function found in impl {core::default::Default for libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.default_7b +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked +libcrux_ml_kem_ind_cca_unpacked_default_7b_68(void) +{ + libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_51 + uu____0 = + { + .ind_cpa_private_key = libcrux_ml_kem_ind_cpa_unpacked_default_70_68(), + .implicit_rejection_value = { .data = { 0U } } + }; + return + ( + KRML_CLITERAL(libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked){ + .private_key = uu____0, + .public_key = libcrux_ml_kem_ind_cca_unpacked_default_30_68() + } + ); +} + +/** + Generate ML-KEM 768 Key Pair in "unpacked" form. +*/ +static inline libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked +libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair(Eurydice_arr_c7 randomness) +{ + libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked + key_pair = libcrux_ml_kem_ind_cca_unpacked_default_7b_68(); + libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair_mut(randomness, &key_pair); + return key_pair; +} + +/** + Create a new, empty unpacked key. +*/ +static inline libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked +libcrux_ml_kem_mlkem768_portable_unpacked_init_key_pair(void) +{ + return libcrux_ml_kem_ind_cca_unpacked_default_7b_68(); +} + +/** + Create a new, empty unpacked public key. +*/ +static inline libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 +libcrux_ml_kem_mlkem768_portable_unpacked_init_public_key(void) +{ + return libcrux_ml_kem_ind_cca_unpacked_default_30_68(); +} + +/** + Take a serialized private key and generate an unpacked key pair from it. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.keys_from_private_key +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- T_AS_NTT_ENCODED_SIZE= 1152 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_unpacked_keys_from_private_key_01( + const Eurydice_arr_7d *private_key, + libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair +) +{ + Eurydice_borrow_slice_u8_x4 + uu____0 = + libcrux_ml_kem_types_unpack_private_key_64(Eurydice_array_to_slice_shared_51(private_key)); + Eurydice_borrow_slice_u8 ind_cpa_secret_key = uu____0.fst; + Eurydice_borrow_slice_u8 ind_cpa_public_key = uu____0.snd; + Eurydice_borrow_slice_u8 ind_cpa_public_key_hash = uu____0.thd; + Eurydice_borrow_slice_u8 implicit_rejection_value = uu____0.f3; + libcrux_ml_kem_ind_cpa_deserialize_vector_68(ind_cpa_secret_key, + &key_pair->private_key.ind_cpa_private_key); + libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_05(ind_cpa_public_key, + &key_pair->public_key.ind_cpa_public_key); + Eurydice_slice_copy(Eurydice_array_to_slice_mut_01(&key_pair->public_key.public_key_hash), + ind_cpa_public_key_hash, + uint8_t); + Eurydice_slice_copy(Eurydice_array_to_slice_mut_01(&key_pair->private_key.implicit_rejection_value), + implicit_rejection_value, + uint8_t); + Eurydice_slice_copy(Eurydice_array_to_slice_mut_01(&key_pair->public_key.ind_cpa_public_key.seed_for_A), + Eurydice_slice_subslice_from_shared_6d(ind_cpa_public_key, (size_t)1152U), + uint8_t); +} + +/** + Take a serialized private key and generate an unpacked key pair from it. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.keypair_from_private_key +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- T_AS_NTT_ENCODED_SIZE= 1152 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_keypair_from_private_key_71( + const Eurydice_arr_7d *private_key, + libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair +) +{ + libcrux_ml_kem_ind_cca_unpacked_keys_from_private_key_01(private_key, key_pair); +} + +/** + Get an unpacked key from a private key. +*/ +static inline void +libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_from_private_mut( + const Eurydice_arr_7d *private_key, + libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair +) +{ + libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_keypair_from_private_key_71(private_key, + key_pair); +} + +/** + Get the serialized private key. +*/ +/** +This function found in impl {libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_private_key_mut_11 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CPA_PRIVATE_KEY_SIZE= 1152 +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_21( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self, + Eurydice_arr_7d *serialized +) +{ + libcrux_ml_kem_utils_extraction_helper_Keypair768 + uu____0 = + libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_30(&self->public_key.ind_cpa_public_key, + &self->private_key.ind_cpa_private_key); + Eurydice_arr_0e ind_cpa_private_key = uu____0.fst; + Eurydice_arr_5f ind_cpa_public_key = uu____0.snd; + libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_52(Eurydice_array_to_slice_shared_f4(&ind_cpa_private_key), + Eurydice_array_to_slice_shared_ff(&ind_cpa_public_key), + Eurydice_array_to_slice_shared_01(&self->private_key.implicit_rejection_value), + serialized); +} + +/** + Get the serialized private key. +*/ +/** +This function found in impl {libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_private_key_11 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CPA_PRIVATE_KEY_SIZE= 1152 +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE Eurydice_arr_7d +libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_11_21( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self +) +{ + Eurydice_arr_7d sk = libcrux_ml_kem_types_default_d3_79(); + libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_21(self, &sk); + return sk; +} + +/** + Get the serialized private key. +*/ +static inline Eurydice_arr_7d +libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_private_key( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair +) +{ + return libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_11_21(key_pair); +} + +/** + Get the serialized private key. +*/ +static inline void +libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_private_key_mut( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, + Eurydice_arr_7d *serialized +) +{ + libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_21(key_pair, serialized); +} + +/** + Get the serialized public key. +*/ +/** +This function found in impl {libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_dd +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE Eurydice_arr_5f +libcrux_ml_kem_ind_cca_unpacked_serialized_dd_b6( + const libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *self +) +{ + return + libcrux_ml_kem_types_from_51_3d(libcrux_ml_kem_ind_cpa_serialize_public_key_b6(&self->ind_cpa_public_key.t_as_ntt, + Eurydice_array_to_slice_shared_01(&self->ind_cpa_public_key.seed_for_A))); +} + +/** + Get the serialized public key. +*/ +/** +This function found in impl {libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_public_key_11 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE Eurydice_arr_5f +libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_11_b6( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self +) +{ + return libcrux_ml_kem_ind_cca_unpacked_serialized_dd_b6(&self->public_key); +} + +/** + Get the serialized public key. +*/ +static inline Eurydice_arr_5f +libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_public_key( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair +) +{ + return libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_11_b6(key_pair); +} + +/** + Get the serialized public key. +*/ +/** +This function found in impl {libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_mut_dd +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_b6( + const libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *self, + Eurydice_arr_5f *serialized +) +{ + libcrux_ml_kem_ind_cpa_serialize_public_key_mut_b6(&self->ind_cpa_public_key.t_as_ntt, + Eurydice_array_to_slice_shared_01(&self->ind_cpa_public_key.seed_for_A), + serialized); +} + +/** + Get the serialized public key. +*/ +/** +This function found in impl {libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_public_key_mut_11 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_mut_11_b6( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self, + Eurydice_arr_5f *serialized +) +{ + libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_b6(&self->public_key, serialized); +} + +/** + Get the serialized public key. +*/ +static inline void +libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_public_key_mut( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, + Eurydice_arr_5f *serialized +) +{ + libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_mut_11_b6(key_pair, serialized); +} + +/** +This function found in impl {core::clone::Clone for libcrux_ml_kem::ind_cpa::unpacked::IndCpaPublicKeyUnpacked[TraitClause@0, TraitClause@2]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.clone_91 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 +libcrux_ml_kem_ind_cpa_unpacked_clone_91_68( + const libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 *self +) +{ + Eurydice_arr_bb0 + uu____0 = + core_array__core__clone__Clone_for__T__N___clone((size_t)3U, + &self->t_as_ntt, + Eurydice_arr_9e, + Eurydice_arr_bb0); + Eurydice_arr_ec + uu____1 = + core_array__core__clone__Clone_for__T__N___clone((size_t)32U, + &self->seed_for_A, + uint8_t, + Eurydice_arr_ec); + return + ( + KRML_CLITERAL(libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51){ + .t_as_ntt = uu____0, + .seed_for_A = uu____1, + .A = core_array__core__clone__Clone_for__T__N___clone((size_t)3U, + &self->A, + Eurydice_arr_bb0, + Eurydice_arr_c10) + } + ); +} + +/** +This function found in impl {core::clone::Clone for libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked[TraitClause@0, TraitClause@2]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.clone_d7 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 +libcrux_ml_kem_ind_cca_unpacked_clone_d7_68( + const libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *self +) +{ + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_51 + uu____0 = libcrux_ml_kem_ind_cpa_unpacked_clone_91_68(&self->ind_cpa_public_key); + return + ( + KRML_CLITERAL(libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51){ + .ind_cpa_public_key = uu____0, + .public_key_hash = core_array__core__clone__Clone_for__T__N___clone((size_t)32U, + &self->public_key_hash, + uint8_t, + Eurydice_arr_ec) + } + ); +} + +/** + Get the serialized public key. +*/ +/** +This function found in impl {libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked[TraitClause@0, TraitClause@1]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.public_key_11 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE const +libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 +*libcrux_ml_kem_ind_cca_unpacked_public_key_11_68( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self +) +{ + return &self->public_key; +} + +/** + Get the unpacked public key. +*/ +static inline void +libcrux_ml_kem_mlkem768_portable_unpacked_public_key( + const libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, + libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *pk +) +{ + libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 + uu____0 = + libcrux_ml_kem_ind_cca_unpacked_clone_d7_68(libcrux_ml_kem_ind_cca_unpacked_public_key_11_68(key_pair)); + pk[0U] = uu____0; +} + +/** + Get the serialized public key. +*/ +static inline void +libcrux_ml_kem_mlkem768_portable_unpacked_serialized_public_key( + const libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *public_key, + Eurydice_arr_5f *serialized +) +{ + libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_b6(public_key, serialized); +} + +/** + Generate an unpacked key from a serialized key. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.unpack_public_key +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- T_AS_NTT_ENCODED_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_unpacked_unpack_public_key_22( + const Eurydice_arr_5f *public_key, + libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *unpacked_public_key +) +{ + Eurydice_borrow_slice_u8 + uu____0 = Eurydice_array_to_subslice_to_shared_210(public_key, (size_t)1152U); + libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_68(uu____0, + &unpacked_public_key->ind_cpa_public_key.t_as_ntt); + unpacked_public_key->ind_cpa_public_key.seed_for_A = + libcrux_ml_kem_utils_into_padded_array_ce(Eurydice_array_to_subslice_from_shared_5f2(public_key, + (size_t)1152U)); + Eurydice_arr_c10 *uu____2 = &unpacked_public_key->ind_cpa_public_key.A; + /* original Rust expression is not an lvalue in C */ + Eurydice_arr_31 + lvalue = + libcrux_ml_kem_utils_into_padded_array_de(Eurydice_array_to_subslice_from_shared_5f2(public_key, + (size_t)1152U)); + libcrux_ml_kem_matrix_sample_matrix_A_91(uu____2, &lvalue, false); + Eurydice_arr_ec + uu____3 = + libcrux_ml_kem_hash_functions_portable_H_4a_78(Eurydice_array_to_slice_shared_ff(libcrux_ml_kem_types_as_slice_e6_3d(public_key))); + unpacked_public_key->public_key_hash = uu____3; +} + +/** + Get the unpacked public key. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.unpack_public_key +with const generics +- K= 3 +- T_AS_NTT_ENCODED_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_unpack_public_key_d3( + const Eurydice_arr_5f *public_key, + libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *unpacked_public_key +) +{ + libcrux_ml_kem_ind_cca_unpacked_unpack_public_key_22(public_key, unpacked_public_key); +} + +/** + Get the unpacked public key. +*/ +static inline void +libcrux_ml_kem_mlkem768_portable_unpacked_unpacked_public_key( + const Eurydice_arr_5f *public_key, + libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_51 *unpacked_public_key +) +{ + libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_unpack_public_key_d3(public_key, + unpacked_public_key); +} + +#if defined(__cplusplus) +} +#endif + +#define libcrux_mlkem768_portable_H_DEFINED +#endif /* libcrux_mlkem768_portable_H */ + + +/* rename some types to be a bit more ergonomic */ + +/* ML-KEM 768 */ +typedef Eurydice_arr_c7 libcrux_mlkem768_keypair_rnd; +typedef Eurydice_arr_ec libcrux_mlkem768_enc_rnd; +typedef libcrux_ml_kem_mlkem768_MlKem768KeyPair libcrux_mlkem768_keypair; +typedef Eurydice_arr_5f libcrux_mlkem768_pk; +typedef Eurydice_arr_7d libcrux_mlkem768_sk; +typedef Eurydice_arr_2b libcrux_mlkem768_ciphertext; +typedef tuple_f4 libcrux_mlkem768_enc_result; +typedef Eurydice_arr_ec libcrux_mlkem768_dec_result; +/* ML-DSA 44 */ +typedef Eurydice_arr_ec libcrux_mldsa44_keypair_rnd; +typedef libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44KeyPair + libcrux_mldsa44_keypair; +typedef Eurydice_arr_10 libcrux_mldsa44_sk; +typedef Eurydice_arr_02 libcrux_mldsa44_pk; +typedef Eurydice_borrow_slice_u8 libcrux_mldsa44_message; +typedef Eurydice_arr_ec libcrux_mldsa44_sign_rnd; +typedef core_result_Result_48 libcrux_mldsa44_sign_result; +typedef core_result_Result_41 libcrux_mldsa44_verify_result; +typedef Eurydice_arr_85 libcrux_mldsa44_signature; +/* ML-DSA 65 */ +typedef Eurydice_arr_ec libcrux_mldsa65_keypair_rnd; +typedef libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65KeyPair + libcrux_mldsa65_keypair; +typedef Eurydice_arr_24 libcrux_mldsa65_sk; +typedef Eurydice_arr_29 libcrux_mldsa65_pk; +typedef Eurydice_borrow_slice_u8 libcrux_mldsa65_message; +typedef Eurydice_arr_ec libcrux_mldsa65_sign_rnd; +typedef core_result_Result_8c libcrux_mldsa65_sign_result; +typedef core_result_Result_41 libcrux_mldsa65_verify_result; +typedef Eurydice_arr_0c libcrux_mldsa65_signature; +/* ML-DSA 87 */ +typedef Eurydice_arr_ec libcrux_mldsa87_keypair_rnd; +typedef libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87KeyPair + libcrux_mldsa87_keypair; +typedef Eurydice_arr_e2 libcrux_mldsa87_sk; +typedef Eurydice_arr_43 libcrux_mldsa87_pk; +typedef Eurydice_borrow_slice_u8 libcrux_mldsa87_message; +typedef Eurydice_arr_ec libcrux_mldsa87_sign_rnd; +typedef core_result_Result_8b libcrux_mldsa87_sign_result; +typedef core_result_Result_41 libcrux_mldsa87_verify_result; +typedef Eurydice_arr_93 libcrux_mldsa87_signature; + +#define LIBCRUX_RESULT_OK core_result_Ok + diff --git a/libcrux_mlkem768_sha3.h b/libcrux_mlkem768_sha3.h deleted file mode 100644 index 1e3dc45744d2..000000000000 --- a/libcrux_mlkem768_sha3.h +++ /dev/null @@ -1,11752 +0,0 @@ -/* $OpenBSD: libcrux_mlkem768_sha3.h,v 1.4 2025/11/13 05:13:06 djm Exp $ */ - -/* Extracted from libcrux revision 026a87ab6d88ad3626b9fbbf3710d1e0483c1849 */ - -/* - * MIT License - * - * Copyright (c) 2024 Cryspen - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#if !defined(__GNUC__) || (__GNUC__ < 2) -# define __attribute__(x) -#endif -#define KRML_MUSTINLINE inline -#define KRML_NOINLINE __attribute__((noinline, unused)) -#define KRML_HOST_EPRINTF(...) -#define KRML_HOST_EXIT(x) fatal_f("internal error") - -static inline void -store64_le(uint8_t dst[8], uint64_t src) -{ - dst[0] = src & 0xff; - dst[1] = (src >> 8) & 0xff; - dst[2] = (src >> 16) & 0xff; - dst[3] = (src >> 24) & 0xff; - dst[4] = (src >> 32) & 0xff; - dst[5] = (src >> 40) & 0xff; - dst[6] = (src >> 48) & 0xff; - dst[7] = (src >> 56) & 0xff; -} - -static inline void -store32_le(uint8_t dst[4], uint32_t src) -{ - dst[0] = src & 0xff; - dst[1] = (src >> 8) & 0xff; - dst[2] = (src >> 16) & 0xff; - dst[3] = (src >> 24) & 0xff; -} - -static inline void -store32_be(uint8_t dst[4], uint32_t src) -{ - dst[0] = (src >> 24) & 0xff; - dst[1] = (src >> 16) & 0xff; - dst[2] = (src >> 8) & 0xff; - dst[3] = src & 0xff; -} - -static inline uint64_t -load64_le(uint8_t src[8]) -{ - return (uint64_t)(src[0]) | - ((uint64_t)(src[1]) << 8) | - ((uint64_t)(src[2]) << 16) | - ((uint64_t)(src[3]) << 24) | - ((uint64_t)(src[4]) << 32) | - ((uint64_t)(src[5]) << 40) | - ((uint64_t)(src[6]) << 48) | - ((uint64_t)(src[7]) << 56); -} - -static inline uint32_t -load32_le(uint8_t src[4]) -{ - return (uint32_t)(src[0]) | - ((uint32_t)(src[1]) << 8) | - ((uint32_t)(src[2]) << 16) | - ((uint32_t)(src[3]) << 24); -} - -#ifdef MISSING_BUILTIN_POPCOUNT -static inline unsigned int -__builtin_popcount(unsigned int num) -{ - const int v[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; - return v[num & 0xf] + v[(num >> 4) & 0xf]; -} -#endif - -/* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/eurydice_glue.h */ -#pragma once - - -#ifdef _MSC_VER -// For __popcnt -#endif - - -// C++ HELPERS - -#if defined(__cplusplus) - -#ifndef KRML_HOST_EPRINTF -#define KRML_HOST_EPRINTF(...) fprintf(stderr, __VA_ARGS__) -#endif - - -#ifndef __cpp_lib_type_identity -template -struct type_identity { - using type = T; -}; - -template -using type_identity_t = typename type_identity::type; -#else -using std::type_identity_t; -#endif - -#define KRML_UNION_CONSTRUCTOR(T) \ - template \ - constexpr T(int t, V U::*m, type_identity_t v) : tag(t) { \ - val.*m = std::move(v); \ - } \ - T() = default; - -#endif - -// GENERAL-PURPOSE STUFF - -#define LowStar_Ignore_ignore(e, t, _ret_t) ((void)e) - -#define EURYDICE_ASSERT(test, msg) \ - do { \ - if (!(test)) { \ - fprintf(stderr, "assertion \"%s\" failed: file \"%s\", line %d\n", msg, \ - __FILE__, __LINE__); \ - exit(255); \ - } \ - } while (0) - -// SLICES, ARRAYS, ETC. - -// We represent a slice as a pair of an (untyped) pointer, along with the length -// of the slice, i.e. the number of elements in the slice (this is NOT the -// number of bytes). This design choice has two important consequences. -// - if you need to use `ptr`, you MUST cast it to a proper type *before* -// performing pointer arithmetic on it (remember that C desugars pointer -// arithmetic based on the type of the address) -// - if you need to use `len` for a C style function (e.g. memcpy, memcmp), you -// need to multiply it by sizeof t, where t is the type of the elements. -// -// Empty slices have `len == 0` and `ptr` always needs to be a valid pointer -// that is not NULL (otherwise the construction in EURYDICE_SLICE computes `NULL -// + start`). -typedef struct { - void *ptr; - size_t len; -} Eurydice_slice; - -#if defined(__cplusplus) -#define KRML_CLITERAL(type) type -#else -#define KRML_CLITERAL(type) (type) -#endif - -#if defined(__cplusplus) && defined(__cpp_designated_initializers) || \ - !(defined(__cplusplus)) -#define EURYDICE_CFIELD(X) X -#else -#define EURYDICE_CFIELD(X) -#endif - -// Helper macro to create a slice out of a pointer x, a start index in x -// (included), and an end index in x (excluded). The argument x must be suitably -// cast to something that can decay (see remark above about how pointer -// arithmetic works in C), meaning either pointer or array type. -#define EURYDICE_SLICE(x, start, end) \ - (KRML_CLITERAL(Eurydice_slice){(void *)(x + start), end - start}) - -// Slice length -#define EURYDICE_SLICE_LEN(s, _) (s).len -#define Eurydice_slice_len(s, _) (s).len - -// This macro is a pain because in case the dereferenced element type is an -// array, you cannot simply write `t x` as it would yield `int[4] x` instead, -// which is NOT correct C syntax, so we add a dedicated phase in Eurydice that -// adds an extra argument to this macro at the last minute so that we have the -// correct type of *pointers* to elements. -#define Eurydice_slice_index(s, i, t, t_ptr_t) (((t_ptr_t)s.ptr)[i]) - -// The following functions get sub slices from a slice. - -#define Eurydice_slice_subslice(s, r, t, _0, _1) \ - EURYDICE_SLICE((t *)s.ptr, r.start, r.end) - -// Variant for when the start and end indices are statically known (i.e., the -// range argument `r` is a literal). -#define Eurydice_slice_subslice2(s, start, end, t) \ - EURYDICE_SLICE((t *)s.ptr, (start), (end)) - -// Previous version above does not work when t is an array type (as usual). Will -// be deprecated soon. -#define Eurydice_slice_subslice3(s, start, end, t_ptr) \ - EURYDICE_SLICE((t_ptr)s.ptr, (start), (end)) - -#define Eurydice_slice_subslice_to(s, subslice_end_pos, t, _0, _1) \ - EURYDICE_SLICE((t *)s.ptr, 0, subslice_end_pos) - -#define Eurydice_slice_subslice_from(s, subslice_start_pos, t, _0, _1) \ - EURYDICE_SLICE((t *)s.ptr, subslice_start_pos, s.len) - -#define Eurydice_array_to_slice(end, x, t) \ - EURYDICE_SLICE(x, 0, \ - end) /* x is already at an array type, no need for cast */ -#define Eurydice_array_to_subslice(_arraylen, x, r, t, _0, _1) \ - EURYDICE_SLICE((t *)x, r.start, r.end) - -// Same as above, variant for when start and end are statically known -#define Eurydice_array_to_subslice2(x, start, end, t) \ - EURYDICE_SLICE((t *)x, (start), (end)) - -// Same as above, variant for when start and end are statically known -#define Eurydice_array_to_subslice3(x, start, end, t_ptr) \ - EURYDICE_SLICE((t_ptr)x, (start), (end)) - -#define Eurydice_array_repeat(dst, len, init, t) \ - ERROR "should've been desugared" - -// The following functions convert an array into a slice. - -#define Eurydice_array_to_subslice_to(_size, x, r, t, _range_t, _0) \ - EURYDICE_SLICE((t *)x, 0, r) -#define Eurydice_array_to_subslice_from(size, x, r, t, _range_t, _0) \ - EURYDICE_SLICE((t *)x, r, size) - -// Copy a slice with memcopy -#define Eurydice_slice_copy(dst, src, t) \ - memcpy(dst.ptr, src.ptr, dst.len * sizeof(t)) - -#define core_array___Array_T__N___as_slice(len_, ptr_, t, _ret_t) \ - KRML_CLITERAL(Eurydice_slice) { ptr_, len_ } - -#define core_array__core__clone__Clone_for__Array_T__N___clone( \ - len, src, dst, elem_type, _ret_t) \ - (memcpy(dst, src, len * sizeof(elem_type))) -#define TryFromSliceError uint8_t -#define core_array_TryFromSliceError uint8_t - -#define Eurydice_array_eq(sz, a1, a2, t) (memcmp(a1, a2, sz * sizeof(t)) == 0) - -// core::cmp::PartialEq<&0 (@Slice)> for @Array -#define Eurydice_array_eq_slice(sz, a1, s2, t, _) \ - (memcmp(a1, (s2)->ptr, sz * sizeof(t)) == 0) - -#define core_array_equality___core__cmp__PartialEq__Array_U__N___for__Array_T__N____eq( \ - sz, a1, a2, t, _, _ret_t) \ - Eurydice_array_eq(sz, a1, a2, t, _) -#define core_array_equality___core__cmp__PartialEq__0___Slice_U____for__Array_T__N___3__eq( \ - sz, a1, a2, t, _, _ret_t) \ - Eurydice_array_eq(sz, a1, ((a2)->ptr), t, _) - -#define Eurydice_slice_split_at(slice, mid, element_type, ret_t) \ - KRML_CLITERAL(ret_t) { \ - EURYDICE_CFIELD(.fst =) \ - EURYDICE_SLICE((element_type *)(slice).ptr, 0, mid), \ - EURYDICE_CFIELD(.snd =) \ - EURYDICE_SLICE((element_type *)(slice).ptr, mid, (slice).len) \ - } - -#define Eurydice_slice_split_at_mut(slice, mid, element_type, ret_t) \ - KRML_CLITERAL(ret_t) { \ - EURYDICE_CFIELD(.fst =) \ - KRML_CLITERAL(Eurydice_slice){EURYDICE_CFIELD(.ptr =)(slice.ptr), \ - EURYDICE_CFIELD(.len =) mid}, \ - EURYDICE_CFIELD(.snd =) KRML_CLITERAL(Eurydice_slice) { \ - EURYDICE_CFIELD(.ptr =) \ - ((char *)slice.ptr + mid * sizeof(element_type)), \ - EURYDICE_CFIELD(.len =)(slice.len - mid) \ - } \ - } - -// Conversion of slice to an array, rewritten (by Eurydice) to name the -// destination array, since arrays are not values in C. -// N.B.: see note in karamel/lib/Inlining.ml if you change this. -#define Eurydice_slice_to_array2(dst, src, _0, t_arr, _1) \ - Eurydice_slice_to_array3(&(dst)->tag, (char *)&(dst)->val.case_Ok, src, \ - sizeof(t_arr)) - -static inline void Eurydice_slice_to_array3(uint8_t *dst_tag, char *dst_ok, - Eurydice_slice src, size_t sz) { - *dst_tag = 0; - memcpy(dst_ok, src.ptr, sz); -} - -// SUPPORT FOR DSTs (Dynamically-Sized Types) - -// A DST is a fat pointer that keeps tracks of the size of it flexible array -// member. Slices are a specific case of DSTs, where [T; N] implements -// Unsize<[T]>, meaning an array of statically known size can be converted to a -// fat pointer, i.e. a slice. -// -// Unlike slices, DSTs have a built-in definition that gets monomorphized, of -// the form: -// -// typedef struct { -// T *ptr; -// size_t len; // number of elements -// } Eurydice_dst; -// -// Furthermore, T = T0<[U0]> where `struct T0`, where the `U` is the -// last field. This means that there are two monomorphizations of T0 in the -// program. One is `T0<[V; N]>` -// -- this is directly converted to a Eurydice_dst via suitable codegen (no -// macro). The other is `T = T0<[U]>`, where `[U]` gets emitted to -// `Eurydice_derefed_slice`, a type that only appears in that precise situation -// and is thus defined to give rise to a flexible array member. - -typedef char Eurydice_derefed_slice[]; - -#define Eurydice_slice_of_dst(fam_ptr, len_, t, _) \ - ((Eurydice_slice){.ptr = (void *)(fam_ptr), .len = len_}) - -#define Eurydice_slice_of_boxed_array(ptr_, len_, t, _) \ - ((Eurydice_slice){.ptr = (void *)(ptr_), .len = len_}) - -// CORE STUFF (conversions, endianness, ...) - -// We slap extern "C" on declarations that intend to implement a prototype -// generated by Eurydice, because Eurydice prototypes are always emitted within -// an extern "C" block, UNLESS you use -fcxx17-compat, in which case, you must -// pass -DKRML_CXX17_COMPAT="" to your C++ compiler. -#if defined(__cplusplus) && !defined(KRML_CXX17_COMPAT) -extern "C" { -#endif - -static inline void core_num__u32__to_be_bytes(uint32_t src, uint8_t dst[4]) { - store32_be(dst, src); -} - -static inline void core_num__u32__to_le_bytes(uint32_t src, uint8_t dst[4]) { - store32_le(dst, src); -} - -static inline uint32_t core_num__u32__from_le_bytes(uint8_t buf[4]) { - return load32_le(buf); -} - -static inline void core_num__u64__to_le_bytes(uint64_t v, uint8_t buf[8]) { - store64_le(buf, v); -} - -static inline uint64_t core_num__u64__from_le_bytes(uint8_t buf[8]) { - return load64_le(buf); -} - -static inline int64_t core_convert_num___core__convert__From_i32__for_i64__from( - int32_t x) { - return x; -} - -static inline uint64_t core_convert_num___core__convert__From_u8__for_u64__from( - uint8_t x) { - return x; -} - -static inline uint64_t -core_convert_num___core__convert__From_u16__for_u64__from(uint16_t x) { - return x; -} - -static inline size_t -core_convert_num___core__convert__From_u16__for_usize__from(uint16_t x) { - return x; -} - -static inline uint32_t core_num__u8__count_ones(uint8_t x0) { -#ifdef _MSC_VER - return __popcnt(x0); -#else - return __builtin_popcount(x0); -#endif -} - -static inline uint32_t core_num__i32__count_ones(int32_t x0) { -#ifdef _MSC_VER - return __popcnt(x0); -#else - return __builtin_popcount(x0); -#endif -} - -static inline size_t core_cmp_impls___core__cmp__Ord_for_usize__min(size_t a, - size_t b) { - if (a <= b) - return a; - else - return b; -} - -// unsigned overflow wraparound semantics in C -static inline uint16_t core_num__u16__wrapping_add(uint16_t x, uint16_t y) { - return x + y; -} -static inline uint8_t core_num__u8__wrapping_sub(uint8_t x, uint8_t y) { - return x - y; -} -static inline uint64_t core_num__u64__rotate_left(uint64_t x0, uint32_t x1) { - return (x0 << x1 | x0 >> (64 - x1)); -} - -static inline void core_ops_arith__i32__add_assign(int32_t *x0, int32_t *x1) { - *x0 = *x0 + *x1; -} - -static inline uint8_t Eurydice_bitand_pv_u8(uint8_t *p, uint8_t v) { - return (*p) & v; -} -static inline uint8_t Eurydice_shr_pv_u8(uint8_t *p, int32_t v) { - return (*p) >> v; -} -static inline uint32_t Eurydice_min_u32(uint32_t x, uint32_t y) { - return x < y ? x : y; -} - -static inline uint8_t -core_ops_bit___core__ops__bit__BitAnd_u8__u8__for___a__u8___46__bitand( - uint8_t *x0, uint8_t x1) { - return Eurydice_bitand_pv_u8(x0, x1); -} - -static inline uint8_t -core_ops_bit___core__ops__bit__Shr_i32__u8__for___a__u8___792__shr(uint8_t *x0, - int32_t x1) { - return Eurydice_shr_pv_u8(x0, x1); -} - -#define core_num_nonzero_private_NonZeroUsizeInner size_t -static inline core_num_nonzero_private_NonZeroUsizeInner -core_num_nonzero_private___core__clone__Clone_for_core__num__nonzero__private__NonZeroUsizeInner__26__clone( - core_num_nonzero_private_NonZeroUsizeInner *x0) { - return *x0; -} - -#if defined(__cplusplus) && !defined(KRML_CXX17_COMPAT) -} -#endif - -// ITERATORS - -#define Eurydice_range_iter_next(iter_ptr, t, ret_t) \ - (((iter_ptr)->start >= (iter_ptr)->end) \ - ? (KRML_CLITERAL(ret_t){EURYDICE_CFIELD(.tag =) 0, \ - EURYDICE_CFIELD(.f0 =) 0}) \ - : (KRML_CLITERAL(ret_t){EURYDICE_CFIELD(.tag =) 1, \ - EURYDICE_CFIELD(.f0 =)(iter_ptr)->start++})) - -#define core_iter_range___core__iter__traits__iterator__Iterator_A__for_core__ops__range__Range_A__TraitClause_0___6__next \ - Eurydice_range_iter_next - -// See note in karamel/lib/Inlining.ml if you change this -#define Eurydice_into_iter(x, t, _ret_t, _) (x) -#define core_iter_traits_collect___core__iter__traits__collect__IntoIterator_Clause1_Item__I__for_I__1__into_iter \ - Eurydice_into_iter - -typedef struct { - Eurydice_slice slice; - size_t chunk_size; -} Eurydice_chunks; - -// Can't use macros Eurydice_slice_subslice_{to,from} because they require a -// type, and this static inline function cannot receive a type as an argument. -// Instead, we receive the element size and use it to peform manual offset -// computations rather than going through the macros. -static inline Eurydice_slice chunk_next(Eurydice_chunks *chunks, - size_t element_size) { - size_t chunk_size = chunks->slice.len >= chunks->chunk_size - ? chunks->chunk_size - : chunks->slice.len; - Eurydice_slice curr_chunk; - curr_chunk.ptr = chunks->slice.ptr; - curr_chunk.len = chunk_size; - chunks->slice.ptr = (char *)(chunks->slice.ptr) + chunk_size * element_size; - chunks->slice.len = chunks->slice.len - chunk_size; - return curr_chunk; -} - -#define core_slice___Slice_T___chunks(slice_, sz_, t, _ret_t) \ - ((Eurydice_chunks){.slice = slice_, .chunk_size = sz_}) -#define core_slice___Slice_T___chunks_exact(slice_, sz_, t, _ret_t) \ - ((Eurydice_chunks){ \ - .slice = {.ptr = slice_.ptr, .len = slice_.len - (slice_.len % sz_)}, \ - .chunk_size = sz_}) -#define core_slice_iter_Chunks Eurydice_chunks -#define core_slice_iter_ChunksExact Eurydice_chunks -#define Eurydice_chunks_next(iter, t, ret_t) \ - (((iter)->slice.len == 0) ? ((ret_t){.tag = core_option_None}) \ - : ((ret_t){.tag = core_option_Some, \ - .f0 = chunk_next(iter, sizeof(t))})) -#define core_slice_iter___core__iter__traits__iterator__Iterator_for_core__slice__iter__Chunks__a__T___70__next \ - Eurydice_chunks_next -// This name changed on 20240627 -#define core_slice_iter___core__iter__traits__iterator__Iterator_for_core__slice__iter__Chunks__a__T___71__next \ - Eurydice_chunks_next -#define core_slice_iter__core__slice__iter__ChunksExact__a__T__89__next( \ - iter, t, _ret_t) \ - core_slice_iter__core__slice__iter__Chunks__a__T__70__next(iter, t) - -typedef struct { - Eurydice_slice s; - size_t index; -} Eurydice_slice_iterator; - -#define core_slice___Slice_T___iter(x, t, _ret_t) \ - ((Eurydice_slice_iterator){.s = x, .index = 0}) -#define core_slice_iter_Iter Eurydice_slice_iterator -#define core_slice_iter__core__slice__iter__Iter__a__T__181__next(iter, t, \ - ret_t) \ - (((iter)->index == (iter)->s.len) \ - ? (KRML_CLITERAL(ret_t){.tag = core_option_None}) \ - : (KRML_CLITERAL(ret_t){ \ - .tag = core_option_Some, \ - .f0 = ((iter)->index++, \ - &((t *)((iter)->s.ptr))[(iter)->index - 1])})) -#define core_option__core__option__Option_T__TraitClause_0___is_some(X, _0, \ - _1) \ - ((X)->tag == 1) -// STRINGS - -typedef const char *Prims_string; - -// MISC (UNTESTED) - -typedef void *core_fmt_Formatter; -typedef void *core_fmt_Arguments; -typedef void *core_fmt_rt_Argument; -#define core_fmt_rt__core__fmt__rt__Argument__a__1__new_display(x1, x2, x3, \ - x4) \ - NULL - -// BOXES - -// Crimes. -static inline char *malloc_and_init(size_t sz, char *init) { - char *ptr = (char *)malloc(sz); - memcpy(ptr, init, sz); - return ptr; -} - -#define Eurydice_box_new(init, t, t_dst) \ - ((t_dst)(malloc_and_init(sizeof(t), (char *)(&init)))) - -#define Eurydice_box_new_array(len, ptr, t, t_dst) \ - ((t_dst)(malloc_and_init(len * sizeof(t), (char *)(ptr)))) - -/* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/libcrux_mlkem_core.h */ -/* - * SPDX-FileCopyrightText: 2025 Cryspen Sarl - * - * SPDX-License-Identifier: MIT or Apache-2.0 - * - * This code was generated with the following revisions: - * Charon: 667d2fc98984ff7f3df989c2367e6c1fa4a000e7 - * Eurydice: 2381cbc416ef2ad0b561c362c500bc84f36b6785 - * Karamel: 80f5435f2fc505973c469a4afcc8d875cddd0d8b - * F*: 71d8221589d4d438af3706d89cb653cf53e18aab - * Libcrux: 68dfed5a4a9e40277f62828471c029afed1ecdcc - */ - -#ifndef libcrux_mlkem_core_H -#define libcrux_mlkem_core_H - - -#if defined(__cplusplus) -extern "C" { -#endif - -/** -A monomorphic instance of core.ops.range.Range -with types size_t - -*/ -typedef struct core_ops_range_Range_08_s { - size_t start; - size_t end; -} core_ops_range_Range_08; - -static inline uint16_t core_num__u16__wrapping_add(uint16_t x0, uint16_t x1); - -static inline uint64_t core_num__u64__from_le_bytes(uint8_t x0[8U]); - -static inline uint64_t core_num__u64__rotate_left(uint64_t x0, uint32_t x1); - -static inline void core_num__u64__to_le_bytes(uint64_t x0, uint8_t x1[8U]); - -static inline uint32_t core_num__u8__count_ones(uint8_t x0); - -static inline uint8_t core_num__u8__wrapping_sub(uint8_t x0, uint8_t x1); - -#define LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE ((size_t)32U) - -#define LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT ((size_t)12U) - -#define LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT ((size_t)256U) - -#define LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT \ - (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * (size_t)12U) - -#define LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT \ - (LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U) - -#define LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE ((size_t)32U) - -#define LIBCRUX_ML_KEM_CONSTANTS_G_DIGEST_SIZE ((size_t)64U) - -#define LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE ((size_t)32U) - -/** - K * BITS_PER_RING_ELEMENT / 8 - - [eurydice] Note that we can't use const generics here because that breaks - C extraction with eurydice. -*/ -static inline size_t libcrux_ml_kem_constants_ranked_bytes_per_ring_element( - size_t rank) { - return rank * LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U; -} - -/** -This function found in impl {libcrux_secrets::traits::Classify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 -with types uint8_t - -*/ -static KRML_MUSTINLINE uint8_t -libcrux_secrets_int_public_integers_classify_27_90(uint8_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types int16_t - -*/ -static KRML_MUSTINLINE int16_t -libcrux_secrets_int_public_integers_declassify_d8_39(int16_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for i16} -*/ -static KRML_MUSTINLINE uint8_t libcrux_secrets_int_as_u8_f5(int16_t self) { - return libcrux_secrets_int_public_integers_classify_27_90( - (uint8_t)libcrux_secrets_int_public_integers_declassify_d8_39(self)); -} - -/** -This function found in impl {libcrux_secrets::traits::Classify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 -with types int16_t - -*/ -static KRML_MUSTINLINE int16_t -libcrux_secrets_int_public_integers_classify_27_39(int16_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types uint8_t - -*/ -static KRML_MUSTINLINE uint8_t -libcrux_secrets_int_public_integers_declassify_d8_90(uint8_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for u8} -*/ -static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_59(uint8_t self) { - return libcrux_secrets_int_public_integers_classify_27_39( - (int16_t)libcrux_secrets_int_public_integers_declassify_d8_90(self)); -} - -/** -This function found in impl {libcrux_secrets::traits::Classify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 -with types int32_t - -*/ -static KRML_MUSTINLINE int32_t -libcrux_secrets_int_public_integers_classify_27_a8(int32_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for i16} -*/ -static KRML_MUSTINLINE int32_t libcrux_secrets_int_as_i32_f5(int16_t self) { - return libcrux_secrets_int_public_integers_classify_27_a8( - (int32_t)libcrux_secrets_int_public_integers_declassify_d8_39(self)); -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types int32_t - -*/ -static KRML_MUSTINLINE int32_t -libcrux_secrets_int_public_integers_declassify_d8_a8(int32_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for i32} -*/ -static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_36(int32_t self) { - return libcrux_secrets_int_public_integers_classify_27_39( - (int16_t)libcrux_secrets_int_public_integers_declassify_d8_a8(self)); -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types uint32_t - -*/ -static KRML_MUSTINLINE uint32_t -libcrux_secrets_int_public_integers_declassify_d8_df(uint32_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for u32} -*/ -static KRML_MUSTINLINE int32_t libcrux_secrets_int_as_i32_b8(uint32_t self) { - return libcrux_secrets_int_public_integers_classify_27_a8( - (int32_t)libcrux_secrets_int_public_integers_declassify_d8_df(self)); -} - -/** -This function found in impl {libcrux_secrets::traits::Classify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 -with types uint16_t - -*/ -static KRML_MUSTINLINE uint16_t -libcrux_secrets_int_public_integers_classify_27_de(uint16_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for i16} -*/ -static KRML_MUSTINLINE uint16_t libcrux_secrets_int_as_u16_f5(int16_t self) { - return libcrux_secrets_int_public_integers_classify_27_de( - (uint16_t)libcrux_secrets_int_public_integers_declassify_d8_39(self)); -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types uint16_t - -*/ -static KRML_MUSTINLINE uint16_t -libcrux_secrets_int_public_integers_declassify_d8_de(uint16_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for u16} -*/ -static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_ca(uint16_t self) { - return libcrux_secrets_int_public_integers_classify_27_39( - (int16_t)libcrux_secrets_int_public_integers_declassify_d8_de(self)); -} - -/** -This function found in impl {libcrux_secrets::traits::Classify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 -with types uint64_t - -*/ -static KRML_MUSTINLINE uint64_t -libcrux_secrets_int_public_integers_classify_27_49(uint64_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for u16} -*/ -static KRML_MUSTINLINE uint64_t libcrux_secrets_int_as_u64_ca(uint16_t self) { - return libcrux_secrets_int_public_integers_classify_27_49( - (uint64_t)libcrux_secrets_int_public_integers_declassify_d8_de(self)); -} - -/** -This function found in impl {libcrux_secrets::traits::Classify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 -with types uint32_t - -*/ -static KRML_MUSTINLINE uint32_t -libcrux_secrets_int_public_integers_classify_27_df(uint32_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types uint64_t - -*/ -static KRML_MUSTINLINE uint64_t -libcrux_secrets_int_public_integers_declassify_d8_49(uint64_t self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for u64} -*/ -static KRML_MUSTINLINE uint32_t libcrux_secrets_int_as_u32_a3(uint64_t self) { - return libcrux_secrets_int_public_integers_classify_27_df( - (uint32_t)libcrux_secrets_int_public_integers_declassify_d8_49(self)); -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for u32} -*/ -static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_b8(uint32_t self) { - return libcrux_secrets_int_public_integers_classify_27_39( - (int16_t)libcrux_secrets_int_public_integers_declassify_d8_df(self)); -} - -/** -This function found in impl {libcrux_secrets::int::CastOps for i16} -*/ -static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_f5(int16_t self) { - return libcrux_secrets_int_public_integers_classify_27_39( - libcrux_secrets_int_public_integers_declassify_d8_39(self)); -} - -typedef struct libcrux_ml_kem_utils_extraction_helper_Keypair768_s { - uint8_t fst[1152U]; - uint8_t snd[1184U]; -} libcrux_ml_kem_utils_extraction_helper_Keypair768; - -#define Ok 0 -#define Err 1 - -typedef uint8_t Result_b2_tags; - -/** -A monomorphic instance of core.result.Result -with types uint8_t[24size_t], core_array_TryFromSliceError - -*/ -typedef struct Result_b2_s { - Result_b2_tags tag; - union { - uint8_t case_Ok[24U]; - TryFromSliceError case_Err; - } val; -} Result_b2; - -/** -This function found in impl {core::result::Result[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of core.result.unwrap_26 -with types uint8_t[24size_t], core_array_TryFromSliceError - -*/ -static inline void unwrap_26_70(Result_b2 self, uint8_t ret[24U]) { - if (self.tag == Ok) { - uint8_t f0[24U]; - memcpy(f0, self.val.case_Ok, (size_t)24U * sizeof(uint8_t)); - memcpy(ret, f0, (size_t)24U * sizeof(uint8_t)); - } else { - KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, - "unwrap not Ok"); - KRML_HOST_EXIT(255U); - } -} - -/** -A monomorphic instance of core.result.Result -with types uint8_t[20size_t], core_array_TryFromSliceError - -*/ -typedef struct Result_e1_s { - Result_b2_tags tag; - union { - uint8_t case_Ok[20U]; - TryFromSliceError case_Err; - } val; -} Result_e1; - -/** -This function found in impl {core::result::Result[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of core.result.unwrap_26 -with types uint8_t[20size_t], core_array_TryFromSliceError - -*/ -static inline void unwrap_26_20(Result_e1 self, uint8_t ret[20U]) { - if (self.tag == Ok) { - uint8_t f0[20U]; - memcpy(f0, self.val.case_Ok, (size_t)20U * sizeof(uint8_t)); - memcpy(ret, f0, (size_t)20U * sizeof(uint8_t)); - } else { - KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, - "unwrap not Ok"); - KRML_HOST_EXIT(255U); - } -} - -/** - Pad the `slice` with `0`s at the end. -*/ -/** -A monomorphic instance of libcrux_ml_kem.utils.into_padded_array -with const generics -- LEN= 32 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_9e( - Eurydice_slice slice, uint8_t ret[32U]) { - uint8_t out[32U] = {0U}; - uint8_t *uu____0 = out; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *), - slice, uint8_t); - memcpy(ret, out, (size_t)32U * sizeof(uint8_t)); -} - -/** -A monomorphic instance of libcrux_ml_kem.types.MlKemPrivateKey -with const generics -- $2400size_t -*/ -typedef struct libcrux_ml_kem_types_MlKemPrivateKey_d9_s { - uint8_t value[2400U]; -} libcrux_ml_kem_types_MlKemPrivateKey_d9; - -/** -This function found in impl {core::default::Default for -libcrux_ml_kem::types::MlKemPrivateKey} -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.default_d3 -with const generics -- SIZE= 2400 -*/ -static inline libcrux_ml_kem_types_MlKemPrivateKey_d9 -libcrux_ml_kem_types_default_d3_28(void) { - return ( - KRML_CLITERAL(libcrux_ml_kem_types_MlKemPrivateKey_d9){.value = {0U}}); -} - -/** -A monomorphic instance of libcrux_ml_kem.types.MlKemPublicKey -with const generics -- $1184size_t -*/ -typedef struct libcrux_ml_kem_types_MlKemPublicKey_30_s { - uint8_t value[1184U]; -} libcrux_ml_kem_types_MlKemPublicKey_30; - -/** -This function found in impl {core::convert::From<@Array> for -libcrux_ml_kem::types::MlKemPublicKey} -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.from_fd -with const generics -- SIZE= 1184 -*/ -static inline libcrux_ml_kem_types_MlKemPublicKey_30 -libcrux_ml_kem_types_from_fd_d0(uint8_t value[1184U]) { - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_value[1184U]; - memcpy(copy_of_value, value, (size_t)1184U * sizeof(uint8_t)); - libcrux_ml_kem_types_MlKemPublicKey_30 lit; - memcpy(lit.value, copy_of_value, (size_t)1184U * sizeof(uint8_t)); - return lit; -} - -typedef struct libcrux_ml_kem_mlkem768_MlKem768KeyPair_s { - libcrux_ml_kem_types_MlKemPrivateKey_d9 sk; - libcrux_ml_kem_types_MlKemPublicKey_30 pk; -} libcrux_ml_kem_mlkem768_MlKem768KeyPair; - -/** -This function found in impl -{libcrux_ml_kem::types::MlKemKeyPair} -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.from_17 -with const generics -- PRIVATE_KEY_SIZE= 2400 -- PUBLIC_KEY_SIZE= 1184 -*/ -static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair -libcrux_ml_kem_types_from_17_74(libcrux_ml_kem_types_MlKemPrivateKey_d9 sk, - libcrux_ml_kem_types_MlKemPublicKey_30 pk) { - return (KRML_CLITERAL(libcrux_ml_kem_mlkem768_MlKem768KeyPair){.sk = sk, - .pk = pk}); -} - -/** -This function found in impl {core::convert::From<@Array> for -libcrux_ml_kem::types::MlKemPrivateKey} -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.from_77 -with const generics -- SIZE= 2400 -*/ -static inline libcrux_ml_kem_types_MlKemPrivateKey_d9 -libcrux_ml_kem_types_from_77_28(uint8_t value[2400U]) { - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_value[2400U]; - memcpy(copy_of_value, value, (size_t)2400U * sizeof(uint8_t)); - libcrux_ml_kem_types_MlKemPrivateKey_d9 lit; - memcpy(lit.value, copy_of_value, (size_t)2400U * sizeof(uint8_t)); - return lit; -} - -/** -A monomorphic instance of core.result.Result -with types uint8_t[32size_t], core_array_TryFromSliceError - -*/ -typedef struct Result_fb_s { - Result_b2_tags tag; - union { - uint8_t case_Ok[32U]; - TryFromSliceError case_Err; - } val; -} Result_fb; - -/** -This function found in impl {core::result::Result[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of core.result.unwrap_26 -with types uint8_t[32size_t], core_array_TryFromSliceError - -*/ -static inline void unwrap_26_b3(Result_fb self, uint8_t ret[32U]) { - if (self.tag == Ok) { - uint8_t f0[32U]; - memcpy(f0, self.val.case_Ok, (size_t)32U * sizeof(uint8_t)); - memcpy(ret, f0, (size_t)32U * sizeof(uint8_t)); - } else { - KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, - "unwrap not Ok"); - KRML_HOST_EXIT(255U); - } -} - -typedef struct libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s { - uint8_t value[1088U]; -} libcrux_ml_kem_mlkem768_MlKem768Ciphertext; - -/** -A monomorphic instance of K. -with types libcrux_ml_kem_types_MlKemCiphertext[[$1088size_t]], -uint8_t[32size_t] - -*/ -typedef struct tuple_c2_s { - libcrux_ml_kem_mlkem768_MlKem768Ciphertext fst; - uint8_t snd[32U]; -} tuple_c2; - -/** -This function found in impl {core::convert::From<@Array> for -libcrux_ml_kem::types::MlKemCiphertext} -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.from_e0 -with const generics -- SIZE= 1088 -*/ -static inline libcrux_ml_kem_mlkem768_MlKem768Ciphertext -libcrux_ml_kem_types_from_e0_80(uint8_t value[1088U]) { - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_value[1088U]; - memcpy(copy_of_value, value, (size_t)1088U * sizeof(uint8_t)); - libcrux_ml_kem_mlkem768_MlKem768Ciphertext lit; - memcpy(lit.value, copy_of_value, (size_t)1088U * sizeof(uint8_t)); - return lit; -} - -/** -This function found in impl {libcrux_ml_kem::types::MlKemPublicKey} -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.as_slice_e6 -with const generics -- SIZE= 1184 -*/ -static inline uint8_t *libcrux_ml_kem_types_as_slice_e6_d0( - libcrux_ml_kem_types_MlKemPublicKey_30 *self) { - return self->value; -} - -/** -This function found in impl {libcrux_ml_kem::types::MlKemCiphertext} -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.as_slice_a9 -with const generics -- SIZE= 1088 -*/ -static inline uint8_t *libcrux_ml_kem_types_as_slice_a9_80( - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *self) { - return self->value; -} - -/** -A monomorphic instance of libcrux_ml_kem.utils.prf_input_inc -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE uint8_t libcrux_ml_kem_utils_prf_input_inc_e0( - uint8_t (*prf_inputs)[33U], uint8_t domain_separator) { - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - prf_inputs[i0][32U] = domain_separator; - domain_separator = (uint32_t)domain_separator + 1U; - } - return domain_separator; -} - -/** - Pad the `slice` with `0`s at the end. -*/ -/** -A monomorphic instance of libcrux_ml_kem.utils.into_padded_array -with const generics -- LEN= 33 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_c8( - Eurydice_slice slice, uint8_t ret[33U]) { - uint8_t out[33U] = {0U}; - uint8_t *uu____0 = out; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *), - slice, uint8_t); - memcpy(ret, out, (size_t)33U * sizeof(uint8_t)); -} - -/** - Pad the `slice` with `0`s at the end. -*/ -/** -A monomorphic instance of libcrux_ml_kem.utils.into_padded_array -with const generics -- LEN= 34 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_b6( - Eurydice_slice slice, uint8_t ret[34U]) { - uint8_t out[34U] = {0U}; - uint8_t *uu____0 = out; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *), - slice, uint8_t); - memcpy(ret, out, (size_t)34U * sizeof(uint8_t)); -} - -/** -This function found in impl {core::convert::AsRef<@Slice> for -libcrux_ml_kem::types::MlKemCiphertext} -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.as_ref_d3 -with const generics -- SIZE= 1088 -*/ -static inline Eurydice_slice libcrux_ml_kem_types_as_ref_d3_80( - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *self) { - return Eurydice_array_to_slice((size_t)1088U, self->value, uint8_t); -} - -/** - Pad the `slice` with `0`s at the end. -*/ -/** -A monomorphic instance of libcrux_ml_kem.utils.into_padded_array -with const generics -- LEN= 1120 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_15( - Eurydice_slice slice, uint8_t ret[1120U]) { - uint8_t out[1120U] = {0U}; - uint8_t *uu____0 = out; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *), - slice, uint8_t); - memcpy(ret, out, (size_t)1120U * sizeof(uint8_t)); -} - -/** - Pad the `slice` with `0`s at the end. -*/ -/** -A monomorphic instance of libcrux_ml_kem.utils.into_padded_array -with const generics -- LEN= 64 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_24( - Eurydice_slice slice, uint8_t ret[64U]) { - uint8_t out[64U] = {0U}; - uint8_t *uu____0 = out; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *), - slice, uint8_t); - memcpy(ret, out, (size_t)64U * sizeof(uint8_t)); -} - -typedef struct Eurydice_slice_uint8_t_x4_s { - Eurydice_slice fst; - Eurydice_slice snd; - Eurydice_slice thd; - Eurydice_slice f3; -} Eurydice_slice_uint8_t_x4; - -typedef struct Eurydice_slice_uint8_t_x2_s { - Eurydice_slice fst; - Eurydice_slice snd; -} Eurydice_slice_uint8_t_x2; - -/** - Unpack an incoming private key into it's different parts. - - We have this here in types to extract into a common core for C. -*/ -/** -A monomorphic instance of libcrux_ml_kem.types.unpack_private_key -with const generics -- CPA_SECRET_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -*/ -static inline Eurydice_slice_uint8_t_x4 -libcrux_ml_kem_types_unpack_private_key_b4(Eurydice_slice private_key) { - Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at( - private_key, (size_t)1152U, uint8_t, Eurydice_slice_uint8_t_x2); - Eurydice_slice ind_cpa_secret_key = uu____0.fst; - Eurydice_slice secret_key0 = uu____0.snd; - Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at( - secret_key0, (size_t)1184U, uint8_t, Eurydice_slice_uint8_t_x2); - Eurydice_slice ind_cpa_public_key = uu____1.fst; - Eurydice_slice secret_key = uu____1.snd; - Eurydice_slice_uint8_t_x2 uu____2 = Eurydice_slice_split_at( - secret_key, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t, - Eurydice_slice_uint8_t_x2); - Eurydice_slice ind_cpa_public_key_hash = uu____2.fst; - Eurydice_slice implicit_rejection_value = uu____2.snd; - return ( - KRML_CLITERAL(Eurydice_slice_uint8_t_x4){.fst = ind_cpa_secret_key, - .snd = ind_cpa_public_key, - .thd = ind_cpa_public_key_hash, - .f3 = implicit_rejection_value}); -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types uint8_t[24size_t] - -*/ -static KRML_MUSTINLINE void -libcrux_secrets_int_public_integers_declassify_d8_d2(uint8_t self[24U], - uint8_t ret[24U]) { - memcpy(ret, self, (size_t)24U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types uint8_t[20size_t] - -*/ -static KRML_MUSTINLINE void -libcrux_secrets_int_public_integers_declassify_d8_57(uint8_t self[20U], - uint8_t ret[20U]) { - memcpy(ret, self, (size_t)20U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types uint8_t[8size_t] - -*/ -static KRML_MUSTINLINE void -libcrux_secrets_int_public_integers_declassify_d8_76(uint8_t self[8U], - uint8_t ret[8U]) { - memcpy(ret, self, (size_t)8U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_secrets::traits::Declassify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8 -with types uint8_t[2size_t] - -*/ -static KRML_MUSTINLINE void -libcrux_secrets_int_public_integers_declassify_d8_d4(uint8_t self[2U], - uint8_t ret[2U]) { - memcpy(ret, self, (size_t)2U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_secrets::traits::Classify for T} -*/ -/** -A monomorphic instance of libcrux_secrets.int.public_integers.classify_27 -with types int16_t[16size_t] - -*/ -static KRML_MUSTINLINE void libcrux_secrets_int_public_integers_classify_27_46( - int16_t self[16U], int16_t ret[16U]) { - memcpy(ret, self, (size_t)16U * sizeof(int16_t)); -} - -/** -This function found in impl {libcrux_secrets::traits::ClassifyRef<&'a -(@Slice)> for &'a (@Slice)} -*/ -/** -A monomorphic instance of libcrux_secrets.int.classify_public.classify_ref_9b -with types uint8_t - -*/ -static KRML_MUSTINLINE Eurydice_slice -libcrux_secrets_int_classify_public_classify_ref_9b_90(Eurydice_slice self) { - return self; -} - -/** -This function found in impl {libcrux_secrets::traits::ClassifyRef<&'a -(@Slice)> for &'a (@Slice)} -*/ -/** -A monomorphic instance of libcrux_secrets.int.classify_public.classify_ref_9b -with types int16_t - -*/ -static KRML_MUSTINLINE Eurydice_slice -libcrux_secrets_int_classify_public_classify_ref_9b_39(Eurydice_slice self) { - return self; -} - -/** -A monomorphic instance of core.result.Result -with types int16_t[16size_t], core_array_TryFromSliceError - -*/ -typedef struct Result_0a_s { - Result_b2_tags tag; - union { - int16_t case_Ok[16U]; - TryFromSliceError case_Err; - } val; -} Result_0a; - -/** -This function found in impl {core::result::Result[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of core.result.unwrap_26 -with types int16_t[16size_t], core_array_TryFromSliceError - -*/ -static inline void unwrap_26_00(Result_0a self, int16_t ret[16U]) { - if (self.tag == Ok) { - int16_t f0[16U]; - memcpy(f0, self.val.case_Ok, (size_t)16U * sizeof(int16_t)); - memcpy(ret, f0, (size_t)16U * sizeof(int16_t)); - } else { - KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, - "unwrap not Ok"); - KRML_HOST_EXIT(255U); - } -} - -/** -A monomorphic instance of core.result.Result -with types uint8_t[8size_t], core_array_TryFromSliceError - -*/ -typedef struct Result_15_s { - Result_b2_tags tag; - union { - uint8_t case_Ok[8U]; - TryFromSliceError case_Err; - } val; -} Result_15; - -/** -This function found in impl {core::result::Result[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of core.result.unwrap_26 -with types uint8_t[8size_t], core_array_TryFromSliceError - -*/ -static inline void unwrap_26_68(Result_15 self, uint8_t ret[8U]) { - if (self.tag == Ok) { - uint8_t f0[8U]; - memcpy(f0, self.val.case_Ok, (size_t)8U * sizeof(uint8_t)); - memcpy(ret, f0, (size_t)8U * sizeof(uint8_t)); - } else { - KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, - "unwrap not Ok"); - KRML_HOST_EXIT(255U); - } -} - -#if defined(__cplusplus) -} -#endif - -#define libcrux_mlkem_core_H_DEFINED -#endif /* libcrux_mlkem_core_H */ - -/* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/libcrux_ct_ops.h */ -/* - * SPDX-FileCopyrightText: 2025 Cryspen Sarl - * - * SPDX-License-Identifier: MIT or Apache-2.0 - * - * This code was generated with the following revisions: - * Charon: 667d2fc98984ff7f3df989c2367e6c1fa4a000e7 - * Eurydice: 2381cbc416ef2ad0b561c362c500bc84f36b6785 - * Karamel: 80f5435f2fc505973c469a4afcc8d875cddd0d8b - * F*: 71d8221589d4d438af3706d89cb653cf53e18aab - * Libcrux: 68dfed5a4a9e40277f62828471c029afed1ecdcc - */ - -#ifndef libcrux_ct_ops_H -#define libcrux_ct_ops_H - - -#if defined(__cplusplus) -extern "C" { -#endif - - -/** - Return 1 if `value` is not zero and 0 otherwise. -*/ -static KRML_NOINLINE uint8_t -libcrux_ml_kem_constant_time_ops_inz(uint8_t value) { - uint16_t value0 = (uint16_t)value; - uint8_t result = - (uint8_t)((uint32_t)core_num__u16__wrapping_add(~value0, 1U) >> 8U); - return (uint32_t)result & 1U; -} - -static KRML_NOINLINE uint8_t -libcrux_ml_kem_constant_time_ops_is_non_zero(uint8_t value) { - return libcrux_ml_kem_constant_time_ops_inz(value); -} - -/** - Return 1 if the bytes of `lhs` and `rhs` do not exactly - match and 0 otherwise. -*/ -static KRML_NOINLINE uint8_t libcrux_ml_kem_constant_time_ops_compare( - Eurydice_slice lhs, Eurydice_slice rhs) { - uint8_t r = 0U; - for (size_t i = (size_t)0U; i < Eurydice_slice_len(lhs, uint8_t); i++) { - size_t i0 = i; - uint8_t nr = (uint32_t)r | - ((uint32_t)Eurydice_slice_index(lhs, i0, uint8_t, uint8_t *) ^ - (uint32_t)Eurydice_slice_index(rhs, i0, uint8_t, uint8_t *)); - r = nr; - } - return libcrux_ml_kem_constant_time_ops_is_non_zero(r); -} - -static KRML_NOINLINE uint8_t -libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time( - Eurydice_slice lhs, Eurydice_slice rhs) { - return libcrux_ml_kem_constant_time_ops_compare(lhs, rhs); -} - -/** - If `selector` is not zero, return the bytes in `rhs`; return the bytes in - `lhs` otherwise. -*/ -static KRML_NOINLINE void libcrux_ml_kem_constant_time_ops_select_ct( - Eurydice_slice lhs, Eurydice_slice rhs, uint8_t selector, - uint8_t ret[32U]) { - uint8_t mask = core_num__u8__wrapping_sub( - libcrux_ml_kem_constant_time_ops_is_non_zero(selector), 1U); - uint8_t out[32U] = {0U}; - for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE; - i++) { - size_t i0 = i; - uint8_t outi = - ((uint32_t)Eurydice_slice_index(lhs, i0, uint8_t, uint8_t *) & - (uint32_t)mask) | - ((uint32_t)Eurydice_slice_index(rhs, i0, uint8_t, uint8_t *) & - (uint32_t)~mask); - out[i0] = outi; - } - memcpy(ret, out, (size_t)32U * sizeof(uint8_t)); -} - -static KRML_NOINLINE void -libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time( - Eurydice_slice lhs, Eurydice_slice rhs, uint8_t selector, - uint8_t ret[32U]) { - libcrux_ml_kem_constant_time_ops_select_ct(lhs, rhs, selector, ret); -} - -static KRML_NOINLINE void -libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time( - Eurydice_slice lhs_c, Eurydice_slice rhs_c, Eurydice_slice lhs_s, - Eurydice_slice rhs_s, uint8_t ret[32U]) { - uint8_t selector = - libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time( - lhs_c, rhs_c); - uint8_t ret0[32U]; - libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time( - lhs_s, rhs_s, selector, ret0); - memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t)); -} - -#if defined(__cplusplus) -} -#endif - -#define libcrux_ct_ops_H_DEFINED -#endif /* libcrux_ct_ops_H */ - -/* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/libcrux_sha3_portable.h */ -/* - * SPDX-FileCopyrightText: 2025 Cryspen Sarl - * - * SPDX-License-Identifier: MIT or Apache-2.0 - * - * This code was generated with the following revisions: - * Charon: 667d2fc98984ff7f3df989c2367e6c1fa4a000e7 - * Eurydice: 2381cbc416ef2ad0b561c362c500bc84f36b6785 - * Karamel: 80f5435f2fc505973c469a4afcc8d875cddd0d8b - * F*: 71d8221589d4d438af3706d89cb653cf53e18aab - * Libcrux: 68dfed5a4a9e40277f62828471c029afed1ecdcc - */ - -#ifndef libcrux_sha3_portable_H -#define libcrux_sha3_portable_H - - -#if defined(__cplusplus) -extern "C" { -#endif - - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_zero_d2(void) { - return 0ULL; -} - -static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable__veor5q_u64( - uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e) { - return (((a ^ b) ^ c) ^ d) ^ e; -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_xor5_d2( - uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e) { - return libcrux_sha3_simd_portable__veor5q_u64(a, b, c, d, e); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 1 -- RIGHT= 63 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_76(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)1); -} - -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vrax1q_u64(uint64_t a, uint64_t b) { - uint64_t uu____0 = a; - return uu____0 ^ libcrux_sha3_simd_portable_rotate_left_76(b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vrax1q_u64(a, b); -} - -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vbcaxq_u64(uint64_t a, uint64_t b, uint64_t c) { - return a ^ (b & ~c); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_and_not_xor_d2(uint64_t a, uint64_t b, uint64_t c) { - return libcrux_sha3_simd_portable__vbcaxq_u64(a, b, c); -} - -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__veorq_n_u64(uint64_t a, uint64_t c) { - return a ^ c; -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_constant_d2(uint64_t a, uint64_t c) { - return libcrux_sha3_simd_portable__veorq_n_u64(a, c); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_xor_d2(uint64_t a, - uint64_t b) { - return a ^ b; -} - -static const uint64_t - libcrux_sha3_generic_keccak_constants_ROUNDCONSTANTS[24U] = { - 1ULL, - 32898ULL, - 9223372036854808714ULL, - 9223372039002292224ULL, - 32907ULL, - 2147483649ULL, - 9223372039002292353ULL, - 9223372036854808585ULL, - 138ULL, - 136ULL, - 2147516425ULL, - 2147483658ULL, - 2147516555ULL, - 9223372036854775947ULL, - 9223372036854808713ULL, - 9223372036854808579ULL, - 9223372036854808578ULL, - 9223372036854775936ULL, - 32778ULL, - 9223372039002259466ULL, - 9223372039002292353ULL, - 9223372036854808704ULL, - 2147483649ULL, - 9223372039002292232ULL}; - -typedef struct size_t_x2_s { - size_t fst; - size_t snd; -} size_t_x2; - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.KeccakState -with types uint64_t -with const generics -- $1size_t -*/ -typedef struct libcrux_sha3_generic_keccak_KeccakState_17_s { - uint64_t st[25U]; -} libcrux_sha3_generic_keccak_KeccakState_17; - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.new_80 -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_17 -libcrux_sha3_generic_keccak_new_80_04(void) { - libcrux_sha3_generic_keccak_KeccakState_17 lit; - uint64_t repeat_expression[25U]; - for (size_t i = (size_t)0U; i < (size_t)25U; i++) { - repeat_expression[i] = libcrux_sha3_simd_portable_zero_d2(); - } - memcpy(lit.st, repeat_expression, (size_t)25U * sizeof(uint64_t)); - return lit; -} - -/** -A monomorphic instance of libcrux_sha3.traits.get_ij -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE uint64_t *libcrux_sha3_traits_get_ij_04(uint64_t *arr, - size_t i, - size_t j) { - return &arr[(size_t)5U * j + i]; -} - -/** -A monomorphic instance of libcrux_sha3.traits.set_ij -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE void libcrux_sha3_traits_set_ij_04(uint64_t *arr, - size_t i, size_t j, - uint64_t value) { - arr[(size_t)5U * j + i] = value; -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block -with const generics -- RATE= 72 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_f8( - uint64_t *state, Eurydice_slice blocks, size_t start) { - uint64_t state_flat[25U] = {0U}; - for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) { - size_t i0 = i; - size_t offset = start + (size_t)8U * i0; - uint8_t uu____0[8U]; - Result_15 dst; - Eurydice_slice_to_array2( - &dst, - Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U, - uint8_t *), - Eurydice_slice, uint8_t[8U], TryFromSliceError); - unwrap_26_68(dst, uu____0); - state_flat[i0] = core_num__u64__from_le_bytes(uu____0); - } - for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) { - size_t i0 = i; - libcrux_sha3_traits_set_ij_04( - state, i0 / (size_t)5U, i0 % (size_t)5U, - libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U, - i0 % (size_t)5U)[0U] ^ - state_flat[i0]); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 -with const generics -- RATE= 72 -*/ -static inline void libcrux_sha3_simd_portable_load_block_a1_f8( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start) { - libcrux_sha3_simd_portable_load_block_f8(self->st, input[0U], start); -} - -/** -This function found in impl {core::ops::index::Index<(usize, usize), T> for -libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.index_c2 -with types uint64_t -with const generics -- N= 1 -*/ -static inline uint64_t *libcrux_sha3_generic_keccak_index_c2_04( - libcrux_sha3_generic_keccak_KeccakState_17 *self, size_t_x2 index) { - return libcrux_sha3_traits_get_ij_04(self->st, index.fst, index.snd); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.theta_80 -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_theta_80_04( - libcrux_sha3_generic_keccak_KeccakState_17 *self, uint64_t ret[5U]) { - uint64_t c[5U] = { - libcrux_sha3_simd_portable_xor5_d2( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)0U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)0U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)0U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)0U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)0U}))[0U]), - libcrux_sha3_simd_portable_xor5_d2( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)1U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)1U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)1U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)1U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)1U}))[0U]), - libcrux_sha3_simd_portable_xor5_d2( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)2U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)2U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)2U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)2U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)2U}))[0U]), - libcrux_sha3_simd_portable_xor5_d2( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)3U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)3U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)3U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)3U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)3U}))[0U]), - libcrux_sha3_simd_portable_xor5_d2( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)4U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)4U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)4U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)4U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)4U}))[0U])}; - uint64_t uu____0 = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2( - c[((size_t)0U + (size_t)4U) % (size_t)5U], - c[((size_t)0U + (size_t)1U) % (size_t)5U]); - uint64_t uu____1 = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2( - c[((size_t)1U + (size_t)4U) % (size_t)5U], - c[((size_t)1U + (size_t)1U) % (size_t)5U]); - uint64_t uu____2 = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2( - c[((size_t)2U + (size_t)4U) % (size_t)5U], - c[((size_t)2U + (size_t)1U) % (size_t)5U]); - uint64_t uu____3 = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2( - c[((size_t)3U + (size_t)4U) % (size_t)5U], - c[((size_t)3U + (size_t)1U) % (size_t)5U]); - ret[0U] = uu____0; - ret[1U] = uu____1; - ret[2U] = uu____2; - ret[3U] = uu____3; - ret[4U] = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2( - c[((size_t)4U + (size_t)4U) % (size_t)5U], - c[((size_t)4U + (size_t)1U) % (size_t)5U]); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.set_80 -with types uint64_t -with const generics -- N= 1 -*/ -static inline void libcrux_sha3_generic_keccak_set_80_04( - libcrux_sha3_generic_keccak_KeccakState_17 *self, size_t i, size_t j, - uint64_t v) { - libcrux_sha3_traits_set_ij_04(self->st, i, j, v); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 36 -- RIGHT= 28 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_02(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)36); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 36 -- RIGHT= 28 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_02(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_02(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 36 -- RIGHT= 28 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_02(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_02(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 3 -- RIGHT= 61 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_ac(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)3); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 3 -- RIGHT= 61 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_ac(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_ac(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 3 -- RIGHT= 61 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_ac(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_ac(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 41 -- RIGHT= 23 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_020(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)41); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 41 -- RIGHT= 23 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_020(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_020(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 41 -- RIGHT= 23 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_020(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_020(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 18 -- RIGHT= 46 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_a9(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)18); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 18 -- RIGHT= 46 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_a9(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_a9(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 18 -- RIGHT= 46 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_a9(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_a9(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 1 -- RIGHT= 63 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_76(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_76(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 1 -- RIGHT= 63 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_76(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_76(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 44 -- RIGHT= 20 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_58(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)44); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 44 -- RIGHT= 20 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_58(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_58(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 44 -- RIGHT= 20 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_58(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_58(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 10 -- RIGHT= 54 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_e0(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)10); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 10 -- RIGHT= 54 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_e0(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_e0(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 10 -- RIGHT= 54 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_e0(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_e0(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 45 -- RIGHT= 19 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_63(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)45); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 45 -- RIGHT= 19 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_63(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_63(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 45 -- RIGHT= 19 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_63(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_63(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 2 -- RIGHT= 62 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_6a(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)2); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 2 -- RIGHT= 62 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_6a(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_6a(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 2 -- RIGHT= 62 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_6a(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_6a(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 62 -- RIGHT= 2 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_ab(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)62); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 62 -- RIGHT= 2 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_ab(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_ab(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 62 -- RIGHT= 2 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_ab(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_ab(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 6 -- RIGHT= 58 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_5b(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)6); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 6 -- RIGHT= 58 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_5b(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_5b(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 6 -- RIGHT= 58 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_5b(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_5b(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 43 -- RIGHT= 21 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_6f(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)43); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 43 -- RIGHT= 21 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_6f(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_6f(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 43 -- RIGHT= 21 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_6f(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_6f(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 15 -- RIGHT= 49 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_62(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)15); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 15 -- RIGHT= 49 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_62(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_62(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 15 -- RIGHT= 49 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_62(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_62(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 61 -- RIGHT= 3 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_23(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)61); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 61 -- RIGHT= 3 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_23(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_23(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 61 -- RIGHT= 3 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_23(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_23(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 28 -- RIGHT= 36 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_37(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)28); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 28 -- RIGHT= 36 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_37(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_37(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 28 -- RIGHT= 36 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_37(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_37(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 55 -- RIGHT= 9 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_bb(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)55); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 55 -- RIGHT= 9 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_bb(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_bb(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 55 -- RIGHT= 9 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_bb(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_bb(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 25 -- RIGHT= 39 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_b9(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)25); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 25 -- RIGHT= 39 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_b9(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_b9(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 25 -- RIGHT= 39 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_b9(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_b9(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 21 -- RIGHT= 43 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_54(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)21); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 21 -- RIGHT= 43 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_54(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_54(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 21 -- RIGHT= 43 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_54(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_54(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 56 -- RIGHT= 8 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_4c(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)56); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 56 -- RIGHT= 8 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_4c(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_4c(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 56 -- RIGHT= 8 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_4c(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_4c(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 27 -- RIGHT= 37 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_ce(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)27); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 27 -- RIGHT= 37 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_ce(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_ce(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 27 -- RIGHT= 37 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_ce(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_ce(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 20 -- RIGHT= 44 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_77(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)20); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 20 -- RIGHT= 44 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_77(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_77(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 20 -- RIGHT= 44 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_77(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_77(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 39 -- RIGHT= 25 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_25(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)39); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 39 -- RIGHT= 25 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_25(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_25(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 39 -- RIGHT= 25 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_25(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_25(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 8 -- RIGHT= 56 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_af(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)8); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 8 -- RIGHT= 56 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_af(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_af(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 8 -- RIGHT= 56 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_af(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_af(a, b); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.rotate_left -with const generics -- LEFT= 14 -- RIGHT= 50 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_rotate_left_fd(uint64_t x) { - return core_num__u64__rotate_left(x, (uint32_t)(int32_t)14); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64 -with const generics -- LEFT= 14 -- RIGHT= 50 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable__vxarq_u64_fd(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable_rotate_left_fd(a ^ b); -} - -/** -This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2 -with const generics -- LEFT= 14 -- RIGHT= 50 -*/ -static KRML_MUSTINLINE uint64_t -libcrux_sha3_simd_portable_xor_and_rotate_d2_fd(uint64_t a, uint64_t b) { - return libcrux_sha3_simd_portable__vxarq_u64_fd(a, b); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.rho_80 -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_rho_80_04( - libcrux_sha3_generic_keccak_KeccakState_17 *self, uint64_t t[5U]) { - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)0U, (size_t)0U, - libcrux_sha3_simd_portable_xor_d2( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)0U}))[0U], - t[0U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____0 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____0, (size_t)1U, (size_t)0U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_02( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)0U}))[0U], - t[0U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____1 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____1, (size_t)2U, (size_t)0U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_ac( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)0U}))[0U], - t[0U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____2 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____2, (size_t)3U, (size_t)0U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_020( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)0U}))[0U], - t[0U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____3 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____3, (size_t)4U, (size_t)0U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_a9( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)0U}))[0U], - t[0U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____4 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____4, (size_t)0U, (size_t)1U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_76( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)1U}))[0U], - t[1U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____5 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____5, (size_t)1U, (size_t)1U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_58( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)1U}))[0U], - t[1U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____6 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____6, (size_t)2U, (size_t)1U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_e0( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)1U}))[0U], - t[1U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____7 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____7, (size_t)3U, (size_t)1U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_63( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)1U}))[0U], - t[1U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____8 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____8, (size_t)4U, (size_t)1U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_6a( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)1U}))[0U], - t[1U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____9 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____9, (size_t)0U, (size_t)2U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_ab( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)2U}))[0U], - t[2U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____10 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____10, (size_t)1U, (size_t)2U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_5b( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)2U}))[0U], - t[2U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____11 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____11, (size_t)2U, (size_t)2U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_6f( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)2U}))[0U], - t[2U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____12 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____12, (size_t)3U, (size_t)2U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_62( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)2U}))[0U], - t[2U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____13 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____13, (size_t)4U, (size_t)2U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_23( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)2U}))[0U], - t[2U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____14 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____14, (size_t)0U, (size_t)3U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_37( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)3U}))[0U], - t[3U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____15 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____15, (size_t)1U, (size_t)3U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_bb( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)3U}))[0U], - t[3U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____16 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____16, (size_t)2U, (size_t)3U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_b9( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)3U}))[0U], - t[3U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____17 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____17, (size_t)3U, (size_t)3U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_54( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)3U}))[0U], - t[3U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____18 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____18, (size_t)4U, (size_t)3U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_4c( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)3U}))[0U], - t[3U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____19 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____19, (size_t)0U, (size_t)4U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_ce( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)4U}))[0U], - t[4U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____20 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____20, (size_t)1U, (size_t)4U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_77( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)4U}))[0U], - t[4U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____21 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____21, (size_t)2U, (size_t)4U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_25( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)4U}))[0U], - t[4U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____22 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____22, (size_t)3U, (size_t)4U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_af( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)4U}))[0U], - t[4U])); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____23 = self; - libcrux_sha3_generic_keccak_set_80_04( - uu____23, (size_t)4U, (size_t)4U, - libcrux_sha3_simd_portable_xor_and_rotate_d2_fd( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)4U}))[0U], - t[4U])); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.pi_80 -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_pi_80_04( - libcrux_sha3_generic_keccak_KeccakState_17 *self) { - libcrux_sha3_generic_keccak_KeccakState_17 old = self[0U]; - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)1U, (size_t)0U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)3U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)2U, (size_t)0U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)1U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)3U, (size_t)0U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)4U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)4U, (size_t)0U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)2U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)0U, (size_t)1U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)1U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)1U, (size_t)1U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)4U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)2U, (size_t)1U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)2U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)3U, (size_t)1U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)0U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)4U, (size_t)1U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U, - .snd = (size_t)3U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)0U, (size_t)2U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)2U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)1U, (size_t)2U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)0U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)2U, (size_t)2U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)3U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)3U, (size_t)2U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)1U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)4U, (size_t)2U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U, - .snd = (size_t)4U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)0U, (size_t)3U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)3U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)1U, (size_t)3U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)1U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)2U, (size_t)3U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)4U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)3U, (size_t)3U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)2U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)4U, (size_t)3U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U, - .snd = (size_t)0U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)0U, (size_t)4U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)4U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)1U, (size_t)4U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)2U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)2U, (size_t)4U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)0U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)3U, (size_t)4U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)3U}))[0U]); - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)4U, (size_t)4U, - libcrux_sha3_generic_keccak_index_c2_04( - &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U, - .snd = (size_t)1U}))[0U]); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.chi_80 -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_chi_80_04( - libcrux_sha3_generic_keccak_KeccakState_17 *self) { - libcrux_sha3_generic_keccak_KeccakState_17 old = self[0U]; - for (size_t i0 = (size_t)0U; i0 < (size_t)5U; i0++) { - size_t i1 = i0; - for (size_t i = (size_t)0U; i < (size_t)5U; i++) { - size_t j = i; - libcrux_sha3_generic_keccak_set_80_04( - self, i1, j, - libcrux_sha3_simd_portable_and_not_xor_d2( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = i1, .snd = j}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - &old, - (KRML_CLITERAL(size_t_x2){ - .fst = i1, .snd = (j + (size_t)2U) % (size_t)5U}))[0U], - libcrux_sha3_generic_keccak_index_c2_04( - &old, - (KRML_CLITERAL(size_t_x2){ - .fst = i1, .snd = (j + (size_t)1U) % (size_t)5U}))[0U])); - } - } -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.iota_80 -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_iota_80_04( - libcrux_sha3_generic_keccak_KeccakState_17 *self, size_t i) { - libcrux_sha3_generic_keccak_set_80_04( - self, (size_t)0U, (size_t)0U, - libcrux_sha3_simd_portable_xor_constant_d2( - libcrux_sha3_generic_keccak_index_c2_04( - self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U, - .snd = (size_t)0U}))[0U], - libcrux_sha3_generic_keccak_constants_ROUNDCONSTANTS[i])); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.keccakf1600_80 -with types uint64_t -with const generics -- N= 1 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccakf1600_80_04( - libcrux_sha3_generic_keccak_KeccakState_17 *self) { - for (size_t i = (size_t)0U; i < (size_t)24U; i++) { - size_t i0 = i; - uint64_t t[5U]; - libcrux_sha3_generic_keccak_theta_80_04(self, t); - libcrux_sha3_generic_keccak_KeccakState_17 *uu____0 = self; - uint64_t uu____1[5U]; - memcpy(uu____1, t, (size_t)5U * sizeof(uint64_t)); - libcrux_sha3_generic_keccak_rho_80_04(uu____0, uu____1); - libcrux_sha3_generic_keccak_pi_80_04(self); - libcrux_sha3_generic_keccak_chi_80_04(self); - libcrux_sha3_generic_keccak_iota_80_04(self, i0); - } -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 72 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c6( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks, - size_t start) { - libcrux_sha3_simd_portable_load_block_a1_f8(self, blocks, start); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last -with const generics -- RATE= 72 -- DELIMITER= 6 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_96( - uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) { - uint8_t buffer[72U] = {0U}; - Eurydice_slice_copy( - Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *), - Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t); - buffer[len] = 6U; - size_t uu____0 = (size_t)72U - (size_t)1U; - buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U; - libcrux_sha3_simd_portable_load_block_f8( - state, Eurydice_array_to_slice((size_t)72U, buffer, uint8_t), (size_t)0U); -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 -with const generics -- RATE= 72 -- DELIMITER= 6 -*/ -static inline void libcrux_sha3_simd_portable_load_last_a1_96( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_96(self->st, input[0U], start, len); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 72 -- DELIM= 6 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_a1_96(self, last, start, len); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.store_block -with const generics -- RATE= 72 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_f8( - uint64_t *s, Eurydice_slice out, size_t start, size_t len) { - size_t octets = len / (size_t)8U; - for (size_t i = (size_t)0U; i < octets; i++) { - size_t i0 = i; - Eurydice_slice uu____0 = Eurydice_slice_subslice3( - out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U, - uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); - } - size_t remaining = len % (size_t)8U; - if (remaining > (size_t)0U) { - Eurydice_slice uu____1 = Eurydice_slice_subslice3( - out, start + len - remaining, start + len, uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U, - octets % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____1, - Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *), - uint8_t); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Squeeze1 for -libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13 -with const generics -- RATE= 72 -*/ -static inline void libcrux_sha3_simd_portable_squeeze_13_f8( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out, - size_t start, size_t len) { - libcrux_sha3_simd_portable_store_block_f8(self->st, out, start, len); -} - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 -with const generics -- RATE= 72 -- DELIM= 6 -*/ -static inline void libcrux_sha3_generic_keccak_portable_keccak1_96( - Eurydice_slice data, Eurydice_slice out) { - libcrux_sha3_generic_keccak_KeccakState_17 s = - libcrux_sha3_generic_keccak_new_80_04(); - size_t data_len = Eurydice_slice_len(data, uint8_t); - for (size_t i = (size_t)0U; i < data_len / (size_t)72U; i++) { - size_t i0 = i; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_block_80_c6(&s, buf, i0 * (size_t)72U); - } - size_t rem = data_len % (size_t)72U; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_final_80_9e(&s, buf, data_len - rem, rem); - size_t outlen = Eurydice_slice_len(out, uint8_t); - size_t blocks = outlen / (size_t)72U; - size_t last = outlen - outlen % (size_t)72U; - if (blocks == (size_t)0U) { - libcrux_sha3_simd_portable_squeeze_13_f8(&s, out, (size_t)0U, outlen); - } else { - libcrux_sha3_simd_portable_squeeze_13_f8(&s, out, (size_t)0U, (size_t)72U); - for (size_t i = (size_t)1U; i < blocks; i++) { - size_t i0 = i; - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_f8(&s, out, i0 * (size_t)72U, - (size_t)72U); - } - if (last < outlen) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_f8(&s, out, last, outlen - last); - } - } -} - -/** - A portable SHA3 512 implementation. -*/ -static KRML_MUSTINLINE void libcrux_sha3_portable_sha512(Eurydice_slice digest, - Eurydice_slice data) { - libcrux_sha3_generic_keccak_portable_keccak1_96(data, digest); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block -with const generics -- RATE= 136 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_5b( - uint64_t *state, Eurydice_slice blocks, size_t start) { - uint64_t state_flat[25U] = {0U}; - for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) { - size_t i0 = i; - size_t offset = start + (size_t)8U * i0; - uint8_t uu____0[8U]; - Result_15 dst; - Eurydice_slice_to_array2( - &dst, - Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U, - uint8_t *), - Eurydice_slice, uint8_t[8U], TryFromSliceError); - unwrap_26_68(dst, uu____0); - state_flat[i0] = core_num__u64__from_le_bytes(uu____0); - } - for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) { - size_t i0 = i; - libcrux_sha3_traits_set_ij_04( - state, i0 / (size_t)5U, i0 % (size_t)5U, - libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U, - i0 % (size_t)5U)[0U] ^ - state_flat[i0]); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 -with const generics -- RATE= 136 -*/ -static inline void libcrux_sha3_simd_portable_load_block_a1_5b( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start) { - libcrux_sha3_simd_portable_load_block_5b(self->st, input[0U], start); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 136 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c60( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks, - size_t start) { - libcrux_sha3_simd_portable_load_block_a1_5b(self, blocks, start); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last -with const generics -- RATE= 136 -- DELIMITER= 6 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_ad( - uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) { - uint8_t buffer[136U] = {0U}; - Eurydice_slice_copy( - Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *), - Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t); - buffer[len] = 6U; - size_t uu____0 = (size_t)136U - (size_t)1U; - buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U; - libcrux_sha3_simd_portable_load_block_5b( - state, Eurydice_array_to_slice((size_t)136U, buffer, uint8_t), - (size_t)0U); -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 -with const generics -- RATE= 136 -- DELIMITER= 6 -*/ -static inline void libcrux_sha3_simd_portable_load_last_a1_ad( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_ad(self->st, input[0U], start, len); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 136 -- DELIM= 6 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e0( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_a1_ad(self, last, start, len); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.store_block -with const generics -- RATE= 136 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_5b( - uint64_t *s, Eurydice_slice out, size_t start, size_t len) { - size_t octets = len / (size_t)8U; - for (size_t i = (size_t)0U; i < octets; i++) { - size_t i0 = i; - Eurydice_slice uu____0 = Eurydice_slice_subslice3( - out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U, - uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); - } - size_t remaining = len % (size_t)8U; - if (remaining > (size_t)0U) { - Eurydice_slice uu____1 = Eurydice_slice_subslice3( - out, start + len - remaining, start + len, uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U, - octets % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____1, - Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *), - uint8_t); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Squeeze1 for -libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13 -with const generics -- RATE= 136 -*/ -static inline void libcrux_sha3_simd_portable_squeeze_13_5b( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out, - size_t start, size_t len) { - libcrux_sha3_simd_portable_store_block_5b(self->st, out, start, len); -} - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 -with const generics -- RATE= 136 -- DELIM= 6 -*/ -static inline void libcrux_sha3_generic_keccak_portable_keccak1_ad( - Eurydice_slice data, Eurydice_slice out) { - libcrux_sha3_generic_keccak_KeccakState_17 s = - libcrux_sha3_generic_keccak_new_80_04(); - size_t data_len = Eurydice_slice_len(data, uint8_t); - for (size_t i = (size_t)0U; i < data_len / (size_t)136U; i++) { - size_t i0 = i; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_block_80_c60(&s, buf, i0 * (size_t)136U); - } - size_t rem = data_len % (size_t)136U; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_final_80_9e0(&s, buf, data_len - rem, rem); - size_t outlen = Eurydice_slice_len(out, uint8_t); - size_t blocks = outlen / (size_t)136U; - size_t last = outlen - outlen % (size_t)136U; - if (blocks == (size_t)0U) { - libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, (size_t)0U, outlen); - } else { - libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, (size_t)0U, (size_t)136U); - for (size_t i = (size_t)1U; i < blocks; i++) { - size_t i0 = i; - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, i0 * (size_t)136U, - (size_t)136U); - } - if (last < outlen) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, last, outlen - last); - } - } -} - -/** - A portable SHA3 256 implementation. -*/ -static KRML_MUSTINLINE void libcrux_sha3_portable_sha256(Eurydice_slice digest, - Eurydice_slice data) { - libcrux_sha3_generic_keccak_portable_keccak1_ad(data, digest); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last -with const generics -- RATE= 136 -- DELIMITER= 31 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_ad0( - uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) { - uint8_t buffer[136U] = {0U}; - Eurydice_slice_copy( - Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *), - Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t); - buffer[len] = 31U; - size_t uu____0 = (size_t)136U - (size_t)1U; - buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U; - libcrux_sha3_simd_portable_load_block_5b( - state, Eurydice_array_to_slice((size_t)136U, buffer, uint8_t), - (size_t)0U); -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 -with const generics -- RATE= 136 -- DELIMITER= 31 -*/ -static inline void libcrux_sha3_simd_portable_load_last_a1_ad0( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_ad0(self->st, input[0U], start, len); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 136 -- DELIM= 31 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e1( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_a1_ad0(self, last, start, len); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 -with const generics -- RATE= 136 -- DELIM= 31 -*/ -static inline void libcrux_sha3_generic_keccak_portable_keccak1_ad0( - Eurydice_slice data, Eurydice_slice out) { - libcrux_sha3_generic_keccak_KeccakState_17 s = - libcrux_sha3_generic_keccak_new_80_04(); - size_t data_len = Eurydice_slice_len(data, uint8_t); - for (size_t i = (size_t)0U; i < data_len / (size_t)136U; i++) { - size_t i0 = i; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_block_80_c60(&s, buf, i0 * (size_t)136U); - } - size_t rem = data_len % (size_t)136U; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_final_80_9e1(&s, buf, data_len - rem, rem); - size_t outlen = Eurydice_slice_len(out, uint8_t); - size_t blocks = outlen / (size_t)136U; - size_t last = outlen - outlen % (size_t)136U; - if (blocks == (size_t)0U) { - libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, (size_t)0U, outlen); - } else { - libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, (size_t)0U, (size_t)136U); - for (size_t i = (size_t)1U; i < blocks; i++) { - size_t i0 = i; - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, i0 * (size_t)136U, - (size_t)136U); - } - if (last < outlen) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, last, outlen - last); - } - } -} - -/** - A portable SHAKE256 implementation. -*/ -static KRML_MUSTINLINE void libcrux_sha3_portable_shake256( - Eurydice_slice digest, Eurydice_slice data) { - libcrux_sha3_generic_keccak_portable_keccak1_ad0(data, digest); -} - -typedef libcrux_sha3_generic_keccak_KeccakState_17 - libcrux_sha3_portable_KeccakState; - -/** - Create a new SHAKE-128 state object. -*/ -static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_17 -libcrux_sha3_portable_incremental_shake128_init(void) { - return libcrux_sha3_generic_keccak_new_80_04(); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block -with const generics -- RATE= 168 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_3a( - uint64_t *state, Eurydice_slice blocks, size_t start) { - uint64_t state_flat[25U] = {0U}; - for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) { - size_t i0 = i; - size_t offset = start + (size_t)8U * i0; - uint8_t uu____0[8U]; - Result_15 dst; - Eurydice_slice_to_array2( - &dst, - Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U, - uint8_t *), - Eurydice_slice, uint8_t[8U], TryFromSliceError); - unwrap_26_68(dst, uu____0); - state_flat[i0] = core_num__u64__from_le_bytes(uu____0); - } - for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) { - size_t i0 = i; - libcrux_sha3_traits_set_ij_04( - state, i0 / (size_t)5U, i0 % (size_t)5U, - libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U, - i0 % (size_t)5U)[0U] ^ - state_flat[i0]); - } -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last -with const generics -- RATE= 168 -- DELIMITER= 31 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_c6( - uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) { - uint8_t buffer[168U] = {0U}; - Eurydice_slice_copy( - Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *), - Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t); - buffer[len] = 31U; - size_t uu____0 = (size_t)168U - (size_t)1U; - buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U; - libcrux_sha3_simd_portable_load_block_3a( - state, Eurydice_array_to_slice((size_t)168U, buffer, uint8_t), - (size_t)0U); -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 -with const generics -- RATE= 168 -- DELIMITER= 31 -*/ -static inline void libcrux_sha3_simd_portable_load_last_a1_c6( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_c6(self->st, input[0U], start, len); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 168 -- DELIM= 31 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e2( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_a1_c6(self, last, start, len); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** - Absorb -*/ -static KRML_MUSTINLINE void -libcrux_sha3_portable_incremental_shake128_absorb_final( - libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice data0) { - libcrux_sha3_generic_keccak_KeccakState_17 *uu____0 = s; - Eurydice_slice uu____1[1U] = {data0}; - libcrux_sha3_generic_keccak_absorb_final_80_9e2( - uu____0, uu____1, (size_t)0U, Eurydice_slice_len(data0, uint8_t)); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.store_block -with const generics -- RATE= 168 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_3a( - uint64_t *s, Eurydice_slice out, size_t start, size_t len) { - size_t octets = len / (size_t)8U; - for (size_t i = (size_t)0U; i < octets; i++) { - size_t i0 = i; - Eurydice_slice uu____0 = Eurydice_slice_subslice3( - out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U, - uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); - } - size_t remaining = len % (size_t)8U; - if (remaining > (size_t)0U) { - Eurydice_slice uu____1 = Eurydice_slice_subslice3( - out, start + len - remaining, start + len, uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U, - octets % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____1, - Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *), - uint8_t); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Squeeze1 for -libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13 -with const generics -- RATE= 168 -*/ -static inline void libcrux_sha3_simd_portable_squeeze_13_3a( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out, - size_t start, size_t len) { - libcrux_sha3_simd_portable_store_block_3a(self->st, out, start, len); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of -libcrux_sha3.generic_keccak.portable.squeeze_first_three_blocks_b4 with const -generics -- RATE= 168 -*/ -static KRML_MUSTINLINE void -libcrux_sha3_generic_keccak_portable_squeeze_first_three_blocks_b4_3a( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out) { - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)0U, (size_t)168U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)168U, - (size_t)168U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)2U * (size_t)168U, - (size_t)168U); -} - -/** - Squeeze three blocks -*/ -static KRML_MUSTINLINE void -libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks( - libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out0) { - libcrux_sha3_generic_keccak_portable_squeeze_first_three_blocks_b4_3a(s, - out0); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of -libcrux_sha3.generic_keccak.portable.squeeze_next_block_b4 with const generics -- RATE= 168 -*/ -static KRML_MUSTINLINE void -libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_3a( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out, - size_t start) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, start, (size_t)168U); -} - -/** - Squeeze another block -*/ -static KRML_MUSTINLINE void -libcrux_sha3_portable_incremental_shake128_squeeze_next_block( - libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out0) { - libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_3a(s, out0, - (size_t)0U); -} - -#define libcrux_sha3_Algorithm_Sha224 1 -#define libcrux_sha3_Algorithm_Sha256 2 -#define libcrux_sha3_Algorithm_Sha384 3 -#define libcrux_sha3_Algorithm_Sha512 4 - -typedef uint8_t libcrux_sha3_Algorithm; - -typedef uint8_t libcrux_sha3_Sha3_224Digest[28U]; - -typedef uint8_t libcrux_sha3_Sha3_256Digest[32U]; - -typedef uint8_t libcrux_sha3_Sha3_384Digest[48U]; - -typedef uint8_t libcrux_sha3_Sha3_512Digest[64U]; - -/** - Returns the output size of a digest. -*/ -static inline size_t libcrux_sha3_digest_size(libcrux_sha3_Algorithm mode) { - switch (mode) { - case libcrux_sha3_Algorithm_Sha224: { - break; - } - case libcrux_sha3_Algorithm_Sha256: { - return (size_t)32U; - } - case libcrux_sha3_Algorithm_Sha384: { - return (size_t)48U; - } - case libcrux_sha3_Algorithm_Sha512: { - return (size_t)64U; - } - default: { - KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, - __LINE__); - KRML_HOST_EXIT(253U); - } - } - return (size_t)28U; -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block -with const generics -- RATE= 144 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_2c( - uint64_t *state, Eurydice_slice blocks, size_t start) { - uint64_t state_flat[25U] = {0U}; - for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) { - size_t i0 = i; - size_t offset = start + (size_t)8U * i0; - uint8_t uu____0[8U]; - Result_15 dst; - Eurydice_slice_to_array2( - &dst, - Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U, - uint8_t *), - Eurydice_slice, uint8_t[8U], TryFromSliceError); - unwrap_26_68(dst, uu____0); - state_flat[i0] = core_num__u64__from_le_bytes(uu____0); - } - for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) { - size_t i0 = i; - libcrux_sha3_traits_set_ij_04( - state, i0 / (size_t)5U, i0 % (size_t)5U, - libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U, - i0 % (size_t)5U)[0U] ^ - state_flat[i0]); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 -with const generics -- RATE= 144 -*/ -static inline void libcrux_sha3_simd_portable_load_block_a1_2c( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start) { - libcrux_sha3_simd_portable_load_block_2c(self->st, input[0U], start); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 144 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c61( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks, - size_t start) { - libcrux_sha3_simd_portable_load_block_a1_2c(self, blocks, start); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last -with const generics -- RATE= 144 -- DELIMITER= 6 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_1e( - uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) { - uint8_t buffer[144U] = {0U}; - Eurydice_slice_copy( - Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *), - Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t); - buffer[len] = 6U; - size_t uu____0 = (size_t)144U - (size_t)1U; - buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U; - libcrux_sha3_simd_portable_load_block_2c( - state, Eurydice_array_to_slice((size_t)144U, buffer, uint8_t), - (size_t)0U); -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 -with const generics -- RATE= 144 -- DELIMITER= 6 -*/ -static inline void libcrux_sha3_simd_portable_load_last_a1_1e( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_1e(self->st, input[0U], start, len); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 144 -- DELIM= 6 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e3( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_a1_1e(self, last, start, len); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.store_block -with const generics -- RATE= 144 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_2c( - uint64_t *s, Eurydice_slice out, size_t start, size_t len) { - size_t octets = len / (size_t)8U; - for (size_t i = (size_t)0U; i < octets; i++) { - size_t i0 = i; - Eurydice_slice uu____0 = Eurydice_slice_subslice3( - out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U, - uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); - } - size_t remaining = len % (size_t)8U; - if (remaining > (size_t)0U) { - Eurydice_slice uu____1 = Eurydice_slice_subslice3( - out, start + len - remaining, start + len, uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U, - octets % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____1, - Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *), - uint8_t); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Squeeze1 for -libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13 -with const generics -- RATE= 144 -*/ -static inline void libcrux_sha3_simd_portable_squeeze_13_2c( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out, - size_t start, size_t len) { - libcrux_sha3_simd_portable_store_block_2c(self->st, out, start, len); -} - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 -with const generics -- RATE= 144 -- DELIM= 6 -*/ -static inline void libcrux_sha3_generic_keccak_portable_keccak1_1e( - Eurydice_slice data, Eurydice_slice out) { - libcrux_sha3_generic_keccak_KeccakState_17 s = - libcrux_sha3_generic_keccak_new_80_04(); - size_t data_len = Eurydice_slice_len(data, uint8_t); - for (size_t i = (size_t)0U; i < data_len / (size_t)144U; i++) { - size_t i0 = i; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_block_80_c61(&s, buf, i0 * (size_t)144U); - } - size_t rem = data_len % (size_t)144U; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_final_80_9e3(&s, buf, data_len - rem, rem); - size_t outlen = Eurydice_slice_len(out, uint8_t); - size_t blocks = outlen / (size_t)144U; - size_t last = outlen - outlen % (size_t)144U; - if (blocks == (size_t)0U) { - libcrux_sha3_simd_portable_squeeze_13_2c(&s, out, (size_t)0U, outlen); - } else { - libcrux_sha3_simd_portable_squeeze_13_2c(&s, out, (size_t)0U, (size_t)144U); - for (size_t i = (size_t)1U; i < blocks; i++) { - size_t i0 = i; - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_2c(&s, out, i0 * (size_t)144U, - (size_t)144U); - } - if (last < outlen) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_2c(&s, out, last, outlen - last); - } - } -} - -/** - A portable SHA3 224 implementation. -*/ -static KRML_MUSTINLINE void libcrux_sha3_portable_sha224(Eurydice_slice digest, - Eurydice_slice data) { - libcrux_sha3_generic_keccak_portable_keccak1_1e(data, digest); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block -with const generics -- RATE= 104 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_7a( - uint64_t *state, Eurydice_slice blocks, size_t start) { - uint64_t state_flat[25U] = {0U}; - for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) { - size_t i0 = i; - size_t offset = start + (size_t)8U * i0; - uint8_t uu____0[8U]; - Result_15 dst; - Eurydice_slice_to_array2( - &dst, - Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U, - uint8_t *), - Eurydice_slice, uint8_t[8U], TryFromSliceError); - unwrap_26_68(dst, uu____0); - state_flat[i0] = core_num__u64__from_le_bytes(uu____0); - } - for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) { - size_t i0 = i; - libcrux_sha3_traits_set_ij_04( - state, i0 / (size_t)5U, i0 % (size_t)5U, - libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U, - i0 % (size_t)5U)[0U] ^ - state_flat[i0]); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 -with const generics -- RATE= 104 -*/ -static inline void libcrux_sha3_simd_portable_load_block_a1_7a( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start) { - libcrux_sha3_simd_portable_load_block_7a(self->st, input[0U], start); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 104 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c62( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks, - size_t start) { - libcrux_sha3_simd_portable_load_block_a1_7a(self, blocks, start); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last -with const generics -- RATE= 104 -- DELIMITER= 6 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_7c( - uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) { - uint8_t buffer[104U] = {0U}; - Eurydice_slice_copy( - Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *), - Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t); - buffer[len] = 6U; - size_t uu____0 = (size_t)104U - (size_t)1U; - buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U; - libcrux_sha3_simd_portable_load_block_7a( - state, Eurydice_array_to_slice((size_t)104U, buffer, uint8_t), - (size_t)0U); -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1 -with const generics -- RATE= 104 -- DELIMITER= 6 -*/ -static inline void libcrux_sha3_simd_portable_load_last_a1_7c( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_7c(self->st, input[0U], start, len); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 104 -- DELIM= 6 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e4( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last, - size_t start, size_t len) { - libcrux_sha3_simd_portable_load_last_a1_7c(self, last, start, len); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.simd.portable.store_block -with const generics -- RATE= 104 -*/ -static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_7a( - uint64_t *s, Eurydice_slice out, size_t start, size_t len) { - size_t octets = len / (size_t)8U; - for (size_t i = (size_t)0U; i < octets; i++) { - size_t i0 = i; - Eurydice_slice uu____0 = Eurydice_slice_subslice3( - out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U, - uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); - } - size_t remaining = len % (size_t)8U; - if (remaining > (size_t)0U) { - Eurydice_slice uu____1 = Eurydice_slice_subslice3( - out, start + len - remaining, start + len, uint8_t *); - uint8_t ret[8U]; - core_num__u64__to_le_bytes( - libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U, - octets % (size_t)5U)[0U], - ret); - Eurydice_slice_copy( - uu____1, - Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *), - uint8_t); - } -} - -/** -This function found in impl {libcrux_sha3::traits::Squeeze1 for -libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13 -with const generics -- RATE= 104 -*/ -static inline void libcrux_sha3_simd_portable_squeeze_13_7a( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out, - size_t start, size_t len) { - libcrux_sha3_simd_portable_store_block_7a(self->st, out, start, len); -} - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 -with const generics -- RATE= 104 -- DELIM= 6 -*/ -static inline void libcrux_sha3_generic_keccak_portable_keccak1_7c( - Eurydice_slice data, Eurydice_slice out) { - libcrux_sha3_generic_keccak_KeccakState_17 s = - libcrux_sha3_generic_keccak_new_80_04(); - size_t data_len = Eurydice_slice_len(data, uint8_t); - for (size_t i = (size_t)0U; i < data_len / (size_t)104U; i++) { - size_t i0 = i; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_block_80_c62(&s, buf, i0 * (size_t)104U); - } - size_t rem = data_len % (size_t)104U; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_final_80_9e4(&s, buf, data_len - rem, rem); - size_t outlen = Eurydice_slice_len(out, uint8_t); - size_t blocks = outlen / (size_t)104U; - size_t last = outlen - outlen % (size_t)104U; - if (blocks == (size_t)0U) { - libcrux_sha3_simd_portable_squeeze_13_7a(&s, out, (size_t)0U, outlen); - } else { - libcrux_sha3_simd_portable_squeeze_13_7a(&s, out, (size_t)0U, (size_t)104U); - for (size_t i = (size_t)1U; i < blocks; i++) { - size_t i0 = i; - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_7a(&s, out, i0 * (size_t)104U, - (size_t)104U); - } - if (last < outlen) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_7a(&s, out, last, outlen - last); - } - } -} - -/** - A portable SHA3 384 implementation. -*/ -static KRML_MUSTINLINE void libcrux_sha3_portable_sha384(Eurydice_slice digest, - Eurydice_slice data) { - libcrux_sha3_generic_keccak_portable_keccak1_7c(data, digest); -} - -/** - SHA3 224 - - Preconditions: - - `digest.len() == 28` -*/ -static inline void libcrux_sha3_sha224_ema(Eurydice_slice digest, - Eurydice_slice payload) { - libcrux_sha3_portable_sha224(digest, payload); -} - -/** - SHA3 224 -*/ -static inline void libcrux_sha3_sha224(Eurydice_slice data, uint8_t ret[28U]) { - uint8_t out[28U] = {0U}; - libcrux_sha3_sha224_ema(Eurydice_array_to_slice((size_t)28U, out, uint8_t), - data); - memcpy(ret, out, (size_t)28U * sizeof(uint8_t)); -} - -/** - SHA3 256 -*/ -static inline void libcrux_sha3_sha256_ema(Eurydice_slice digest, - Eurydice_slice payload) { - libcrux_sha3_portable_sha256(digest, payload); -} - -/** - SHA3 256 -*/ -static inline void libcrux_sha3_sha256(Eurydice_slice data, uint8_t ret[32U]) { - uint8_t out[32U] = {0U}; - libcrux_sha3_sha256_ema(Eurydice_array_to_slice((size_t)32U, out, uint8_t), - data); - memcpy(ret, out, (size_t)32U * sizeof(uint8_t)); -} - -/** - SHA3 384 -*/ -static inline void libcrux_sha3_sha384_ema(Eurydice_slice digest, - Eurydice_slice payload) { - libcrux_sha3_portable_sha384(digest, payload); -} - -/** - SHA3 384 -*/ -static inline void libcrux_sha3_sha384(Eurydice_slice data, uint8_t ret[48U]) { - uint8_t out[48U] = {0U}; - libcrux_sha3_sha384_ema(Eurydice_array_to_slice((size_t)48U, out, uint8_t), - data); - memcpy(ret, out, (size_t)48U * sizeof(uint8_t)); -} - -/** - SHA3 512 -*/ -static inline void libcrux_sha3_sha512_ema(Eurydice_slice digest, - Eurydice_slice payload) { - libcrux_sha3_portable_sha512(digest, payload); -} - -/** - SHA3 512 -*/ -static inline void libcrux_sha3_sha512(Eurydice_slice data, uint8_t ret[64U]) { - uint8_t out[64U] = {0U}; - libcrux_sha3_sha512_ema(Eurydice_array_to_slice((size_t)64U, out, uint8_t), - data); - memcpy(ret, out, (size_t)64U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_sha3::traits::Absorb<1usize> for -libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1 -with const generics -- RATE= 168 -*/ -static inline void libcrux_sha3_simd_portable_load_block_a1_3a( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input, - size_t start) { - libcrux_sha3_simd_portable_load_block_3a(self->st, input[0U], start); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80 -with types uint64_t -with const generics -- N= 1 -- RATE= 168 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c63( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks, - size_t start) { - libcrux_sha3_simd_portable_load_block_a1_3a(self, blocks, start); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); -} - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1 -with const generics -- RATE= 168 -- DELIM= 31 -*/ -static inline void libcrux_sha3_generic_keccak_portable_keccak1_c6( - Eurydice_slice data, Eurydice_slice out) { - libcrux_sha3_generic_keccak_KeccakState_17 s = - libcrux_sha3_generic_keccak_new_80_04(); - size_t data_len = Eurydice_slice_len(data, uint8_t); - for (size_t i = (size_t)0U; i < data_len / (size_t)168U; i++) { - size_t i0 = i; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_block_80_c63(&s, buf, i0 * (size_t)168U); - } - size_t rem = data_len % (size_t)168U; - Eurydice_slice buf[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_final_80_9e2(&s, buf, data_len - rem, rem); - size_t outlen = Eurydice_slice_len(out, uint8_t); - size_t blocks = outlen / (size_t)168U; - size_t last = outlen - outlen % (size_t)168U; - if (blocks == (size_t)0U) { - libcrux_sha3_simd_portable_squeeze_13_3a(&s, out, (size_t)0U, outlen); - } else { - libcrux_sha3_simd_portable_squeeze_13_3a(&s, out, (size_t)0U, (size_t)168U); - for (size_t i = (size_t)1U; i < blocks; i++) { - size_t i0 = i; - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_3a(&s, out, i0 * (size_t)168U, - (size_t)168U); - } - if (last < outlen) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&s); - libcrux_sha3_simd_portable_squeeze_13_3a(&s, out, last, outlen - last); - } - } -} - -/** - A portable SHAKE128 implementation. -*/ -static KRML_MUSTINLINE void libcrux_sha3_portable_shake128( - Eurydice_slice digest, Eurydice_slice data) { - libcrux_sha3_generic_keccak_portable_keccak1_c6(data, digest); -} - -/** - SHAKE 128 - - Writes `out.len()` bytes. -*/ -static inline void libcrux_sha3_shake128_ema(Eurydice_slice out, - Eurydice_slice data) { - libcrux_sha3_portable_shake128(out, data); -} - -/** - SHAKE 256 - - Writes `out.len()` bytes. -*/ -static inline void libcrux_sha3_shake256_ema(Eurydice_slice out, - Eurydice_slice data) { - libcrux_sha3_portable_shake256(out, data); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of -libcrux_sha3.generic_keccak.portable.squeeze_first_five_blocks_b4 with const -generics -- RATE= 168 -*/ -static KRML_MUSTINLINE void -libcrux_sha3_generic_keccak_portable_squeeze_first_five_blocks_b4_3a( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out) { - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)0U, (size_t)168U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)168U, - (size_t)168U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)2U * (size_t)168U, - (size_t)168U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)3U * (size_t)168U, - (size_t)168U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); - libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)4U * (size_t)168U, - (size_t)168U); -} - -/** - Squeeze five blocks -*/ -static KRML_MUSTINLINE void -libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks( - libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out0) { - libcrux_sha3_generic_keccak_portable_squeeze_first_five_blocks_b4_3a(s, out0); -} - -/** - Absorb some data for SHAKE-256 for the last time -*/ -static KRML_MUSTINLINE void -libcrux_sha3_portable_incremental_shake256_absorb_final( - libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice data) { - libcrux_sha3_generic_keccak_KeccakState_17 *uu____0 = s; - Eurydice_slice uu____1[1U] = {data}; - libcrux_sha3_generic_keccak_absorb_final_80_9e1( - uu____0, uu____1, (size_t)0U, Eurydice_slice_len(data, uint8_t)); -} - -/** - Create a new SHAKE-256 state object. -*/ -static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_17 -libcrux_sha3_portable_incremental_shake256_init(void) { - return libcrux_sha3_generic_keccak_new_80_04(); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of -libcrux_sha3.generic_keccak.portable.squeeze_first_block_b4 with const generics -- RATE= 136 -*/ -static KRML_MUSTINLINE void -libcrux_sha3_generic_keccak_portable_squeeze_first_block_b4_5b( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out) { - libcrux_sha3_simd_portable_squeeze_13_5b(self, out, (size_t)0U, (size_t)136U); -} - -/** - Squeeze the first SHAKE-256 block -*/ -static KRML_MUSTINLINE void -libcrux_sha3_portable_incremental_shake256_squeeze_first_block( - libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out) { - libcrux_sha3_generic_keccak_portable_squeeze_first_block_b4_5b(s, out); -} - -/** -This function found in impl {libcrux_sha3::generic_keccak::KeccakState[core::marker::Sized, -libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for -u64}]} -*/ -/** -A monomorphic instance of -libcrux_sha3.generic_keccak.portable.squeeze_next_block_b4 with const generics -- RATE= 136 -*/ -static KRML_MUSTINLINE void -libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_5b( - libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out, - size_t start) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(self); - libcrux_sha3_simd_portable_squeeze_13_5b(self, out, start, (size_t)136U); -} - -/** - Squeeze the next SHAKE-256 block -*/ -static KRML_MUSTINLINE void -libcrux_sha3_portable_incremental_shake256_squeeze_next_block( - libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out) { - libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_5b(s, out, - (size_t)0U); -} - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.KeccakXofState -with types uint64_t -with const generics -- $1size_t -- $136size_t -*/ -typedef struct libcrux_sha3_generic_keccak_xof_KeccakXofState_e2_s { - libcrux_sha3_generic_keccak_KeccakState_17 inner; - uint8_t buf[1U][136U]; - size_t buf_len; - bool sponge; -} libcrux_sha3_generic_keccak_xof_KeccakXofState_e2; - -typedef libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 - libcrux_sha3_portable_incremental_Shake256Xof; - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.fill_buffer_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 136 -*/ -static inline size_t libcrux_sha3_generic_keccak_xof_fill_buffer_35_c6( - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self, - Eurydice_slice *inputs) { - size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t); - size_t consumed = (size_t)0U; - if (self->buf_len > (size_t)0U) { - if (self->buf_len + input_len >= (size_t)136U) { - consumed = (size_t)136U - self->buf_len; - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - size_t i0 = i; - Eurydice_slice uu____0 = Eurydice_array_to_subslice_from( - (size_t)136U, self->buf[i0], self->buf_len, uint8_t, size_t, - uint8_t[]); - Eurydice_slice_copy( - uu____0, - Eurydice_slice_subslice_to(inputs[i0], consumed, uint8_t, size_t, - uint8_t[]), - uint8_t); - } - self->buf_len = self->buf_len + consumed; - } - } - return consumed; -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_full_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 136 -*/ -static inline size_t libcrux_sha3_generic_keccak_xof_absorb_full_35_c6( - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self, - Eurydice_slice *inputs) { - size_t input_consumed = - libcrux_sha3_generic_keccak_xof_fill_buffer_35_c6(self, inputs); - if (input_consumed > (size_t)0U) { - Eurydice_slice borrowed[1U]; - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - uint8_t buf[136U] = {0U}; - borrowed[i] = core_array___Array_T__N___as_slice((size_t)136U, buf, - uint8_t, Eurydice_slice); - } - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - size_t i0 = i; - borrowed[i0] = - Eurydice_array_to_slice((size_t)136U, self->buf[i0], uint8_t); - } - libcrux_sha3_simd_portable_load_block_a1_5b(&self->inner, borrowed, - (size_t)0U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - self->buf_len = (size_t)0U; - } - size_t input_to_consume = - Eurydice_slice_len(inputs[0U], uint8_t) - input_consumed; - size_t num_blocks = input_to_consume / (size_t)136U; - size_t remainder = input_to_consume % (size_t)136U; - for (size_t i = (size_t)0U; i < num_blocks; i++) { - size_t i0 = i; - libcrux_sha3_simd_portable_load_block_a1_5b( - &self->inner, inputs, input_consumed + i0 * (size_t)136U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - } - return remainder; -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 136 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_absorb_35_c6( - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self, - Eurydice_slice *inputs) { - size_t input_remainder_len = - libcrux_sha3_generic_keccak_xof_absorb_full_35_c6(self, inputs); - if (input_remainder_len > (size_t)0U) { - size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t); - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - size_t i0 = i; - Eurydice_slice_copy(Eurydice_array_to_subslice3( - self->buf[i0], self->buf_len, - self->buf_len + input_remainder_len, uint8_t *), - Eurydice_slice_subslice_from( - inputs[i0], input_len - input_remainder_len, - uint8_t, size_t, uint8_t[]), - uint8_t); - } - self->buf_len = self->buf_len + input_remainder_len; - } -} - -/** - Shake256 absorb -*/ -/** -This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize> -for libcrux_sha3::portable::incremental::Shake256Xof} -*/ -static inline void libcrux_sha3_portable_incremental_absorb_42( - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self, - Eurydice_slice input) { - Eurydice_slice buf[1U] = {input}; - libcrux_sha3_generic_keccak_xof_absorb_35_c6(self, buf); -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_final_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 136 -- DELIMITER= 31 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_absorb_final_35_9e( - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self, - Eurydice_slice *inputs) { - libcrux_sha3_generic_keccak_xof_absorb_35_c6(self, inputs); - Eurydice_slice borrowed[1U]; - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - uint8_t buf[136U] = {0U}; - borrowed[i] = core_array___Array_T__N___as_slice((size_t)136U, buf, uint8_t, - Eurydice_slice); - } - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - size_t i0 = i; - borrowed[i0] = - Eurydice_array_to_slice((size_t)136U, self->buf[i0], uint8_t); - } - libcrux_sha3_simd_portable_load_last_a1_ad0(&self->inner, borrowed, - (size_t)0U, self->buf_len); - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); -} - -/** - Shake256 absorb final -*/ -/** -This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize> -for libcrux_sha3::portable::incremental::Shake256Xof} -*/ -static inline void libcrux_sha3_portable_incremental_absorb_final_42( - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self, - Eurydice_slice input) { - Eurydice_slice buf[1U] = {input}; - libcrux_sha3_generic_keccak_xof_absorb_final_35_9e(self, buf); -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.zero_block_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 136 -*/ -static inline void libcrux_sha3_generic_keccak_xof_zero_block_35_c6( - uint8_t ret[136U]) { - memset(ret, 0U, 136U * sizeof(uint8_t)); -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.new_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 136 -*/ -static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 -libcrux_sha3_generic_keccak_xof_new_35_c6(void) { - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 lit; - lit.inner = libcrux_sha3_generic_keccak_new_80_04(); - uint8_t repeat_expression[1U][136U]; - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - libcrux_sha3_generic_keccak_xof_zero_block_35_c6(repeat_expression[i]); - } - memcpy(lit.buf, repeat_expression, (size_t)1U * sizeof(uint8_t[136U])); - lit.buf_len = (size_t)0U; - lit.sponge = false; - return lit; -} - -/** - Shake256 new state -*/ -/** -This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize> -for libcrux_sha3::portable::incremental::Shake256Xof} -*/ -static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 -libcrux_sha3_portable_incremental_new_42(void) { - return libcrux_sha3_generic_keccak_xof_new_35_c6(); -} - -/** - Squeeze `N` x `LEN` bytes. Only `N = 1` for now. -*/ -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.squeeze_85 -with types uint64_t -with const generics -- RATE= 136 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_squeeze_85_c7( - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self, - Eurydice_slice out) { - if (self->sponge) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - } - size_t out_len = Eurydice_slice_len(out, uint8_t); - if (out_len > (size_t)0U) { - if (out_len <= (size_t)136U) { - libcrux_sha3_simd_portable_squeeze_13_5b(&self->inner, out, (size_t)0U, - out_len); - } else { - size_t blocks = out_len / (size_t)136U; - for (size_t i = (size_t)0U; i < blocks; i++) { - size_t i0 = i; - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - libcrux_sha3_simd_portable_squeeze_13_5b( - &self->inner, out, i0 * (size_t)136U, (size_t)136U); - } - size_t remaining = out_len % (size_t)136U; - if (remaining > (size_t)0U) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - libcrux_sha3_simd_portable_squeeze_13_5b( - &self->inner, out, blocks * (size_t)136U, remaining); - } - } - self->sponge = true; - } -} - -/** - Shake256 squeeze -*/ -/** -This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize> -for libcrux_sha3::portable::incremental::Shake256Xof} -*/ -static inline void libcrux_sha3_portable_incremental_squeeze_42( - libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self, - Eurydice_slice out) { - libcrux_sha3_generic_keccak_xof_squeeze_85_c7(self, out); -} - -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.KeccakXofState -with types uint64_t -with const generics -- $1size_t -- $168size_t -*/ -typedef struct libcrux_sha3_generic_keccak_xof_KeccakXofState_97_s { - libcrux_sha3_generic_keccak_KeccakState_17 inner; - uint8_t buf[1U][168U]; - size_t buf_len; - bool sponge; -} libcrux_sha3_generic_keccak_xof_KeccakXofState_97; - -typedef libcrux_sha3_generic_keccak_xof_KeccakXofState_97 - libcrux_sha3_portable_incremental_Shake128Xof; - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.fill_buffer_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 168 -*/ -static inline size_t libcrux_sha3_generic_keccak_xof_fill_buffer_35_c60( - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self, - Eurydice_slice *inputs) { - size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t); - size_t consumed = (size_t)0U; - if (self->buf_len > (size_t)0U) { - if (self->buf_len + input_len >= (size_t)168U) { - consumed = (size_t)168U - self->buf_len; - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - size_t i0 = i; - Eurydice_slice uu____0 = Eurydice_array_to_subslice_from( - (size_t)168U, self->buf[i0], self->buf_len, uint8_t, size_t, - uint8_t[]); - Eurydice_slice_copy( - uu____0, - Eurydice_slice_subslice_to(inputs[i0], consumed, uint8_t, size_t, - uint8_t[]), - uint8_t); - } - self->buf_len = self->buf_len + consumed; - } - } - return consumed; -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_full_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 168 -*/ -static inline size_t libcrux_sha3_generic_keccak_xof_absorb_full_35_c60( - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self, - Eurydice_slice *inputs) { - size_t input_consumed = - libcrux_sha3_generic_keccak_xof_fill_buffer_35_c60(self, inputs); - if (input_consumed > (size_t)0U) { - Eurydice_slice borrowed[1U]; - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - uint8_t buf[168U] = {0U}; - borrowed[i] = core_array___Array_T__N___as_slice((size_t)168U, buf, - uint8_t, Eurydice_slice); - } - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - size_t i0 = i; - borrowed[i0] = - Eurydice_array_to_slice((size_t)168U, self->buf[i0], uint8_t); - } - libcrux_sha3_simd_portable_load_block_a1_3a(&self->inner, borrowed, - (size_t)0U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - self->buf_len = (size_t)0U; - } - size_t input_to_consume = - Eurydice_slice_len(inputs[0U], uint8_t) - input_consumed; - size_t num_blocks = input_to_consume / (size_t)168U; - size_t remainder = input_to_consume % (size_t)168U; - for (size_t i = (size_t)0U; i < num_blocks; i++) { - size_t i0 = i; - libcrux_sha3_simd_portable_load_block_a1_3a( - &self->inner, inputs, input_consumed + i0 * (size_t)168U); - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - } - return remainder; -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 168 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_absorb_35_c60( - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self, - Eurydice_slice *inputs) { - size_t input_remainder_len = - libcrux_sha3_generic_keccak_xof_absorb_full_35_c60(self, inputs); - if (input_remainder_len > (size_t)0U) { - size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t); - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - size_t i0 = i; - Eurydice_slice_copy(Eurydice_array_to_subslice3( - self->buf[i0], self->buf_len, - self->buf_len + input_remainder_len, uint8_t *), - Eurydice_slice_subslice_from( - inputs[i0], input_len - input_remainder_len, - uint8_t, size_t, uint8_t[]), - uint8_t); - } - self->buf_len = self->buf_len + input_remainder_len; - } -} - -/** -This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize> -for libcrux_sha3::portable::incremental::Shake128Xof} -*/ -static inline void libcrux_sha3_portable_incremental_absorb_26( - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self, - Eurydice_slice input) { - Eurydice_slice buf[1U] = {input}; - libcrux_sha3_generic_keccak_xof_absorb_35_c60(self, buf); -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_final_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 168 -- DELIMITER= 31 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_absorb_final_35_9e0( - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self, - Eurydice_slice *inputs) { - libcrux_sha3_generic_keccak_xof_absorb_35_c60(self, inputs); - Eurydice_slice borrowed[1U]; - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - uint8_t buf[168U] = {0U}; - borrowed[i] = core_array___Array_T__N___as_slice((size_t)168U, buf, uint8_t, - Eurydice_slice); - } - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - size_t i0 = i; - borrowed[i0] = - Eurydice_array_to_slice((size_t)168U, self->buf[i0], uint8_t); - } - libcrux_sha3_simd_portable_load_last_a1_c6(&self->inner, borrowed, (size_t)0U, - self->buf_len); - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); -} - -/** -This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize> -for libcrux_sha3::portable::incremental::Shake128Xof} -*/ -static inline void libcrux_sha3_portable_incremental_absorb_final_26( - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self, - Eurydice_slice input) { - Eurydice_slice buf[1U] = {input}; - libcrux_sha3_generic_keccak_xof_absorb_final_35_9e0(self, buf); -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.zero_block_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 168 -*/ -static inline void libcrux_sha3_generic_keccak_xof_zero_block_35_c60( - uint8_t ret[168U]) { - memset(ret, 0U, 168U * sizeof(uint8_t)); -} - -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.new_35 -with types uint64_t -with const generics -- PARALLEL_LANES= 1 -- RATE= 168 -*/ -static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_97 -libcrux_sha3_generic_keccak_xof_new_35_c60(void) { - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 lit; - lit.inner = libcrux_sha3_generic_keccak_new_80_04(); - uint8_t repeat_expression[1U][168U]; - for (size_t i = (size_t)0U; i < (size_t)1U; i++) { - libcrux_sha3_generic_keccak_xof_zero_block_35_c60(repeat_expression[i]); - } - memcpy(lit.buf, repeat_expression, (size_t)1U * sizeof(uint8_t[168U])); - lit.buf_len = (size_t)0U; - lit.sponge = false; - return lit; -} - -/** -This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize> -for libcrux_sha3::portable::incremental::Shake128Xof} -*/ -static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_97 -libcrux_sha3_portable_incremental_new_26(void) { - return libcrux_sha3_generic_keccak_xof_new_35_c60(); -} - -/** - Squeeze `N` x `LEN` bytes. Only `N = 1` for now. -*/ -/** -This function found in impl -{libcrux_sha3::generic_keccak::xof::KeccakXofState[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_sha3.generic_keccak.xof.squeeze_85 -with types uint64_t -with const generics -- RATE= 168 -*/ -static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_squeeze_85_13( - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self, - Eurydice_slice out) { - if (self->sponge) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - } - size_t out_len = Eurydice_slice_len(out, uint8_t); - if (out_len > (size_t)0U) { - if (out_len <= (size_t)168U) { - libcrux_sha3_simd_portable_squeeze_13_3a(&self->inner, out, (size_t)0U, - out_len); - } else { - size_t blocks = out_len / (size_t)168U; - for (size_t i = (size_t)0U; i < blocks; i++) { - size_t i0 = i; - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - libcrux_sha3_simd_portable_squeeze_13_3a( - &self->inner, out, i0 * (size_t)168U, (size_t)168U); - } - size_t remaining = out_len % (size_t)168U; - if (remaining > (size_t)0U) { - libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner); - libcrux_sha3_simd_portable_squeeze_13_3a( - &self->inner, out, blocks * (size_t)168U, remaining); - } - } - self->sponge = true; - } -} - -/** - Shake128 squeeze -*/ -/** -This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize> -for libcrux_sha3::portable::incremental::Shake128Xof} -*/ -static inline void libcrux_sha3_portable_incremental_squeeze_26( - libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self, - Eurydice_slice out) { - libcrux_sha3_generic_keccak_xof_squeeze_85_13(self, out); -} - -/** -This function found in impl {core::clone::Clone for -libcrux_sha3::portable::KeccakState} -*/ -static inline libcrux_sha3_generic_keccak_KeccakState_17 -libcrux_sha3_portable_clone_fe( - libcrux_sha3_generic_keccak_KeccakState_17 *self) { - return self[0U]; -} - -/** -This function found in impl {core::convert::From for -u32} -*/ -static inline uint32_t libcrux_sha3_from_6c(libcrux_sha3_Algorithm v) { - switch (v) { - case libcrux_sha3_Algorithm_Sha224: { - break; - } - case libcrux_sha3_Algorithm_Sha256: { - return 2U; - } - case libcrux_sha3_Algorithm_Sha384: { - return 3U; - } - case libcrux_sha3_Algorithm_Sha512: { - return 4U; - } - default: { - KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, - __LINE__); - KRML_HOST_EXIT(253U); - } - } - return 1U; -} - -/** -This function found in impl {core::convert::From for -libcrux_sha3::Algorithm} -*/ -static inline libcrux_sha3_Algorithm libcrux_sha3_from_29(uint32_t v) { - switch (v) { - case 1U: { - break; - } - case 2U: { - return libcrux_sha3_Algorithm_Sha256; - } - case 3U: { - return libcrux_sha3_Algorithm_Sha384; - } - case 4U: { - return libcrux_sha3_Algorithm_Sha512; - } - default: { - KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, - "panic!"); - KRML_HOST_EXIT(255U); - } - } - return libcrux_sha3_Algorithm_Sha224; -} - -#if defined(__cplusplus) -} -#endif - -#define libcrux_sha3_portable_H_DEFINED -#endif /* libcrux_sha3_portable_H */ - -/* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/libcrux_mlkem768_portable.h */ -/* - * SPDX-FileCopyrightText: 2025 Cryspen Sarl - * - * SPDX-License-Identifier: MIT or Apache-2.0 - * - * This code was generated with the following revisions: - * Charon: 667d2fc98984ff7f3df989c2367e6c1fa4a000e7 - * Eurydice: 2381cbc416ef2ad0b561c362c500bc84f36b6785 - * Karamel: 80f5435f2fc505973c469a4afcc8d875cddd0d8b - * F*: 71d8221589d4d438af3706d89cb653cf53e18aab - * Libcrux: 68dfed5a4a9e40277f62828471c029afed1ecdcc - */ - -#ifndef libcrux_mlkem768_portable_H -#define libcrux_mlkem768_portable_H - - -#if defined(__cplusplus) -extern "C" { -#endif - - -static inline void libcrux_ml_kem_hash_functions_portable_G( - Eurydice_slice input, uint8_t ret[64U]) { - uint8_t digest[64U] = {0U}; - libcrux_sha3_portable_sha512( - Eurydice_array_to_slice((size_t)64U, digest, uint8_t), input); - memcpy(ret, digest, (size_t)64U * sizeof(uint8_t)); -} - -static inline void libcrux_ml_kem_hash_functions_portable_H( - Eurydice_slice input, uint8_t ret[32U]) { - uint8_t digest[32U] = {0U}; - libcrux_sha3_portable_sha256( - Eurydice_array_to_slice((size_t)32U, digest, uint8_t), input); - memcpy(ret, digest, (size_t)32U * sizeof(uint8_t)); -} - -static const int16_t libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[128U] = - {(int16_t)-1044, (int16_t)-758, (int16_t)-359, (int16_t)-1517, - (int16_t)1493, (int16_t)1422, (int16_t)287, (int16_t)202, - (int16_t)-171, (int16_t)622, (int16_t)1577, (int16_t)182, - (int16_t)962, (int16_t)-1202, (int16_t)-1474, (int16_t)1468, - (int16_t)573, (int16_t)-1325, (int16_t)264, (int16_t)383, - (int16_t)-829, (int16_t)1458, (int16_t)-1602, (int16_t)-130, - (int16_t)-681, (int16_t)1017, (int16_t)732, (int16_t)608, - (int16_t)-1542, (int16_t)411, (int16_t)-205, (int16_t)-1571, - (int16_t)1223, (int16_t)652, (int16_t)-552, (int16_t)1015, - (int16_t)-1293, (int16_t)1491, (int16_t)-282, (int16_t)-1544, - (int16_t)516, (int16_t)-8, (int16_t)-320, (int16_t)-666, - (int16_t)-1618, (int16_t)-1162, (int16_t)126, (int16_t)1469, - (int16_t)-853, (int16_t)-90, (int16_t)-271, (int16_t)830, - (int16_t)107, (int16_t)-1421, (int16_t)-247, (int16_t)-951, - (int16_t)-398, (int16_t)961, (int16_t)-1508, (int16_t)-725, - (int16_t)448, (int16_t)-1065, (int16_t)677, (int16_t)-1275, - (int16_t)-1103, (int16_t)430, (int16_t)555, (int16_t)843, - (int16_t)-1251, (int16_t)871, (int16_t)1550, (int16_t)105, - (int16_t)422, (int16_t)587, (int16_t)177, (int16_t)-235, - (int16_t)-291, (int16_t)-460, (int16_t)1574, (int16_t)1653, - (int16_t)-246, (int16_t)778, (int16_t)1159, (int16_t)-147, - (int16_t)-777, (int16_t)1483, (int16_t)-602, (int16_t)1119, - (int16_t)-1590, (int16_t)644, (int16_t)-872, (int16_t)349, - (int16_t)418, (int16_t)329, (int16_t)-156, (int16_t)-75, - (int16_t)817, (int16_t)1097, (int16_t)603, (int16_t)610, - (int16_t)1322, (int16_t)-1285, (int16_t)-1465, (int16_t)384, - (int16_t)-1215, (int16_t)-136, (int16_t)1218, (int16_t)-1335, - (int16_t)-874, (int16_t)220, (int16_t)-1187, (int16_t)-1659, - (int16_t)-1185, (int16_t)-1530, (int16_t)-1278, (int16_t)794, - (int16_t)-1510, (int16_t)-854, (int16_t)-870, (int16_t)478, - (int16_t)-108, (int16_t)-308, (int16_t)996, (int16_t)991, - (int16_t)958, (int16_t)-1460, (int16_t)1522, (int16_t)1628}; - -static KRML_MUSTINLINE int16_t libcrux_ml_kem_polynomial_zeta(size_t i) { - return libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[i]; -} - -#define LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT ((size_t)16U) - -#define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR ((size_t)16U) - -#define LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS \ - ((int16_t)1353) - -#define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS ((int16_t)3329) - -#define LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R \ - (62209U) - -typedef struct libcrux_ml_kem_vector_portable_vector_type_PortableVector_s { - int16_t elements[16U]; -} libcrux_ml_kem_vector_portable_vector_type_PortableVector; - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_vector_type_from_i16_array( - Eurydice_slice array) { - libcrux_ml_kem_vector_portable_vector_type_PortableVector lit; - int16_t ret[16U]; - Result_0a dst; - Eurydice_slice_to_array2( - &dst, Eurydice_slice_subslice3(array, (size_t)0U, (size_t)16U, int16_t *), - Eurydice_slice, int16_t[16U], TryFromSliceError); - unwrap_26_00(dst, ret); - memcpy(lit.elements, ret, (size_t)16U * sizeof(int16_t)); - return lit; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_from_i16_array_b8(Eurydice_slice array) { - return libcrux_ml_kem_vector_portable_vector_type_from_i16_array( - libcrux_secrets_int_classify_public_classify_ref_9b_39(array)); -} - -typedef struct int16_t_x8_s { - int16_t fst; - int16_t snd; - int16_t thd; - int16_t f3; - int16_t f4; - int16_t f5; - int16_t f6; - int16_t f7; -} int16_t_x8; - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_vector_type_zero(void) { - libcrux_ml_kem_vector_portable_vector_type_PortableVector lit; - int16_t ret[16U]; - int16_t buf[16U] = {0U}; - libcrux_secrets_int_public_integers_classify_27_46(buf, ret); - memcpy(lit.elements, ret, (size_t)16U * sizeof(int16_t)); - return lit; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ZERO_b8(void) { - return libcrux_ml_kem_vector_portable_vector_type_zero(); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_add( - libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs, - libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - size_t uu____0 = i0; - lhs.elements[uu____0] = lhs.elements[uu____0] + rhs->elements[i0]; - } - return lhs; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_add_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs, - libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) { - return libcrux_ml_kem_vector_portable_arithmetic_add(lhs, rhs); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_sub( - libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs, - libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - size_t uu____0 = i0; - lhs.elements[uu____0] = lhs.elements[uu____0] - rhs->elements[i0]; - } - return lhs; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_sub_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs, - libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) { - return libcrux_ml_kem_vector_portable_arithmetic_sub(lhs, rhs); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, int16_t c) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - size_t uu____0 = i0; - vec.elements[uu____0] = vec.elements[uu____0] * c; - } - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_multiply_by_constant_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, int16_t c) { - return libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(vec, c); -} - -/** - Note: This function is not secret independent - Only use with public values. -*/ -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - if (libcrux_secrets_int_public_integers_declassify_d8_39( - vec.elements[i0]) >= (int16_t)3329) { - size_t uu____0 = i0; - vec.elements[uu____0] = vec.elements[uu____0] - (int16_t)3329; - } - } - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_cond_subtract_3329_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { - return libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(v); -} - -#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER \ - ((int32_t)20159) - -#define LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT ((int32_t)26) - -#define LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_R \ - ((int32_t)1 << (uint32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT) - -/** - Signed Barrett Reduction - - Given an input `value`, `barrett_reduce` outputs a representative `result` - such that: - - - result ≡ value (mod FIELD_MODULUS) - - the absolute value of `result` is bound as follows: - - `|result| ≤ FIELD_MODULUS / 2 · (|value|/BARRETT_R + 1) - - Note: The input bound is 28296 to prevent overflow in the multiplication of - quotient by FIELD_MODULUS - -*/ -static inline int16_t -libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element( - int16_t value) { - int32_t t = libcrux_secrets_int_as_i32_f5(value) * - LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER + - (LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_R >> 1U); - int16_t quotient = libcrux_secrets_int_as_i16_36( - t >> (uint32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT); - return value - quotient * LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS; -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - int16_t vi = - libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element( - vec.elements[i0]); - vec.elements[i0] = vi; - } - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_barrett_reduce_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vector) { - return libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(vector); -} - -#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT (16U) - -/** - Signed Montgomery Reduction - - Given an input `value`, `montgomery_reduce` outputs a representative `o` - such that: - - - o ≡ value · MONTGOMERY_R^(-1) (mod FIELD_MODULUS) - - the absolute value of `o` is bound as follows: - - `|result| ≤ ceil(|value| / MONTGOMERY_R) + 1665 - - In particular, if `|value| ≤ FIELD_MODULUS-1 * FIELD_MODULUS-1`, then `|o| <= - FIELD_MODULUS-1`. And, if `|value| ≤ pow2 16 * FIELD_MODULUS-1`, then `|o| <= - FIELD_MODULUS + 1664 - -*/ -static inline int16_t -libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element( - int32_t value) { - int32_t k = - libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_as_i16_36(value)) * - libcrux_secrets_int_as_i32_b8( - libcrux_secrets_int_public_integers_classify_27_df( - LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R)); - int32_t k_times_modulus = - libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_as_i16_36(k)) * - libcrux_secrets_int_as_i32_f5( - libcrux_secrets_int_public_integers_classify_27_39( - LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS)); - int16_t c = libcrux_secrets_int_as_i16_36( - k_times_modulus >> - (uint32_t)LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT); - int16_t value_high = libcrux_secrets_int_as_i16_36( - value >> - (uint32_t)LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT); - return value_high - c; -} - -/** - If `fe` is some field element 'x' of the Kyber field and `fer` is congruent to - `y · MONTGOMERY_R`, this procedure outputs a value that is congruent to - `x · y`, as follows: - - `fe · fer ≡ x · y · MONTGOMERY_R (mod FIELD_MODULUS)` - - `montgomery_reduce` takes the value `x · y · MONTGOMERY_R` and outputs a - representative `x · y · MONTGOMERY_R * MONTGOMERY_R^{-1} ≡ x · y (mod - FIELD_MODULUS)`. -*/ -static KRML_MUSTINLINE int16_t -libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer( - int16_t fe, int16_t fer) { - int32_t product = - libcrux_secrets_int_as_i32_f5(fe) * libcrux_secrets_int_as_i32_f5(fer); - return libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element( - product); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, int16_t c) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - vec.elements[i0] = - libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer( - vec.elements[i0], c); - } - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vector, - int16_t constant) { - return libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant( - vector, libcrux_secrets_int_public_integers_classify_27_39(constant)); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, int16_t c) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - size_t uu____0 = i0; - vec.elements[uu____0] = vec.elements[uu____0] & c; - } - return vec; -} - -/** -A monomorphic instance of libcrux_ml_kem.vector.portable.arithmetic.shift_right -with const generics -- SHIFT_BY= 15 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_shift_right_ef( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - vec.elements[i0] = vec.elements[i0] >> (uint32_t)(int32_t)15; - } - return vec; -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_arithmetic_to_unsigned_representative( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - libcrux_ml_kem_vector_portable_vector_type_PortableVector t = - libcrux_ml_kem_vector_portable_arithmetic_shift_right_ef(a); - libcrux_ml_kem_vector_portable_vector_type_PortableVector fm = - libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant( - t, LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS); - return libcrux_ml_kem_vector_portable_arithmetic_add(a, &fm); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_to_unsigned_representative_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - return libcrux_ml_kem_vector_portable_arithmetic_to_unsigned_representative( - a); -} - -/** - The `compress_*` functions implement the `Compress` function specified in the - NIST FIPS 203 standard (Page 18, Expression 4.5), which is defined as: - - ```plaintext - Compress_d: ℤq -> ℤ_{2ᵈ} - Compress_d(x) = ⌈(2ᵈ/q)·x⌋ - ``` - - Since `⌈x⌋ = ⌊x + 1/2⌋` we have: - - ```plaintext - Compress_d(x) = ⌊(2ᵈ/q)·x + 1/2⌋ - = ⌊(2^{d+1}·x + q) / 2q⌋ - ``` - - For further information about the function implementations, consult the - `implementation_notes.pdf` document in this directory. - - The NIST FIPS 203 standard can be found at - . -*/ -static inline uint8_t -libcrux_ml_kem_vector_portable_compress_compress_message_coefficient( - uint16_t fe) { - int16_t shifted = - libcrux_secrets_int_public_integers_classify_27_39((int16_t)1664) - - libcrux_secrets_int_as_i16_ca(fe); - int16_t mask = shifted >> 15U; - int16_t shifted_to_positive = mask ^ shifted; - int16_t shifted_positive_in_range = shifted_to_positive - (int16_t)832; - int16_t r0 = shifted_positive_in_range >> 15U; - int16_t r1 = r0 & (int16_t)1; - return libcrux_secrets_int_as_u8_f5(r1); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_compress_1( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - a.elements[i0] = libcrux_secrets_int_as_i16_59( - libcrux_ml_kem_vector_portable_compress_compress_message_coefficient( - libcrux_secrets_int_as_u16_f5(a.elements[i0]))); - } - return a; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_1_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - return libcrux_ml_kem_vector_portable_compress_compress_1(a); -} - -static KRML_MUSTINLINE uint32_t -libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits( - uint8_t n, uint32_t value) { - return value & ((1U << (uint32_t)n) - 1U); -} - -static inline int16_t -libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient( - uint8_t coefficient_bits, uint16_t fe) { - uint64_t compressed = libcrux_secrets_int_as_u64_ca(fe) - << (uint32_t)coefficient_bits; - compressed = compressed + 1664ULL; - compressed = compressed * 10321340ULL; - compressed = compressed >> 35U; - return libcrux_secrets_int_as_i16_b8( - libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits( - coefficient_bits, libcrux_secrets_int_as_u32_a3(compressed))); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_decompress_1( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - libcrux_ml_kem_vector_portable_vector_type_PortableVector z = - libcrux_ml_kem_vector_portable_vector_type_zero(); - libcrux_ml_kem_vector_portable_vector_type_PortableVector s = - libcrux_ml_kem_vector_portable_arithmetic_sub(z, &a); - libcrux_ml_kem_vector_portable_vector_type_PortableVector res = - libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant( - s, (int16_t)1665); - return res; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_decompress_1_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - return libcrux_ml_kem_vector_portable_compress_decompress_1(a); -} - -static KRML_MUSTINLINE void libcrux_ml_kem_vector_portable_ntt_ntt_step( - libcrux_ml_kem_vector_portable_vector_type_PortableVector *vec, - int16_t zeta, size_t i, size_t j) { - int16_t t = - libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer( - vec->elements[j], - libcrux_secrets_int_public_integers_classify_27_39(zeta)); - int16_t a_minus_t = vec->elements[i] - t; - int16_t a_plus_t = vec->elements[i] + t; - vec->elements[j] = a_minus_t; - vec->elements[i] = a_plus_t; -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, - int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) { - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)0U, - (size_t)2U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)1U, - (size_t)3U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)4U, - (size_t)6U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)5U, - (size_t)7U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta2, (size_t)8U, - (size_t)10U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta2, (size_t)9U, - (size_t)11U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta3, (size_t)12U, - (size_t)14U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta3, (size_t)13U, - (size_t)15U); - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_layer_1_step_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0, - int16_t zeta1, int16_t zeta2, int16_t zeta3) { - return libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step(a, zeta0, zeta1, - zeta2, zeta3); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, - int16_t zeta0, int16_t zeta1) { - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)0U, - (size_t)4U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)1U, - (size_t)5U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)2U, - (size_t)6U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)3U, - (size_t)7U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)8U, - (size_t)12U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)9U, - (size_t)13U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)10U, - (size_t)14U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)11U, - (size_t)15U); - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_layer_2_step_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0, - int16_t zeta1) { - return libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step(a, zeta0, zeta1); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, - int16_t zeta) { - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)0U, - (size_t)8U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)1U, - (size_t)9U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)2U, - (size_t)10U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)3U, - (size_t)11U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)4U, - (size_t)12U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)5U, - (size_t)13U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)6U, - (size_t)14U); - libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)7U, - (size_t)15U); - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_layer_3_step_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta) { - return libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(a, zeta); -} - -static KRML_MUSTINLINE void libcrux_ml_kem_vector_portable_ntt_inv_ntt_step( - libcrux_ml_kem_vector_portable_vector_type_PortableVector *vec, - int16_t zeta, size_t i, size_t j) { - int16_t a_minus_b = vec->elements[j] - vec->elements[i]; - int16_t a_plus_b = vec->elements[j] + vec->elements[i]; - int16_t o0 = libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element( - a_plus_b); - int16_t o1 = - libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer( - a_minus_b, libcrux_secrets_int_public_integers_classify_27_39(zeta)); - vec->elements[i] = o0; - vec->elements[j] = o1; -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, - int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) { - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)0U, - (size_t)2U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)1U, - (size_t)3U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)4U, - (size_t)6U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)5U, - (size_t)7U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta2, (size_t)8U, - (size_t)10U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta2, (size_t)9U, - (size_t)11U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta3, (size_t)12U, - (size_t)14U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta3, (size_t)13U, - (size_t)15U); - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0, - int16_t zeta1, int16_t zeta2, int16_t zeta3) { - return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step( - a, zeta0, zeta1, zeta2, zeta3); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, - int16_t zeta0, int16_t zeta1) { - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)0U, - (size_t)4U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)1U, - (size_t)5U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)2U, - (size_t)6U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)3U, - (size_t)7U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)8U, - (size_t)12U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)9U, - (size_t)13U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)10U, - (size_t)14U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)11U, - (size_t)15U); - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0, - int16_t zeta1) { - return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step(a, zeta0, - zeta1); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, - int16_t zeta) { - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)0U, - (size_t)8U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)1U, - (size_t)9U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)2U, - (size_t)10U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)3U, - (size_t)11U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)4U, - (size_t)12U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)5U, - (size_t)13U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)6U, - (size_t)14U); - libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)7U, - (size_t)15U); - return vec; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta) { - return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(a, zeta); -} - -/** - Compute the product of two Kyber binomials with respect to the - modulus `X² - zeta`. - - This function almost implements Algorithm 11 of the - NIST FIPS 203 standard, which is reproduced below: - - ```plaintext - Input: a₀, a₁, b₀, b₁ ∈ ℤq. - Input: γ ∈ ℤq. - Output: c₀, c₁ ∈ ℤq. - - c₀ ← a₀·b₀ + a₁·b₁·γ - c₁ ← a₀·b₁ + a₁·b₀ - return c₀, c₁ - ``` - We say "almost" because the coefficients output by this function are in - the Montgomery domain (unlike in the specification). - - The NIST FIPS 203 standard can be found at - . -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - libcrux_ml_kem_vector_portable_vector_type_PortableVector *a, - libcrux_ml_kem_vector_portable_vector_type_PortableVector *b, int16_t zeta, - size_t i, libcrux_ml_kem_vector_portable_vector_type_PortableVector *out) { - int16_t ai = a->elements[(size_t)2U * i]; - int16_t bi = b->elements[(size_t)2U * i]; - int16_t aj = a->elements[(size_t)2U * i + (size_t)1U]; - int16_t bj = b->elements[(size_t)2U * i + (size_t)1U]; - int32_t ai_bi = - libcrux_secrets_int_as_i32_f5(ai) * libcrux_secrets_int_as_i32_f5(bi); - int32_t aj_bj_ = - libcrux_secrets_int_as_i32_f5(aj) * libcrux_secrets_int_as_i32_f5(bj); - int16_t aj_bj = - libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element( - aj_bj_); - int32_t aj_bj_zeta = libcrux_secrets_int_as_i32_f5(aj_bj) * - libcrux_secrets_int_as_i32_f5(zeta); - int32_t ai_bi_aj_bj = ai_bi + aj_bj_zeta; - int16_t o0 = - libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element( - ai_bi_aj_bj); - int32_t ai_bj = - libcrux_secrets_int_as_i32_f5(ai) * libcrux_secrets_int_as_i32_f5(bj); - int32_t aj_bi = - libcrux_secrets_int_as_i32_f5(aj) * libcrux_secrets_int_as_i32_f5(bi); - int32_t ai_bj_aj_bi = ai_bj + aj_bi; - int16_t o1 = - libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element( - ai_bj_aj_bi); - out->elements[(size_t)2U * i] = o0; - out->elements[(size_t)2U * i + (size_t)1U] = o1; -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_ntt_multiply( - libcrux_ml_kem_vector_portable_vector_type_PortableVector *lhs, - libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs, - int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) { - int16_t nzeta0 = -zeta0; - int16_t nzeta1 = -zeta1; - int16_t nzeta2 = -zeta2; - int16_t nzeta3 = -zeta3; - libcrux_ml_kem_vector_portable_vector_type_PortableVector out = - libcrux_ml_kem_vector_portable_vector_type_zero(); - libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(zeta0), - (size_t)0U, &out); - libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(nzeta0), - (size_t)1U, &out); - libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(zeta1), - (size_t)2U, &out); - libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(nzeta1), - (size_t)3U, &out); - libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(zeta2), - (size_t)4U, &out); - libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(nzeta2), - (size_t)5U, &out); - libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(zeta3), - (size_t)6U, &out); - libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( - lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(nzeta3), - (size_t)7U, &out); - return out; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_ntt_multiply_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector *lhs, - libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs, - int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) { - return libcrux_ml_kem_vector_portable_ntt_ntt_multiply(lhs, rhs, zeta0, zeta1, - zeta2, zeta3); -} - -static KRML_MUSTINLINE void -libcrux_ml_kem_vector_portable_serialize_serialize_1( - libcrux_ml_kem_vector_portable_vector_type_PortableVector v, - uint8_t ret[2U]) { - uint8_t result0 = - (((((((uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[0U]) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[1U]) << 1U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[2U]) << 2U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[3U]) << 3U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[4U]) << 4U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[5U]) << 5U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[6U]) << 6U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[7U]) << 7U; - uint8_t result1 = - (((((((uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[8U]) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[9U]) << 1U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[10U]) << 2U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[11U]) << 3U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[12U]) << 4U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[13U]) << 5U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[14U]) << 6U) | - (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[15U]) << 7U; - ret[0U] = result0; - ret[1U] = result1; -} - -static inline void libcrux_ml_kem_vector_portable_serialize_1( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - uint8_t ret[2U]) { - uint8_t ret0[2U]; - libcrux_ml_kem_vector_portable_serialize_serialize_1(a, ret0); - libcrux_secrets_int_public_integers_declassify_d8_d4(ret0, ret); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline void libcrux_ml_kem_vector_portable_serialize_1_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - uint8_t ret[2U]) { - libcrux_ml_kem_vector_portable_serialize_1(a, ret); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_serialize_deserialize_1(Eurydice_slice v) { - int16_t result0 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) & 1U); - int16_t result1 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 1U & - 1U); - int16_t result2 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 2U & - 1U); - int16_t result3 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 3U & - 1U); - int16_t result4 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 4U & - 1U); - int16_t result5 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 5U & - 1U); - int16_t result6 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 6U & - 1U); - int16_t result7 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 7U & - 1U); - int16_t result8 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) & 1U); - int16_t result9 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 1U & - 1U); - int16_t result10 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 2U & - 1U); - int16_t result11 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 3U & - 1U); - int16_t result12 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 4U & - 1U); - int16_t result13 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 5U & - 1U); - int16_t result14 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 6U & - 1U); - int16_t result15 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 7U & - 1U); - return ( - KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector){ - .elements = {result0, result1, result2, result3, result4, result5, - result6, result7, result8, result9, result10, result11, - result12, result13, result14, result15}}); -} - -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_deserialize_1(Eurydice_slice a) { - return libcrux_ml_kem_vector_portable_serialize_deserialize_1( - libcrux_secrets_int_classify_public_classify_ref_9b_90(a)); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_deserialize_1_b8(Eurydice_slice a) { - return libcrux_ml_kem_vector_portable_deserialize_1(a); -} - -typedef struct uint8_t_x4_s { - uint8_t fst; - uint8_t snd; - uint8_t thd; - uint8_t f3; -} uint8_t_x4; - -static KRML_MUSTINLINE uint8_t_x4 -libcrux_ml_kem_vector_portable_serialize_serialize_4_int(Eurydice_slice v) { - uint8_t result0 = (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *)) - << 4U | - (uint32_t)libcrux_secrets_int_as_u8_f5(Eurydice_slice_index( - v, (size_t)0U, int16_t, int16_t *)); - uint8_t result1 = (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *)) - << 4U | - (uint32_t)libcrux_secrets_int_as_u8_f5(Eurydice_slice_index( - v, (size_t)2U, int16_t, int16_t *)); - uint8_t result2 = (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)5U, int16_t, int16_t *)) - << 4U | - (uint32_t)libcrux_secrets_int_as_u8_f5(Eurydice_slice_index( - v, (size_t)4U, int16_t, int16_t *)); - uint8_t result3 = (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)7U, int16_t, int16_t *)) - << 4U | - (uint32_t)libcrux_secrets_int_as_u8_f5(Eurydice_slice_index( - v, (size_t)6U, int16_t, int16_t *)); - return (KRML_CLITERAL(uint8_t_x4){ - .fst = result0, .snd = result1, .thd = result2, .f3 = result3}); -} - -static KRML_MUSTINLINE void -libcrux_ml_kem_vector_portable_serialize_serialize_4( - libcrux_ml_kem_vector_portable_vector_type_PortableVector v, - uint8_t ret[8U]) { - uint8_t_x4 result0_3 = - libcrux_ml_kem_vector_portable_serialize_serialize_4_int( - Eurydice_array_to_subslice3(v.elements, (size_t)0U, (size_t)8U, - int16_t *)); - uint8_t_x4 result4_7 = - libcrux_ml_kem_vector_portable_serialize_serialize_4_int( - Eurydice_array_to_subslice3(v.elements, (size_t)8U, (size_t)16U, - int16_t *)); - ret[0U] = result0_3.fst; - ret[1U] = result0_3.snd; - ret[2U] = result0_3.thd; - ret[3U] = result0_3.f3; - ret[4U] = result4_7.fst; - ret[5U] = result4_7.snd; - ret[6U] = result4_7.thd; - ret[7U] = result4_7.f3; -} - -static inline void libcrux_ml_kem_vector_portable_serialize_4( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - uint8_t ret[8U]) { - uint8_t ret0[8U]; - libcrux_ml_kem_vector_portable_serialize_serialize_4(a, ret0); - libcrux_secrets_int_public_integers_declassify_d8_76(ret0, ret); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline void libcrux_ml_kem_vector_portable_serialize_4_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - uint8_t ret[8U]) { - libcrux_ml_kem_vector_portable_serialize_4(a, ret); -} - -static KRML_MUSTINLINE int16_t_x8 -libcrux_ml_kem_vector_portable_serialize_deserialize_4_int( - Eurydice_slice bytes) { - int16_t v0 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *) & - 15U); - int16_t v1 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *) >> - 4U & - 15U); - int16_t v2 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) & - 15U); - int16_t v3 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) >> - 4U & - 15U); - int16_t v4 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) & - 15U); - int16_t v5 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) >> - 4U & - 15U); - int16_t v6 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) & - 15U); - int16_t v7 = libcrux_secrets_int_as_i16_59( - (uint32_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) >> - 4U & - 15U); - return (KRML_CLITERAL(int16_t_x8){.fst = v0, - .snd = v1, - .thd = v2, - .f3 = v3, - .f4 = v4, - .f5 = v5, - .f6 = v6, - .f7 = v7}); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_serialize_deserialize_4(Eurydice_slice bytes) { - int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_4_int( - Eurydice_slice_subslice3(bytes, (size_t)0U, (size_t)4U, uint8_t *)); - int16_t_x8 v8_15 = libcrux_ml_kem_vector_portable_serialize_deserialize_4_int( - Eurydice_slice_subslice3(bytes, (size_t)4U, (size_t)8U, uint8_t *)); - return ( - KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector){ - .elements = {v0_7.fst, v0_7.snd, v0_7.thd, v0_7.f3, v0_7.f4, v0_7.f5, - v0_7.f6, v0_7.f7, v8_15.fst, v8_15.snd, v8_15.thd, - v8_15.f3, v8_15.f4, v8_15.f5, v8_15.f6, v8_15.f7}}); -} - -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_deserialize_4(Eurydice_slice a) { - return libcrux_ml_kem_vector_portable_serialize_deserialize_4( - libcrux_secrets_int_classify_public_classify_ref_9b_90(a)); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_deserialize_4_b8(Eurydice_slice a) { - return libcrux_ml_kem_vector_portable_deserialize_4(a); -} - -typedef struct uint8_t_x5_s { - uint8_t fst; - uint8_t snd; - uint8_t thd; - uint8_t f3; - uint8_t f4; -} uint8_t_x5; - -static KRML_MUSTINLINE uint8_t_x5 -libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_slice v) { - uint8_t r0 = libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) & (int16_t)255); - uint8_t r1 = - (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) & (int16_t)63) - << 2U | - (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) >> 8U & - (int16_t)3); - uint8_t r2 = - (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)2U, int16_t, int16_t *) & (int16_t)15) - << 4U | - (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) >> 6U & - (int16_t)15); - uint8_t r3 = - (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) & (int16_t)3) - << 6U | - (uint32_t)libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)2U, int16_t, int16_t *) >> 4U & - (int16_t)63); - uint8_t r4 = libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) >> 2U & - (int16_t)255); - return (KRML_CLITERAL(uint8_t_x5){ - .fst = r0, .snd = r1, .thd = r2, .f3 = r3, .f4 = r4}); -} - -static KRML_MUSTINLINE void -libcrux_ml_kem_vector_portable_serialize_serialize_10( - libcrux_ml_kem_vector_portable_vector_type_PortableVector v, - uint8_t ret[20U]) { - uint8_t_x5 r0_4 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int( - Eurydice_array_to_subslice3(v.elements, (size_t)0U, (size_t)4U, - int16_t *)); - uint8_t_x5 r5_9 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int( - Eurydice_array_to_subslice3(v.elements, (size_t)4U, (size_t)8U, - int16_t *)); - uint8_t_x5 r10_14 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int( - Eurydice_array_to_subslice3(v.elements, (size_t)8U, (size_t)12U, - int16_t *)); - uint8_t_x5 r15_19 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int( - Eurydice_array_to_subslice3(v.elements, (size_t)12U, (size_t)16U, - int16_t *)); - ret[0U] = r0_4.fst; - ret[1U] = r0_4.snd; - ret[2U] = r0_4.thd; - ret[3U] = r0_4.f3; - ret[4U] = r0_4.f4; - ret[5U] = r5_9.fst; - ret[6U] = r5_9.snd; - ret[7U] = r5_9.thd; - ret[8U] = r5_9.f3; - ret[9U] = r5_9.f4; - ret[10U] = r10_14.fst; - ret[11U] = r10_14.snd; - ret[12U] = r10_14.thd; - ret[13U] = r10_14.f3; - ret[14U] = r10_14.f4; - ret[15U] = r15_19.fst; - ret[16U] = r15_19.snd; - ret[17U] = r15_19.thd; - ret[18U] = r15_19.f3; - ret[19U] = r15_19.f4; -} - -static inline void libcrux_ml_kem_vector_portable_serialize_10( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - uint8_t ret[20U]) { - uint8_t ret0[20U]; - libcrux_ml_kem_vector_portable_serialize_serialize_10(a, ret0); - libcrux_secrets_int_public_integers_declassify_d8_57(ret0, ret); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline void libcrux_ml_kem_vector_portable_serialize_10_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - uint8_t ret[20U]) { - libcrux_ml_kem_vector_portable_serialize_10(a, ret); -} - -static KRML_MUSTINLINE int16_t_x8 -libcrux_ml_kem_vector_portable_serialize_deserialize_10_int( - Eurydice_slice bytes) { - int16_t r0 = libcrux_secrets_int_as_i16_f5( - (libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *)) & - (int16_t)3) - << 8U | - (libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *)) & - (int16_t)255)); - int16_t r1 = libcrux_secrets_int_as_i16_f5( - (libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *)) & - (int16_t)15) - << 6U | - libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *)) >> - 2U); - int16_t r2 = libcrux_secrets_int_as_i16_f5( - (libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *)) & - (int16_t)63) - << 4U | - libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *)) >> - 4U); - int16_t r3 = libcrux_secrets_int_as_i16_f5( - libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)4U, uint8_t, uint8_t *)) - << 2U | - libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *)) >> - 6U); - int16_t r4 = libcrux_secrets_int_as_i16_f5( - (libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *)) & - (int16_t)3) - << 8U | - (libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)5U, uint8_t, uint8_t *)) & - (int16_t)255)); - int16_t r5 = libcrux_secrets_int_as_i16_f5( - (libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *)) & - (int16_t)15) - << 6U | - libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *)) >> - 2U); - int16_t r6 = libcrux_secrets_int_as_i16_f5( - (libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *)) & - (int16_t)63) - << 4U | - libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *)) >> - 4U); - int16_t r7 = libcrux_secrets_int_as_i16_f5( - libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)9U, uint8_t, uint8_t *)) - << 2U | - libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *)) >> - 6U); - return (KRML_CLITERAL(int16_t_x8){.fst = r0, - .snd = r1, - .thd = r2, - .f3 = r3, - .f4 = r4, - .f5 = r5, - .f6 = r6, - .f7 = r7}); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_serialize_deserialize_10(Eurydice_slice bytes) { - int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_10_int( - Eurydice_slice_subslice3(bytes, (size_t)0U, (size_t)10U, uint8_t *)); - int16_t_x8 v8_15 = - libcrux_ml_kem_vector_portable_serialize_deserialize_10_int( - Eurydice_slice_subslice3(bytes, (size_t)10U, (size_t)20U, uint8_t *)); - return ( - KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector){ - .elements = {v0_7.fst, v0_7.snd, v0_7.thd, v0_7.f3, v0_7.f4, v0_7.f5, - v0_7.f6, v0_7.f7, v8_15.fst, v8_15.snd, v8_15.thd, - v8_15.f3, v8_15.f4, v8_15.f5, v8_15.f6, v8_15.f7}}); -} - -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_deserialize_10(Eurydice_slice a) { - return libcrux_ml_kem_vector_portable_serialize_deserialize_10( - libcrux_secrets_int_classify_public_classify_ref_9b_90(a)); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_deserialize_10_b8(Eurydice_slice a) { - return libcrux_ml_kem_vector_portable_deserialize_10(a); -} - -typedef struct uint8_t_x3_s { - uint8_t fst; - uint8_t snd; - uint8_t thd; -} uint8_t_x3; - -static KRML_MUSTINLINE uint8_t_x3 -libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_slice v) { - uint8_t r0 = libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) & (int16_t)255); - uint8_t r1 = libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) >> 8U | - (Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) & (int16_t)15) - << 4U); - uint8_t r2 = libcrux_secrets_int_as_u8_f5( - Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) >> 4U & - (int16_t)255); - return (KRML_CLITERAL(uint8_t_x3){.fst = r0, .snd = r1, .thd = r2}); -} - -static KRML_MUSTINLINE void -libcrux_ml_kem_vector_portable_serialize_serialize_12( - libcrux_ml_kem_vector_portable_vector_type_PortableVector v, - uint8_t ret[24U]) { - uint8_t_x3 r0_2 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( - Eurydice_array_to_subslice3(v.elements, (size_t)0U, (size_t)2U, - int16_t *)); - uint8_t_x3 r3_5 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( - Eurydice_array_to_subslice3(v.elements, (size_t)2U, (size_t)4U, - int16_t *)); - uint8_t_x3 r6_8 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( - Eurydice_array_to_subslice3(v.elements, (size_t)4U, (size_t)6U, - int16_t *)); - uint8_t_x3 r9_11 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( - Eurydice_array_to_subslice3(v.elements, (size_t)6U, (size_t)8U, - int16_t *)); - uint8_t_x3 r12_14 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( - Eurydice_array_to_subslice3(v.elements, (size_t)8U, (size_t)10U, - int16_t *)); - uint8_t_x3 r15_17 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( - Eurydice_array_to_subslice3(v.elements, (size_t)10U, (size_t)12U, - int16_t *)); - uint8_t_x3 r18_20 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( - Eurydice_array_to_subslice3(v.elements, (size_t)12U, (size_t)14U, - int16_t *)); - uint8_t_x3 r21_23 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( - Eurydice_array_to_subslice3(v.elements, (size_t)14U, (size_t)16U, - int16_t *)); - ret[0U] = r0_2.fst; - ret[1U] = r0_2.snd; - ret[2U] = r0_2.thd; - ret[3U] = r3_5.fst; - ret[4U] = r3_5.snd; - ret[5U] = r3_5.thd; - ret[6U] = r6_8.fst; - ret[7U] = r6_8.snd; - ret[8U] = r6_8.thd; - ret[9U] = r9_11.fst; - ret[10U] = r9_11.snd; - ret[11U] = r9_11.thd; - ret[12U] = r12_14.fst; - ret[13U] = r12_14.snd; - ret[14U] = r12_14.thd; - ret[15U] = r15_17.fst; - ret[16U] = r15_17.snd; - ret[17U] = r15_17.thd; - ret[18U] = r18_20.fst; - ret[19U] = r18_20.snd; - ret[20U] = r18_20.thd; - ret[21U] = r21_23.fst; - ret[22U] = r21_23.snd; - ret[23U] = r21_23.thd; -} - -static inline void libcrux_ml_kem_vector_portable_serialize_12( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - uint8_t ret[24U]) { - uint8_t ret0[24U]; - libcrux_ml_kem_vector_portable_serialize_serialize_12(a, ret0); - libcrux_secrets_int_public_integers_declassify_d8_d2(ret0, ret); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline void libcrux_ml_kem_vector_portable_serialize_12_b8( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - uint8_t ret[24U]) { - libcrux_ml_kem_vector_portable_serialize_12(a, ret); -} - -typedef struct int16_t_x2_s { - int16_t fst; - int16_t snd; -} int16_t_x2; - -static KRML_MUSTINLINE int16_t_x2 -libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice bytes) { - int16_t byte0 = libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *)); - int16_t byte1 = libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *)); - int16_t byte2 = libcrux_secrets_int_as_i16_59( - Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *)); - int16_t r0 = (byte1 & (int16_t)15) << 8U | (byte0 & (int16_t)255); - int16_t r1 = byte2 << 4U | (byte1 >> 4U & (int16_t)15); - return (KRML_CLITERAL(int16_t_x2){.fst = r0, .snd = r1}); -} - -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_serialize_deserialize_12(Eurydice_slice bytes) { - int16_t_x2 v0_1 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice_subslice3(bytes, (size_t)0U, (size_t)3U, uint8_t *)); - int16_t_x2 v2_3 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice_subslice3(bytes, (size_t)3U, (size_t)6U, uint8_t *)); - int16_t_x2 v4_5 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice_subslice3(bytes, (size_t)6U, (size_t)9U, uint8_t *)); - int16_t_x2 v6_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice_subslice3(bytes, (size_t)9U, (size_t)12U, uint8_t *)); - int16_t_x2 v8_9 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice_subslice3(bytes, (size_t)12U, (size_t)15U, uint8_t *)); - int16_t_x2 v10_11 = - libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice_subslice3(bytes, (size_t)15U, (size_t)18U, uint8_t *)); - int16_t_x2 v12_13 = - libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice_subslice3(bytes, (size_t)18U, (size_t)21U, uint8_t *)); - int16_t_x2 v14_15 = - libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( - Eurydice_slice_subslice3(bytes, (size_t)21U, (size_t)24U, uint8_t *)); - return ( - KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector){ - .elements = {v0_1.fst, v0_1.snd, v2_3.fst, v2_3.snd, v4_5.fst, - v4_5.snd, v6_7.fst, v6_7.snd, v8_9.fst, v8_9.snd, - v10_11.fst, v10_11.snd, v12_13.fst, v12_13.snd, - v14_15.fst, v14_15.snd}}); -} - -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_deserialize_12(Eurydice_slice a) { - return libcrux_ml_kem_vector_portable_serialize_deserialize_12( - libcrux_secrets_int_classify_public_classify_ref_9b_90(a)); -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_deserialize_12_b8(Eurydice_slice a) { - return libcrux_ml_kem_vector_portable_deserialize_12(a); -} - -static KRML_MUSTINLINE size_t -libcrux_ml_kem_vector_portable_sampling_rej_sample(Eurydice_slice a, - Eurydice_slice result) { - size_t sampled = (size_t)0U; - for (size_t i = (size_t)0U; i < Eurydice_slice_len(a, uint8_t) / (size_t)3U; - i++) { - size_t i0 = i; - int16_t b1 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)0U, - uint8_t, uint8_t *); - int16_t b2 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)1U, - uint8_t, uint8_t *); - int16_t b3 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)2U, - uint8_t, uint8_t *); - int16_t d1 = (b2 & (int16_t)15) << 8U | b1; - int16_t d2 = b3 << 4U | b2 >> 4U; - if (d1 < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS) { - if (sampled < (size_t)16U) { - Eurydice_slice_index(result, sampled, int16_t, int16_t *) = d1; - sampled++; - } - } - if (d2 < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS) { - if (sampled < (size_t)16U) { - Eurydice_slice_index(result, sampled, int16_t, int16_t *) = d2; - sampled++; - } - } - } - return sampled; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -static inline size_t libcrux_ml_kem_vector_portable_rej_sample_b8( - Eurydice_slice a, Eurydice_slice out) { - return libcrux_ml_kem_vector_portable_sampling_rej_sample(a, out); -} - -#define LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR ((size_t)10U) - -#define LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE \ - (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \ - LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR / (size_t)8U) - -#define LIBCRUX_ML_KEM_MLKEM768_RANK ((size_t)3U) - -#define LIBCRUX_ML_KEM_MLKEM768_C1_SIZE \ - (LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE * LIBCRUX_ML_KEM_MLKEM768_RANK) - -#define LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR ((size_t)4U) - -#define LIBCRUX_ML_KEM_MLKEM768_C2_SIZE \ - (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \ - LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR / (size_t)8U) - -#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE \ - (LIBCRUX_ML_KEM_MLKEM768_C1_SIZE + LIBCRUX_ML_KEM_MLKEM768_C2_SIZE) - -#define LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE \ - (LIBCRUX_ML_KEM_MLKEM768_RANK * \ - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \ - LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U) - -#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE \ - (LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE + (size_t)32U) - -#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE \ - (LIBCRUX_ML_KEM_MLKEM768_RANK * \ - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \ - LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U) - -#define LIBCRUX_ML_KEM_MLKEM768_ETA1 ((size_t)2U) - -#define LIBCRUX_ML_KEM_MLKEM768_ETA1_RANDOMNESS_SIZE \ - (LIBCRUX_ML_KEM_MLKEM768_ETA1 * (size_t)64U) - -#define LIBCRUX_ML_KEM_MLKEM768_ETA2 ((size_t)2U) - -#define LIBCRUX_ML_KEM_MLKEM768_ETA2_RANDOMNESS_SIZE \ - (LIBCRUX_ML_KEM_MLKEM768_ETA2 * (size_t)64U) - -#define LIBCRUX_ML_KEM_MLKEM768_IMPLICIT_REJECTION_HASH_INPUT_SIZE \ - (LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE + \ - LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE) - -typedef libcrux_ml_kem_types_MlKemPrivateKey_d9 - libcrux_ml_kem_mlkem768_MlKem768PrivateKey; - -typedef libcrux_ml_kem_types_MlKemPublicKey_30 - libcrux_ml_kem_mlkem768_MlKem768PublicKey; - -#define LIBCRUX_ML_KEM_MLKEM768_RANKED_BYTES_PER_RING_ELEMENT \ - (LIBCRUX_ML_KEM_MLKEM768_RANK * \ - LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U) - -#define LIBCRUX_ML_KEM_MLKEM768_SECRET_KEY_SIZE \ - (LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE + \ - LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE + \ - LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE + \ - LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE) - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.PolynomialRingElement -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector - -*/ -typedef struct libcrux_ml_kem_polynomial_PolynomialRingElement_1d_s { - libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficients[16U]; -} libcrux_ml_kem_polynomial_PolynomialRingElement_1d; - -/** -A monomorphic instance of -libcrux_ml_kem.ind_cpa.unpacked.IndCpaPrivateKeyUnpacked with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- $3size_t -*/ -typedef struct libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0_s { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d secret_as_ntt[3U]; -} libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0; - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.ZERO_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_ZERO_d6_ea(void) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d lit; - libcrux_ml_kem_vector_portable_vector_type_PortableVector - repeat_expression[16U]; - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - repeat_expression[i] = libcrux_ml_kem_vector_portable_ZERO_b8(); - } - memcpy(lit.coefficients, repeat_expression, - (size_t)16U * - sizeof(libcrux_ml_kem_vector_portable_vector_type_PortableVector)); - return lit; -} - -/** -This function found in impl {core::ops::function::FnMut<(usize), -libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@1]> for libcrux_ml_kem::ind_cpa::decrypt::closure[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt.call_mut_0b -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- VECTOR_U_ENCODED_SIZE= 960 -- U_COMPRESSION_FACTOR= 10 -- V_COMPRESSION_FACTOR= 4 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_ind_cpa_decrypt_call_mut_0b_42(void **_, size_t tupled_args) { - return libcrux_ml_kem_polynomial_ZERO_d6_ea(); -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_to_uncompressed_ring_element with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_ea( - Eurydice_slice serialized) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = - libcrux_ml_kem_polynomial_ZERO_d6_ea(); - for (size_t i = (size_t)0U; - i < Eurydice_slice_len(serialized, uint8_t) / (size_t)24U; i++) { - size_t i0 = i; - Eurydice_slice bytes = - Eurydice_slice_subslice3(serialized, i0 * (size_t)24U, - i0 * (size_t)24U + (size_t)24U, uint8_t *); - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_deserialize_12_b8(bytes); - re.coefficients[i0] = uu____0; - } - return re; -} - -/** - Call [`deserialize_to_uncompressed_ring_element`] for each ring element. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_vector -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_deserialize_vector_1b( - Eurydice_slice secret_key, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *secret_as_ntt) { - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 = - libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_ea( - Eurydice_slice_subslice3( - secret_key, - i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, - (i0 + (size_t)1U) * - LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, - uint8_t *)); - secret_as_ntt[i0] = uu____0; - } -} - -/** -This function found in impl {core::ops::function::FnMut<(usize), -libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@1]> for -libcrux_ml_kem::ind_cpa::deserialize_then_decompress_u::closure[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u.call_mut_35 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- U_COMPRESSION_FACTOR= 10 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_call_mut_35_6c( - void **_, size_t tupled_args) { - return libcrux_ml_kem_polynomial_ZERO_d6_ea(); -} - -/** -A monomorphic instance of -libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with -const generics -- COEFFICIENT_BITS= 10 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_ef( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - int32_t decompressed = - libcrux_secrets_int_as_i32_f5(a.elements[i0]) * - libcrux_secrets_int_as_i32_f5( - libcrux_secrets_int_public_integers_classify_27_39( - LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS)); - decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)10); - decompressed = decompressed >> (uint32_t)((int32_t)10 + (int32_t)1); - a.elements[i0] = libcrux_secrets_int_as_i16_36(decompressed); - } - return a; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_b8 with const -generics -- COEFFICIENT_BITS= 10 -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_ef( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_ef( - a); -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_then_decompress_10 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_serialize_deserialize_then_decompress_10_ea( - Eurydice_slice serialized) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = - libcrux_ml_kem_polynomial_ZERO_d6_ea(); - for (size_t i = (size_t)0U; - i < Eurydice_slice_len(serialized, uint8_t) / (size_t)20U; i++) { - size_t i0 = i; - Eurydice_slice bytes = - Eurydice_slice_subslice3(serialized, i0 * (size_t)20U, - i0 * (size_t)20U + (size_t)20U, uint8_t *); - libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = - libcrux_ml_kem_vector_portable_deserialize_10_b8(bytes); - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_ef( - coefficient); - re.coefficients[i0] = uu____0; - } - return re; -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_u with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- COMPRESSION_FACTOR= 10 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_0a( - Eurydice_slice serialized) { - return libcrux_ml_kem_serialize_deserialize_then_decompress_10_ea(serialized); -} - -typedef struct libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2_s { - libcrux_ml_kem_vector_portable_vector_type_PortableVector fst; - libcrux_ml_kem_vector_portable_vector_type_PortableVector snd; -} libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2; - -/** -A monomorphic instance of libcrux_ml_kem.ntt.ntt_layer_int_vec_step -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE - libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 - libcrux_ml_kem_ntt_ntt_layer_int_vec_step_ea( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - libcrux_ml_kem_vector_portable_vector_type_PortableVector b, - int16_t zeta_r) { - libcrux_ml_kem_vector_portable_vector_type_PortableVector t = - libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(b, - zeta_r); - b = libcrux_ml_kem_vector_portable_sub_b8(a, &t); - a = libcrux_ml_kem_vector_portable_add_b8(a, &t); - return (KRML_CLITERAL( - libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){.fst = a, - .snd = b}); -} - -/** -A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_4_plus -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea( - size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, - size_t layer, size_t _initial_coefficient_bound) { - size_t step = (size_t)1U << (uint32_t)layer; - for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) { - size_t round = i0; - zeta_i[0U] = zeta_i[0U] + (size_t)1U; - size_t offset = round * step * (size_t)2U; - size_t offset_vec = offset / (size_t)16U; - size_t step_vec = step / (size_t)16U; - for (size_t i = offset_vec; i < offset_vec + step_vec; i++) { - size_t j = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 uu____0 = - libcrux_ml_kem_ntt_ntt_layer_int_vec_step_ea( - re->coefficients[j], re->coefficients[j + step_vec], - libcrux_ml_kem_polynomial_zeta(zeta_i[0U])); - libcrux_ml_kem_vector_portable_vector_type_PortableVector x = uu____0.fst; - libcrux_ml_kem_vector_portable_vector_type_PortableVector y = uu____0.snd; - re->coefficients[j] = x; - re->coefficients[j + step_vec] = y; - } - } -} - -/** -A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_3 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_3_ea( - size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, - size_t _initial_coefficient_bound) { - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - size_t round = i; - zeta_i[0U] = zeta_i[0U] + (size_t)1U; - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_ntt_layer_3_step_b8( - re->coefficients[round], - libcrux_ml_kem_polynomial_zeta(zeta_i[0U])); - re->coefficients[round] = uu____0; - } -} - -/** -A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_2 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_2_ea( - size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, - size_t _initial_coefficient_bound) { - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - size_t round = i; - zeta_i[0U] = zeta_i[0U] + (size_t)1U; - re->coefficients[round] = - libcrux_ml_kem_vector_portable_ntt_layer_2_step_b8( - re->coefficients[round], libcrux_ml_kem_polynomial_zeta(zeta_i[0U]), - libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)1U)); - zeta_i[0U] = zeta_i[0U] + (size_t)1U; - } -} - -/** -A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_1 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_1_ea( - size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, - size_t _initial_coefficient_bound) { - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - size_t round = i; - zeta_i[0U] = zeta_i[0U] + (size_t)1U; - re->coefficients[round] = - libcrux_ml_kem_vector_portable_ntt_layer_1_step_b8( - re->coefficients[round], libcrux_ml_kem_polynomial_zeta(zeta_i[0U]), - libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)1U), - libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)2U), - libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)3U)); - zeta_i[0U] = zeta_i[0U] + (size_t)3U; - } -} - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.poly_barrett_reduce -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_poly_barrett_reduce_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_barrett_reduce_b8( - myself->coefficients[i0]); - myself->coefficients[i0] = uu____0; - } -} - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.poly_barrett_reduce_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self) { - libcrux_ml_kem_polynomial_poly_barrett_reduce_ea(self); -} - -/** -A monomorphic instance of libcrux_ml_kem.ntt.ntt_vector_u -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- VECTOR_U_COMPRESSION_FACTOR= 10 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_vector_u_0a( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) { - size_t zeta_i = (size_t)0U; - libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)7U, - (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)6U, - (size_t)2U * (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)5U, - (size_t)3U * (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)4U, - (size_t)4U * (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_3_ea(&zeta_i, re, (size_t)5U * (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_2_ea(&zeta_i, re, (size_t)6U * (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_1_ea(&zeta_i, re, (size_t)7U * (size_t)3328U); - libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re); -} - -/** - Call [`deserialize_then_decompress_ring_element_u`] on each ring element - in the `ciphertext`. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- U_COMPRESSION_FACTOR= 10 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_6c( - uint8_t *ciphertext, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d u_as_ntt[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - u_as_ntt[i] = - libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_call_mut_35_6c( - &lvalue, i); - } - for (size_t i = (size_t)0U; - i < Eurydice_slice_len( - Eurydice_array_to_slice((size_t)1088U, ciphertext, uint8_t), - uint8_t) / - (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * - (size_t)10U / (size_t)8U); - i++) { - size_t i0 = i; - Eurydice_slice u_bytes = Eurydice_array_to_subslice3( - ciphertext, - i0 * (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * - (size_t)10U / (size_t)8U), - i0 * (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * - (size_t)10U / (size_t)8U) + - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * - (size_t)10U / (size_t)8U, - uint8_t *); - u_as_ntt[i0] = - libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_0a( - u_bytes); - libcrux_ml_kem_ntt_ntt_vector_u_0a(&u_as_ntt[i0]); - } - memcpy( - ret, u_as_ntt, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); -} - -/** -A monomorphic instance of -libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with -const generics -- COEFFICIENT_BITS= 4 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_d1( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - int32_t decompressed = - libcrux_secrets_int_as_i32_f5(a.elements[i0]) * - libcrux_secrets_int_as_i32_f5( - libcrux_secrets_int_public_integers_classify_27_39( - LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS)); - decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)4); - decompressed = decompressed >> (uint32_t)((int32_t)4 + (int32_t)1); - a.elements[i0] = libcrux_secrets_int_as_i16_36(decompressed); - } - return a; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_b8 with const -generics -- COEFFICIENT_BITS= 4 -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_d1( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_d1( - a); -} - -/** -A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_4 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_serialize_deserialize_then_decompress_4_ea( - Eurydice_slice serialized) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = - libcrux_ml_kem_polynomial_ZERO_d6_ea(); - for (size_t i = (size_t)0U; - i < Eurydice_slice_len(serialized, uint8_t) / (size_t)8U; i++) { - size_t i0 = i; - Eurydice_slice bytes = Eurydice_slice_subslice3( - serialized, i0 * (size_t)8U, i0 * (size_t)8U + (size_t)8U, uint8_t *); - libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = - libcrux_ml_kem_vector_portable_deserialize_4_b8(bytes); - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_d1( - coefficient); - re.coefficients[i0] = uu____0; - } - return re; -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_v with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- COMPRESSION_FACTOR= 4 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_89( - Eurydice_slice serialized) { - return libcrux_ml_kem_serialize_deserialize_then_decompress_4_ea(serialized); -} - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.ZERO -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_ZERO_ea(void) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d lit; - libcrux_ml_kem_vector_portable_vector_type_PortableVector - repeat_expression[16U]; - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - repeat_expression[i] = libcrux_ml_kem_vector_portable_ZERO_b8(); - } - memcpy(lit.coefficients, repeat_expression, - (size_t)16U * - sizeof(libcrux_ml_kem_vector_portable_vector_type_PortableVector)); - return lit; -} - -/** - Given two `KyberPolynomialRingElement`s in their NTT representations, - compute their product. Given two polynomials in the NTT domain `f^` and `ĵ`, - the `iᵗʰ` coefficient of the product `k̂` is determined by the calculation: - - ```plaintext - ĥ[2·i] + ĥ[2·i + 1]X = (f^[2·i] + f^[2·i + 1]X)·(ĝ[2·i] + ĝ[2·i + 1]X) mod (X² - - ζ^(2·BitRev₇(i) + 1)) - ``` - - This function almost implements Algorithm 10 of the - NIST FIPS 203 standard, which is reproduced below: - - ```plaintext - Input: Two arrays fˆ ∈ ℤ₂₅₆ and ĝ ∈ ℤ₂₅₆. - Output: An array ĥ ∈ ℤq. - - for(i ← 0; i < 128; i++) - (ĥ[2i], ĥ[2i+1]) ← BaseCaseMultiply(fˆ[2i], fˆ[2i+1], ĝ[2i], ĝ[2i+1], - ζ^(2·BitRev₇(i) + 1)) end for return ĥ - ``` - We say "almost" because the coefficients of the ring element output by - this function are in the Montgomery domain. - - The NIST FIPS 203 standard can be found at - . -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.ntt_multiply -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_ntt_multiply_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *rhs) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d out = - libcrux_ml_kem_polynomial_ZERO_ea(); - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_ntt_multiply_b8( - &myself->coefficients[i0], &rhs->coefficients[i0], - libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0), - libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 + - (size_t)1U), - libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 + - (size_t)2U), - libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 + - (size_t)3U)); - out.coefficients[i0] = uu____0; - } - return out; -} - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.ntt_multiply_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_ntt_multiply_d6_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *rhs) { - return libcrux_ml_kem_polynomial_ntt_multiply_ea(self, rhs); -} - -/** - Given two polynomial ring elements `lhs` and `rhs`, compute the pointwise - sum of their constituent coefficients. -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.add_to_ring_element -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_to_ring_element_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *rhs) { - for (size_t i = (size_t)0U; - i < Eurydice_slice_len( - Eurydice_array_to_slice( - (size_t)16U, myself->coefficients, - libcrux_ml_kem_vector_portable_vector_type_PortableVector), - libcrux_ml_kem_vector_portable_vector_type_PortableVector); - i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_add_b8(myself->coefficients[i0], - &rhs->coefficients[i0]); - myself->coefficients[i0] = uu____0; - } -} - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.add_to_ring_element_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *rhs) { - libcrux_ml_kem_polynomial_add_to_ring_element_1b(self, rhs); -} - -/** -A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_1 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_ea( - size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) { - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - size_t round = i; - zeta_i[0U] = zeta_i[0U] - (size_t)1U; - re->coefficients[round] = - libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_b8( - re->coefficients[round], libcrux_ml_kem_polynomial_zeta(zeta_i[0U]), - libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)1U), - libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)2U), - libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)3U)); - zeta_i[0U] = zeta_i[0U] - (size_t)3U; - } -} - -/** -A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_2 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_ea( - size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) { - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - size_t round = i; - zeta_i[0U] = zeta_i[0U] - (size_t)1U; - re->coefficients[round] = - libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_b8( - re->coefficients[round], libcrux_ml_kem_polynomial_zeta(zeta_i[0U]), - libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)1U)); - zeta_i[0U] = zeta_i[0U] - (size_t)1U; - } -} - -/** -A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_3 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_ea( - size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) { - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - size_t round = i; - zeta_i[0U] = zeta_i[0U] - (size_t)1U; - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_b8( - re->coefficients[round], - libcrux_ml_kem_polynomial_zeta(zeta_i[0U])); - re->coefficients[round] = uu____0; - } -} - -/** -A monomorphic instance of -libcrux_ml_kem.invert_ntt.inv_ntt_layer_int_vec_step_reduce with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics - -*/ -static KRML_MUSTINLINE - libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 - libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_ea( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a, - libcrux_ml_kem_vector_portable_vector_type_PortableVector b, - int16_t zeta_r) { - libcrux_ml_kem_vector_portable_vector_type_PortableVector a_minus_b = - libcrux_ml_kem_vector_portable_sub_b8(b, &a); - a = libcrux_ml_kem_vector_portable_barrett_reduce_b8( - libcrux_ml_kem_vector_portable_add_b8(a, &b)); - b = libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8( - a_minus_b, zeta_r); - return (KRML_CLITERAL( - libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){.fst = a, - .snd = b}); -} - -/** -A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_4_plus -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea( - size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, - size_t layer) { - size_t step = (size_t)1U << (uint32_t)layer; - for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) { - size_t round = i0; - zeta_i[0U] = zeta_i[0U] - (size_t)1U; - size_t offset = round * step * (size_t)2U; - size_t offset_vec = - offset / LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; - size_t step_vec = - step / LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; - for (size_t i = offset_vec; i < offset_vec + step_vec; i++) { - size_t j = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 uu____0 = - libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_ea( - re->coefficients[j], re->coefficients[j + step_vec], - libcrux_ml_kem_polynomial_zeta(zeta_i[0U])); - libcrux_ml_kem_vector_portable_vector_type_PortableVector x = uu____0.fst; - libcrux_ml_kem_vector_portable_vector_type_PortableVector y = uu____0.snd; - re->coefficients[j] = x; - re->coefficients[j + step_vec] = y; - } - } -} - -/** -A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_montgomery -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) { - size_t zeta_i = - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / (size_t)2U; - libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_ea(&zeta_i, re); - libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_ea(&zeta_i, re); - libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_ea(&zeta_i, re); - libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re, - (size_t)4U); - libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re, - (size_t)5U); - libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re, - (size_t)6U); - libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re, - (size_t)7U); - libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re); -} - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.subtract_reduce -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_subtract_reduce_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d b) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector - coefficient_normal_form = - libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8( - b.coefficients[i0], (int16_t)1441); - libcrux_ml_kem_vector_portable_vector_type_PortableVector diff = - libcrux_ml_kem_vector_portable_sub_b8(myself->coefficients[i0], - &coefficient_normal_form); - libcrux_ml_kem_vector_portable_vector_type_PortableVector red = - libcrux_ml_kem_vector_portable_barrett_reduce_b8(diff); - b.coefficients[i0] = red; - } - return b; -} - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.subtract_reduce_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_subtract_reduce_d6_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d b) { - return libcrux_ml_kem_polynomial_subtract_reduce_ea(self, b); -} - -/** - The following functions compute various expressions involving - vectors and matrices. The computation of these expressions has been - abstracted away into these functions in order to save on loop iterations. - Compute v − InverseNTT(sᵀ ◦ NTT(u)) -*/ -/** -A monomorphic instance of libcrux_ml_kem.matrix.compute_message -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_matrix_compute_message_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *v, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *secret_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *u_as_ntt) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d result = - libcrux_ml_kem_polynomial_ZERO_d6_ea(); - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d product = - libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(&secret_as_ntt[i0], - &u_as_ntt[i0]); - libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(&result, &product); - } - libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b(&result); - return libcrux_ml_kem_polynomial_subtract_reduce_d6_ea(v, result); -} - -/** -A monomorphic instance of libcrux_ml_kem.serialize.to_unsigned_field_modulus -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - return libcrux_ml_kem_vector_portable_to_unsigned_representative_b8(a); -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.compress_then_serialize_message with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics - -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_serialize_compress_then_serialize_message_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re, uint8_t ret[32U]) { - uint8_t serialized[32U] = {0U}; - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = - libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea( - re.coefficients[i0]); - libcrux_ml_kem_vector_portable_vector_type_PortableVector - coefficient_compressed = - libcrux_ml_kem_vector_portable_compress_1_b8(coefficient); - uint8_t bytes[2U]; - libcrux_ml_kem_vector_portable_serialize_1_b8(coefficient_compressed, - bytes); - Eurydice_slice_copy( - Eurydice_array_to_subslice3(serialized, (size_t)2U * i0, - (size_t)2U * i0 + (size_t)2U, uint8_t *), - Eurydice_array_to_slice((size_t)2U, bytes, uint8_t), uint8_t); - } - memcpy(ret, serialized, (size_t)32U * sizeof(uint8_t)); -} - -/** - This function implements Algorithm 14 of the - NIST FIPS 203 specification; this is the Kyber CPA-PKE decryption algorithm. - - Algorithm 14 is reproduced below: - - ```plaintext - Input: decryption key dkₚₖₑ ∈ 𝔹^{384k}. - Input: ciphertext c ∈ 𝔹^{32(dᵤk + dᵥ)}. - Output: message m ∈ 𝔹^{32}. - - c₁ ← c[0 : 32dᵤk] - c₂ ← c[32dᵤk : 32(dᵤk + dᵥ)] - u ← Decompress_{dᵤ}(ByteDecode_{dᵤ}(c₁)) - v ← Decompress_{dᵥ}(ByteDecode_{dᵥ}(c₂)) - ŝ ← ByteDecode₁₂(dkₚₖₑ) - w ← v - NTT-¹(ŝᵀ ◦ NTT(u)) - m ← ByteEncode₁(Compress₁(w)) - return m - ``` - - The NIST FIPS 203 standard can be found at - . -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt_unpacked -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- VECTOR_U_ENCODED_SIZE= 960 -- U_COMPRESSION_FACTOR= 10 -- V_COMPRESSION_FACTOR= 4 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_decrypt_unpacked_42( - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 *secret_key, - uint8_t *ciphertext, uint8_t ret[32U]) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d u_as_ntt[3U]; - libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_6c(ciphertext, u_as_ntt); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d v = - libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_89( - Eurydice_array_to_subslice_from((size_t)1088U, ciphertext, - (size_t)960U, uint8_t, size_t, - uint8_t[])); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d message = - libcrux_ml_kem_matrix_compute_message_1b(&v, secret_key->secret_as_ntt, - u_as_ntt); - uint8_t ret0[32U]; - libcrux_ml_kem_serialize_compress_then_serialize_message_ea(message, ret0); - memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t)); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- VECTOR_U_ENCODED_SIZE= 960 -- U_COMPRESSION_FACTOR= 10 -- V_COMPRESSION_FACTOR= 4 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_decrypt_42( - Eurydice_slice secret_key, uint8_t *ciphertext, uint8_t ret[32U]) { - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 - secret_key_unpacked; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret0[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - ret0[i] = libcrux_ml_kem_ind_cpa_decrypt_call_mut_0b_42(&lvalue, i); - } - memcpy( - secret_key_unpacked.secret_as_ntt, ret0, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - libcrux_ml_kem_ind_cpa_deserialize_vector_1b( - secret_key, secret_key_unpacked.secret_as_ntt); - uint8_t ret1[32U]; - libcrux_ml_kem_ind_cpa_decrypt_unpacked_42(&secret_key_unpacked, ciphertext, - ret1); - memcpy(ret, ret1, (size_t)32U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_ml_kem::hash_functions::Hash for -libcrux_ml_kem::hash_functions::portable::PortableHash} -*/ -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.G_4a -with const generics -- K= 3 -*/ -static inline void libcrux_ml_kem_hash_functions_portable_G_4a_e0( - Eurydice_slice input, uint8_t ret[64U]) { - libcrux_ml_kem_hash_functions_portable_G(input, ret); -} - -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF -with const generics -- LEN= 32 -*/ -static inline void libcrux_ml_kem_hash_functions_portable_PRF_9e( - Eurydice_slice input, uint8_t ret[32U]) { - uint8_t digest[32U] = {0U}; - libcrux_sha3_portable_shake256( - Eurydice_array_to_slice((size_t)32U, digest, uint8_t), input); - memcpy(ret, digest, (size_t)32U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_ml_kem::hash_functions::Hash for -libcrux_ml_kem::hash_functions::portable::PortableHash} -*/ -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_4a -with const generics -- K= 3 -- LEN= 32 -*/ -static inline void libcrux_ml_kem_hash_functions_portable_PRF_4a_41( - Eurydice_slice input, uint8_t ret[32U]) { - libcrux_ml_kem_hash_functions_portable_PRF_9e(input, ret); -} - -/** -A monomorphic instance of -libcrux_ml_kem.ind_cpa.unpacked.IndCpaPublicKeyUnpacked with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- $3size_t -*/ -typedef struct libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0_s { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d t_as_ntt[3U]; - uint8_t seed_for_A[32U]; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d A[3U][3U]; -} libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0; - -/** -This function found in impl {core::default::Default for -libcrux_ml_kem::ind_cpa::unpacked::IndCpaPublicKeyUnpacked[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.default_8b -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static inline libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 -libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b(void) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - uu____0[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea(); - } - uint8_t uu____1[32U] = {0U}; - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 lit; - memcpy( - lit.t_as_ntt, uu____0, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - memcpy(lit.seed_for_A, uu____1, (size_t)32U * sizeof(uint8_t)); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d repeat_expression0[3U][3U]; - for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d repeat_expression[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - repeat_expression[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea(); - } - memcpy(repeat_expression0[i0], repeat_expression, - (size_t)3U * - sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - } - memcpy(lit.A, repeat_expression0, - (size_t)3U * - sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U])); - return lit; -} - -/** - Only use with public values. - - This MUST NOT be used with secret inputs, like its caller - `deserialize_ring_elements_reduced`. -*/ -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_to_reduced_ring_element with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_ea( - Eurydice_slice serialized) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = - libcrux_ml_kem_polynomial_ZERO_d6_ea(); - for (size_t i = (size_t)0U; - i < Eurydice_slice_len(serialized, uint8_t) / (size_t)24U; i++) { - size_t i0 = i; - Eurydice_slice bytes = - Eurydice_slice_subslice3(serialized, i0 * (size_t)24U, - i0 * (size_t)24U + (size_t)24U, uint8_t *); - libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = - libcrux_ml_kem_vector_portable_deserialize_12_b8(bytes); - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_cond_subtract_3329_b8(coefficient); - re.coefficients[i0] = uu____0; - } - return re; -} - -/** - See [deserialize_ring_elements_reduced_out]. -*/ -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_ring_elements_reduced with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b( - Eurydice_slice public_key, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *deserialized_pk) { - for (size_t i = (size_t)0U; - i < Eurydice_slice_len(public_key, uint8_t) / - LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT; - i++) { - size_t i0 = i; - Eurydice_slice ring_element = Eurydice_slice_subslice3( - public_key, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, - i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT + - LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, - uint8_t *); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 = - libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_ea( - ring_element); - deserialized_pk[i0] = uu____0; - } -} - -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PortableHash -with const generics -- $3size_t -*/ -typedef struct libcrux_ml_kem_hash_functions_portable_PortableHash_88_s { - libcrux_sha3_generic_keccak_KeccakState_17 shake128_state[3U]; -} libcrux_ml_kem_hash_functions_portable_PortableHash_88; - -/** -A monomorphic instance of -libcrux_ml_kem.hash_functions.portable.shake128_init_absorb_final with const -generics -- K= 3 -*/ -static inline libcrux_ml_kem_hash_functions_portable_PortableHash_88 -libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_e0( - uint8_t (*input)[34U]) { - libcrux_ml_kem_hash_functions_portable_PortableHash_88 shake128_state; - libcrux_sha3_generic_keccak_KeccakState_17 repeat_expression[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - repeat_expression[i] = libcrux_sha3_portable_incremental_shake128_init(); - } - memcpy(shake128_state.shake128_state, repeat_expression, - (size_t)3U * sizeof(libcrux_sha3_generic_keccak_KeccakState_17)); - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_sha3_portable_incremental_shake128_absorb_final( - &shake128_state.shake128_state[i0], - Eurydice_array_to_slice((size_t)34U, input[i0], uint8_t)); - } - return shake128_state; -} - -/** -This function found in impl {libcrux_ml_kem::hash_functions::Hash for -libcrux_ml_kem::hash_functions::portable::PortableHash} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.hash_functions.portable.shake128_init_absorb_final_4a with const -generics -- K= 3 -*/ -static inline libcrux_ml_kem_hash_functions_portable_PortableHash_88 -libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_4a_e0( - uint8_t (*input)[34U]) { - return libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_e0( - input); -} - -/** -A monomorphic instance of -libcrux_ml_kem.hash_functions.portable.shake128_squeeze_first_three_blocks with -const generics -- K= 3 -*/ -static inline void -libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_e0( - libcrux_ml_kem_hash_functions_portable_PortableHash_88 *st, - uint8_t ret[3U][504U]) { - uint8_t out[3U][504U] = {{0U}}; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks( - &st->shake128_state[i0], - Eurydice_array_to_slice((size_t)504U, out[i0], uint8_t)); - } - memcpy(ret, out, (size_t)3U * sizeof(uint8_t[504U])); -} - -/** -This function found in impl {libcrux_ml_kem::hash_functions::Hash for -libcrux_ml_kem::hash_functions::portable::PortableHash} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.hash_functions.portable.shake128_squeeze_first_three_blocks_4a -with const generics -- K= 3 -*/ -static inline void -libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_4a_e0( - libcrux_ml_kem_hash_functions_portable_PortableHash_88 *self, - uint8_t ret[3U][504U]) { - libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_e0( - self, ret); -} - -/** - If `bytes` contains a set of uniformly random bytes, this function - uniformly samples a ring element `â` that is treated as being the NTT - representation of the corresponding polynomial `a`. - - Since rejection sampling is used, it is possible the supplied bytes are - not enough to sample the element, in which case an `Err` is returned and the - caller must try again with a fresh set of bytes. - - This function partially implements Algorithm - 6 of the NIST FIPS 203 standard, We say "partially" because this - implementation only accepts a finite set of bytes as input and returns an error - if the set is not enough; Algorithm 6 of the FIPS 203 standard on the other - hand samples from an infinite stream of bytes until the ring element is filled. - Algorithm 6 is reproduced below: - - ```plaintext - Input: byte stream B ∈ 𝔹*. - Output: array â ∈ ℤ₂₅₆. - - i ← 0 - j ← 0 - while j < 256 do - d₁ ← B[i] + 256·(B[i+1] mod 16) - d₂ ← ⌊B[i+1]/16⌋ + 16·B[i+2] - if d₁ < q then - â[j] ← d₁ - j ← j + 1 - end if - if d₂ < q and j < 256 then - â[j] ← d₂ - j ← j + 1 - end if - i ← i + 3 - end while - return â - ``` - - The NIST FIPS 203 standard can be found at - . -*/ -/** -A monomorphic instance of -libcrux_ml_kem.sampling.sample_from_uniform_distribution_next with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- N= 504 -*/ -static KRML_MUSTINLINE bool -libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_89( - uint8_t (*randomness)[504U], size_t *sampled_coefficients, - int16_t (*out)[272U]) { - for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) { - size_t i1 = i0; - for (size_t i = (size_t)0U; i < (size_t)504U / (size_t)24U; i++) { - size_t r = i; - if (sampled_coefficients[i1] < - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) { - size_t sampled = libcrux_ml_kem_vector_portable_rej_sample_b8( - Eurydice_array_to_subslice3(randomness[i1], r * (size_t)24U, - r * (size_t)24U + (size_t)24U, - uint8_t *), - Eurydice_array_to_subslice3(out[i1], sampled_coefficients[i1], - sampled_coefficients[i1] + (size_t)16U, - int16_t *)); - size_t uu____0 = i1; - sampled_coefficients[uu____0] = sampled_coefficients[uu____0] + sampled; - } - } - } - bool done = true; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - if (sampled_coefficients[i0] >= - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) { - sampled_coefficients[i0] = - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT; - } else { - done = false; - } - } - return done; -} - -/** -A monomorphic instance of -libcrux_ml_kem.hash_functions.portable.shake128_squeeze_next_block with const -generics -- K= 3 -*/ -static inline void -libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_e0( - libcrux_ml_kem_hash_functions_portable_PortableHash_88 *st, - uint8_t ret[3U][168U]) { - uint8_t out[3U][168U] = {{0U}}; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_sha3_portable_incremental_shake128_squeeze_next_block( - &st->shake128_state[i0], - Eurydice_array_to_slice((size_t)168U, out[i0], uint8_t)); - } - memcpy(ret, out, (size_t)3U * sizeof(uint8_t[168U])); -} - -/** -This function found in impl {libcrux_ml_kem::hash_functions::Hash for -libcrux_ml_kem::hash_functions::portable::PortableHash} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.hash_functions.portable.shake128_squeeze_next_block_4a with const -generics -- K= 3 -*/ -static inline void -libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_4a_e0( - libcrux_ml_kem_hash_functions_portable_PortableHash_88 *self, - uint8_t ret[3U][168U]) { - libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_e0(self, - ret); -} - -/** - If `bytes` contains a set of uniformly random bytes, this function - uniformly samples a ring element `â` that is treated as being the NTT - representation of the corresponding polynomial `a`. - - Since rejection sampling is used, it is possible the supplied bytes are - not enough to sample the element, in which case an `Err` is returned and the - caller must try again with a fresh set of bytes. - - This function partially implements Algorithm - 6 of the NIST FIPS 203 standard, We say "partially" because this - implementation only accepts a finite set of bytes as input and returns an error - if the set is not enough; Algorithm 6 of the FIPS 203 standard on the other - hand samples from an infinite stream of bytes until the ring element is filled. - Algorithm 6 is reproduced below: - - ```plaintext - Input: byte stream B ∈ 𝔹*. - Output: array â ∈ ℤ₂₅₆. - - i ← 0 - j ← 0 - while j < 256 do - d₁ ← B[i] + 256·(B[i+1] mod 16) - d₂ ← ⌊B[i+1]/16⌋ + 16·B[i+2] - if d₁ < q then - â[j] ← d₁ - j ← j + 1 - end if - if d₂ < q and j < 256 then - â[j] ← d₂ - j ← j + 1 - end if - i ← i + 3 - end while - return â - ``` - - The NIST FIPS 203 standard can be found at - . -*/ -/** -A monomorphic instance of -libcrux_ml_kem.sampling.sample_from_uniform_distribution_next with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- N= 168 -*/ -static KRML_MUSTINLINE bool -libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_890( - uint8_t (*randomness)[168U], size_t *sampled_coefficients, - int16_t (*out)[272U]) { - for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) { - size_t i1 = i0; - for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)24U; i++) { - size_t r = i; - if (sampled_coefficients[i1] < - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) { - size_t sampled = libcrux_ml_kem_vector_portable_rej_sample_b8( - Eurydice_array_to_subslice3(randomness[i1], r * (size_t)24U, - r * (size_t)24U + (size_t)24U, - uint8_t *), - Eurydice_array_to_subslice3(out[i1], sampled_coefficients[i1], - sampled_coefficients[i1] + (size_t)16U, - int16_t *)); - size_t uu____0 = i1; - sampled_coefficients[uu____0] = sampled_coefficients[uu____0] + sampled; - } - } - } - bool done = true; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - if (sampled_coefficients[i0] >= - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) { - sampled_coefficients[i0] = - LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT; - } else { - done = false; - } - } - return done; -} - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.from_i16_array -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_from_i16_array_ea(Eurydice_slice a) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d result = - libcrux_ml_kem_polynomial_ZERO_ea(); - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_from_i16_array_b8( - Eurydice_slice_subslice3(a, i0 * (size_t)16U, - (i0 + (size_t)1U) * (size_t)16U, - int16_t *)); - result.coefficients[i0] = uu____0; - } - return result; -} - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.from_i16_array_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_from_i16_array_d6_ea(Eurydice_slice a) { - return libcrux_ml_kem_polynomial_from_i16_array_ea(a); -} - -/** -This function found in impl {core::ops::function::FnMut<(@Array), -libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@2]> for libcrux_ml_kem::sampling::sample_from_xof::closure[TraitClause@0, TraitClause@1, TraitClause@2, TraitClause@3]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof.call_mut_e7 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_sampling_sample_from_xof_call_mut_e7_2b( - void **_, int16_t tupled_args[272U]) { - int16_t s[272U]; - memcpy(s, tupled_args, (size_t)272U * sizeof(int16_t)); - return libcrux_ml_kem_polynomial_from_i16_array_d6_ea( - Eurydice_array_to_subslice3(s, (size_t)0U, (size_t)256U, int16_t *)); -} - -/** -A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_sampling_sample_from_xof_2b( - uint8_t (*seeds)[34U], - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) { - size_t sampled_coefficients[3U] = {0U}; - int16_t out[3U][272U] = {{0U}}; - libcrux_ml_kem_hash_functions_portable_PortableHash_88 xof_state = - libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_4a_e0( - seeds); - uint8_t randomness0[3U][504U]; - libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_4a_e0( - &xof_state, randomness0); - bool done = libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_89( - randomness0, sampled_coefficients, out); - while (true) { - if (done) { - break; - } else { - uint8_t randomness[3U][168U]; - libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_4a_e0( - &xof_state, randomness); - done = libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_890( - randomness, sampled_coefficients, out); - } - } - /* Passing arrays by value in Rust generates a copy in C */ - int16_t copy_of_out[3U][272U]; - memcpy(copy_of_out, out, (size_t)3U * sizeof(int16_t[272U])); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret0[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - ret0[i] = libcrux_ml_kem_sampling_sample_from_xof_call_mut_e7_2b( - &lvalue, copy_of_out[i]); - } - memcpy( - ret, ret0, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); -} - -/** -A monomorphic instance of libcrux_ml_kem.matrix.sample_matrix_A -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_matrix_sample_matrix_A_2b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d (*A_transpose)[3U], - uint8_t *seed, bool transpose) { - for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) { - size_t i1 = i0; - uint8_t seeds[3U][34U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - core_array__core__clone__Clone_for__Array_T__N___clone( - (size_t)34U, seed, seeds[i], uint8_t, void *); - } - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t j = i; - seeds[j][32U] = (uint8_t)i1; - seeds[j][33U] = (uint8_t)j; - } - libcrux_ml_kem_polynomial_PolynomialRingElement_1d sampled[3U]; - libcrux_ml_kem_sampling_sample_from_xof_2b(seeds, sampled); - for (size_t i = (size_t)0U; - i < Eurydice_slice_len( - Eurydice_array_to_slice( - (size_t)3U, sampled, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d), - libcrux_ml_kem_polynomial_PolynomialRingElement_1d); - i++) { - size_t j = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d sample = sampled[j]; - if (transpose) { - A_transpose[j][i1] = sample; - } else { - A_transpose[i1][j] = sample; - } - } - } -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.build_unpacked_public_key_mut -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- T_AS_NTT_ENCODED_SIZE= 1152 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_3f( - Eurydice_slice public_key, - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 - *unpacked_public_key) { - Eurydice_slice uu____0 = Eurydice_slice_subslice_to( - public_key, (size_t)1152U, uint8_t, size_t, uint8_t[]); - libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b( - uu____0, unpacked_public_key->t_as_ntt); - Eurydice_slice seed = Eurydice_slice_subslice_from( - public_key, (size_t)1152U, uint8_t, size_t, uint8_t[]); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d(*uu____1)[3U] = - unpacked_public_key->A; - uint8_t ret[34U]; - libcrux_ml_kem_utils_into_padded_array_b6(seed, ret); - libcrux_ml_kem_matrix_sample_matrix_A_2b(uu____1, ret, false); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.build_unpacked_public_key -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- T_AS_NTT_ENCODED_SIZE= 1152 -*/ -static KRML_MUSTINLINE - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 - libcrux_ml_kem_ind_cpa_build_unpacked_public_key_3f( - Eurydice_slice public_key) { - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 - unpacked_public_key = libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b(); - libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_3f(public_key, - &unpacked_public_key); - return unpacked_public_key; -} - -/** -A monomorphic instance of K. -with types libcrux_ml_kem_polynomial_PolynomialRingElement -libcrux_ml_kem_vector_portable_vector_type_PortableVector[3size_t], -libcrux_ml_kem_polynomial_PolynomialRingElement -libcrux_ml_kem_vector_portable_vector_type_PortableVector - -*/ -typedef struct tuple_ed_s { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d fst[3U]; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d snd; -} tuple_ed; - -/** -This function found in impl {core::ops::function::FnMut<(usize), -libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@2]> for libcrux_ml_kem::ind_cpa::encrypt_c1::closure[TraitClause@0, TraitClause@1, TraitClause@2, -TraitClause@3]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1.call_mut_f1 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- C1_LEN= 960 -- U_COMPRESSION_FACTOR= 10 -- BLOCK_LEN= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_f1_85(void **_, size_t tupled_args) { - return libcrux_ml_kem_polynomial_ZERO_d6_ea(); -} - -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN -with const generics -- K= 3 -- LEN= 128 -*/ -static inline void libcrux_ml_kem_hash_functions_portable_PRFxN_41( - uint8_t (*input)[33U], uint8_t ret[3U][128U]) { - uint8_t out[3U][128U] = {{0U}}; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_sha3_portable_shake256( - Eurydice_array_to_slice((size_t)128U, out[i0], uint8_t), - Eurydice_array_to_slice((size_t)33U, input[i0], uint8_t)); - } - memcpy(ret, out, (size_t)3U * sizeof(uint8_t[128U])); -} - -/** -This function found in impl {libcrux_ml_kem::hash_functions::Hash for -libcrux_ml_kem::hash_functions::portable::PortableHash} -*/ -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN_4a -with const generics -- K= 3 -- LEN= 128 -*/ -static inline void libcrux_ml_kem_hash_functions_portable_PRFxN_4a_41( - uint8_t (*input)[33U], uint8_t ret[3U][128U]) { - libcrux_ml_kem_hash_functions_portable_PRFxN_41(input, ret); -} - -/** - Given a series of uniformly random bytes in `randomness`, for some number - `eta`, the `sample_from_binomial_distribution_{eta}` functions sample a ring - element from a binomial distribution centered at 0 that uses two sets of `eta` - coin flips. If, for example, `eta = ETA`, each ring coefficient is a value `v` - such such that `v ∈ {-ETA, -ETA + 1, ..., 0, ..., ETA + 1, ETA}` and: - - ```plaintext - - If v < 0, Pr[v] = Pr[-v] - - If v >= 0, Pr[v] = BINOMIAL_COEFFICIENT(2 * ETA; ETA - v) / 2 ^ (2 * ETA) - ``` - - The values `v < 0` are mapped to the appropriate `KyberFieldElement`. - - The expected value is: - - ```plaintext - E[X] = (-ETA)Pr[-ETA] + (-(ETA - 1))Pr[-(ETA - 1)] + ... + (ETA - 1)Pr[ETA - 1] - + (ETA)Pr[ETA] = 0 since Pr[-v] = Pr[v] when v < 0. - ``` - - And the variance is: - - ```plaintext - Var(X) = E[(X - E[X])^2] - = E[X^2] - = sum_(v=-ETA to ETA)v^2 * (BINOMIAL_COEFFICIENT(2 * ETA; ETA - v) / - 2^(2 * ETA)) = ETA / 2 - ``` - - This function implements Algorithm 7 of the NIST FIPS 203 - standard, which is reproduced below: - - ```plaintext - Input: byte array B ∈ 𝔹^{64η}. - Output: array f ∈ ℤ₂₅₆. - - b ← BytesToBits(B) - for (i ← 0; i < 256; i++) - x ← ∑(j=0 to η - 1) b[2iη + j] - y ← ∑(j=0 to η - 1) b[2iη + η + j] - f[i] ← x−y mod q - end for - return f - ``` - - The NIST FIPS 203 standard can be found at - . -*/ -/** -A monomorphic instance of -libcrux_ml_kem.sampling.sample_from_binomial_distribution_2 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_ea( - Eurydice_slice randomness) { - int16_t sampled_i16s[256U] = {0U}; - for (size_t i0 = (size_t)0U; - i0 < Eurydice_slice_len(randomness, uint8_t) / (size_t)4U; i0++) { - size_t chunk_number = i0; - Eurydice_slice byte_chunk = Eurydice_slice_subslice3( - randomness, chunk_number * (size_t)4U, - chunk_number * (size_t)4U + (size_t)4U, uint8_t *); - uint32_t random_bits_as_u32 = - (((uint32_t)Eurydice_slice_index(byte_chunk, (size_t)0U, uint8_t, - uint8_t *) | - (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)1U, uint8_t, - uint8_t *) - << 8U) | - (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)2U, uint8_t, - uint8_t *) - << 16U) | - (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)3U, uint8_t, - uint8_t *) - << 24U; - uint32_t even_bits = random_bits_as_u32 & 1431655765U; - uint32_t odd_bits = random_bits_as_u32 >> 1U & 1431655765U; - uint32_t coin_toss_outcomes = even_bits + odd_bits; - for (uint32_t i = 0U; i < 32U / 4U; i++) { - uint32_t outcome_set = i; - uint32_t outcome_set0 = outcome_set * 4U; - int16_t outcome_1 = - (int16_t)(coin_toss_outcomes >> (uint32_t)outcome_set0 & 3U); - int16_t outcome_2 = - (int16_t)(coin_toss_outcomes >> (uint32_t)(outcome_set0 + 2U) & 3U); - size_t offset = (size_t)(outcome_set0 >> 2U); - sampled_i16s[(size_t)8U * chunk_number + offset] = outcome_1 - outcome_2; - } - } - return libcrux_ml_kem_polynomial_from_i16_array_d6_ea( - Eurydice_array_to_slice((size_t)256U, sampled_i16s, int16_t)); -} - -/** -A monomorphic instance of -libcrux_ml_kem.sampling.sample_from_binomial_distribution with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- ETA= 2 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0( - Eurydice_slice randomness) { - return libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_ea( - randomness); -} - -/** -A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_7 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_7_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) { - size_t step = LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT / (size_t)2U; - for (size_t i = (size_t)0U; i < step; i++) { - size_t j = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector t = - libcrux_ml_kem_vector_portable_multiply_by_constant_b8( - re->coefficients[j + step], (int16_t)-1600); - re->coefficients[j + step] = - libcrux_ml_kem_vector_portable_sub_b8(re->coefficients[j], &t); - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____1 = - libcrux_ml_kem_vector_portable_add_b8(re->coefficients[j], &t); - re->coefficients[j] = uu____1; - } -} - -/** -A monomorphic instance of libcrux_ml_kem.ntt.ntt_binomially_sampled_ring_element -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) { - libcrux_ml_kem_ntt_ntt_at_layer_7_ea(re); - size_t zeta_i = (size_t)1U; - libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)6U, - (size_t)11207U); - libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)5U, - (size_t)11207U + (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea( - &zeta_i, re, (size_t)4U, (size_t)11207U + (size_t)2U * (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_3_ea( - &zeta_i, re, (size_t)11207U + (size_t)3U * (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_2_ea( - &zeta_i, re, (size_t)11207U + (size_t)4U * (size_t)3328U); - libcrux_ml_kem_ntt_ntt_at_layer_1_ea( - &zeta_i, re, (size_t)11207U + (size_t)5U * (size_t)3328U); - libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re); -} - -/** - Sample a vector of ring elements from a centered binomial distribution and - convert them into their NTT representations. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_vector_cbd_then_ntt -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- ETA= 2 -- ETA_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE uint8_t -libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re_as_ntt, - uint8_t *prf_input, uint8_t domain_separator) { - uint8_t prf_inputs[3U][33U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - core_array__core__clone__Clone_for__Array_T__N___clone( - (size_t)33U, prf_input, prf_inputs[i], uint8_t, void *); - } - domain_separator = - libcrux_ml_kem_utils_prf_input_inc_e0(prf_inputs, domain_separator); - uint8_t prf_outputs[3U][128U]; - libcrux_ml_kem_hash_functions_portable_PRFxN_4a_41(prf_inputs, prf_outputs); - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - re_as_ntt[i0] = - libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0( - Eurydice_array_to_slice((size_t)128U, prf_outputs[i0], uint8_t)); - libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_ea(&re_as_ntt[i0]); - } - return domain_separator; -} - -/** -This function found in impl {core::ops::function::FnMut<(usize), -libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@2]> for libcrux_ml_kem::ind_cpa::encrypt_c1::closure#1[TraitClause@0, TraitClause@1, TraitClause@2, -TraitClause@3]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1.call_mut_dd -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- C1_LEN= 960 -- U_COMPRESSION_FACTOR= 10 -- BLOCK_LEN= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_dd_85(void **_, size_t tupled_args) { - return libcrux_ml_kem_polynomial_ZERO_d6_ea(); -} - -/** - Sample a vector of ring elements from a centered binomial distribution. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_ring_element_cbd -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- ETA2_RANDOMNESS_SIZE= 128 -- ETA2= 2 -*/ -static KRML_MUSTINLINE uint8_t -libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_3b( - uint8_t *prf_input, uint8_t domain_separator, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_1) { - uint8_t prf_inputs[3U][33U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - core_array__core__clone__Clone_for__Array_T__N___clone( - (size_t)33U, prf_input, prf_inputs[i], uint8_t, void *); - } - domain_separator = - libcrux_ml_kem_utils_prf_input_inc_e0(prf_inputs, domain_separator); - uint8_t prf_outputs[3U][128U]; - libcrux_ml_kem_hash_functions_portable_PRFxN_4a_41(prf_inputs, prf_outputs); - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 = - libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0( - Eurydice_array_to_slice((size_t)128U, prf_outputs[i0], uint8_t)); - error_1[i0] = uu____0; - } - return domain_separator; -} - -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF -with const generics -- LEN= 128 -*/ -static inline void libcrux_ml_kem_hash_functions_portable_PRF_a6( - Eurydice_slice input, uint8_t ret[128U]) { - uint8_t digest[128U] = {0U}; - libcrux_sha3_portable_shake256( - Eurydice_array_to_slice((size_t)128U, digest, uint8_t), input); - memcpy(ret, digest, (size_t)128U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_ml_kem::hash_functions::Hash for -libcrux_ml_kem::hash_functions::portable::PortableHash} -*/ -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_4a -with const generics -- K= 3 -- LEN= 128 -*/ -static inline void libcrux_ml_kem_hash_functions_portable_PRF_4a_410( - Eurydice_slice input, uint8_t ret[128U]) { - libcrux_ml_kem_hash_functions_portable_PRF_a6(input, ret); -} - -/** -This function found in impl {core::ops::function::FnMut<(usize), -libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@1]> for libcrux_ml_kem::matrix::compute_vector_u::closure[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u.call_mut_a8 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_matrix_compute_vector_u_call_mut_a8_1b(void **_, - size_t tupled_args) { - return libcrux_ml_kem_polynomial_ZERO_d6_ea(); -} - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.add_error_reduce -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_error_reduce_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t j = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector - coefficient_normal_form = - libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8( - myself->coefficients[j], (int16_t)1441); - libcrux_ml_kem_vector_portable_vector_type_PortableVector sum = - libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form, - &error->coefficients[j]); - libcrux_ml_kem_vector_portable_vector_type_PortableVector red = - libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum); - myself->coefficients[j] = red; - } -} - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.add_error_reduce_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_error_reduce_d6_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error) { - libcrux_ml_kem_polynomial_add_error_reduce_ea(self, error); -} - -/** - Compute u := InvertNTT(Aᵀ ◦ r̂) + e₁ -*/ -/** -A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_matrix_compute_vector_u_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d (*a_as_ntt)[3U], - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *r_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_1, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d result[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - result[i] = - libcrux_ml_kem_matrix_compute_vector_u_call_mut_a8_1b(&lvalue, i); - } - for (size_t i0 = (size_t)0U; - i0 < Eurydice_slice_len( - Eurydice_array_to_slice( - (size_t)3U, a_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]), - libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]); - i0++) { - size_t i1 = i0; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *row = a_as_ntt[i1]; - for (size_t i = (size_t)0U; - i < Eurydice_slice_len( - Eurydice_array_to_slice( - (size_t)3U, row, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d), - libcrux_ml_kem_polynomial_PolynomialRingElement_1d); - i++) { - size_t j = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *a_element = &row[j]; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d product = - libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(a_element, &r_as_ntt[j]); - libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(&result[i1], - &product); - } - libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b(&result[i1]); - libcrux_ml_kem_polynomial_add_error_reduce_d6_ea(&result[i1], &error_1[i1]); - } - memcpy( - ret, result, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); -} - -/** -A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress -with const generics -- COEFFICIENT_BITS= 10 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_compress_ef( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - int16_t uu____0 = libcrux_secrets_int_as_i16_f5( - libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient( - (uint8_t)(int32_t)10, - libcrux_secrets_int_as_u16_f5(a.elements[i0]))); - a.elements[i0] = uu____0; - } - return a; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -/** -A monomorphic instance of libcrux_ml_kem.vector.portable.compress_b8 -with const generics -- COEFFICIENT_BITS= 10 -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_b8_ef( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - return libcrux_ml_kem_vector_portable_compress_compress_ef(a); -} - -/** -A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_10 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- OUT_LEN= 320 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_serialize_compress_then_serialize_10_ff( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, uint8_t ret[320U]) { - uint8_t serialized[320U] = {0U}; - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = - libcrux_ml_kem_vector_portable_compress_b8_ef( - libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea( - re->coefficients[i0])); - uint8_t bytes[20U]; - libcrux_ml_kem_vector_portable_serialize_10_b8(coefficient, bytes); - Eurydice_slice_copy( - Eurydice_array_to_subslice3(serialized, (size_t)20U * i0, - (size_t)20U * i0 + (size_t)20U, uint8_t *), - Eurydice_array_to_slice((size_t)20U, bytes, uint8_t), uint8_t); - } - memcpy(ret, serialized, (size_t)320U * sizeof(uint8_t)); -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.compress_then_serialize_ring_element_u with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- COMPRESSION_FACTOR= 10 -- OUT_LEN= 320 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_fe( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, uint8_t ret[320U]) { - uint8_t uu____0[320U]; - libcrux_ml_kem_serialize_compress_then_serialize_10_ff(re, uu____0); - memcpy(ret, uu____0, (size_t)320U * sizeof(uint8_t)); -} - -/** - Call [`compress_then_serialize_ring_element_u`] on each ring element. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.compress_then_serialize_u -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- OUT_LEN= 960 -- COMPRESSION_FACTOR= 10 -- BLOCK_LEN= 320 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_compress_then_serialize_u_43( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d input[3U], - Eurydice_slice out) { - for (size_t i = (size_t)0U; - i < Eurydice_slice_len( - Eurydice_array_to_slice( - (size_t)3U, input, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d), - libcrux_ml_kem_polynomial_PolynomialRingElement_1d); - i++) { - size_t i0 = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = input[i0]; - Eurydice_slice uu____0 = Eurydice_slice_subslice3( - out, i0 * ((size_t)960U / (size_t)3U), - (i0 + (size_t)1U) * ((size_t)960U / (size_t)3U), uint8_t *); - uint8_t ret[320U]; - libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_fe(&re, - ret); - Eurydice_slice_copy( - uu____0, Eurydice_array_to_slice((size_t)320U, ret, uint8_t), uint8_t); - } -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- C1_LEN= 960 -- U_COMPRESSION_FACTOR= 10 -- BLOCK_LEN= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE tuple_ed libcrux_ml_kem_ind_cpa_encrypt_c1_85( - Eurydice_slice randomness, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d (*matrix)[3U], - Eurydice_slice ciphertext) { - uint8_t prf_input[33U]; - libcrux_ml_kem_utils_into_padded_array_c8(randomness, prf_input); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d r_as_ntt[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - r_as_ntt[i] = libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_f1_85(&lvalue, i); - } - uint8_t domain_separator0 = - libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b(r_as_ntt, prf_input, - 0U); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d error_1[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - error_1[i] = libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_dd_85(&lvalue, i); - } - uint8_t domain_separator = libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_3b( - prf_input, domain_separator0, error_1); - prf_input[32U] = domain_separator; - uint8_t prf_output[128U]; - libcrux_ml_kem_hash_functions_portable_PRF_4a_410( - Eurydice_array_to_slice((size_t)33U, prf_input, uint8_t), prf_output); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d error_2 = - libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0( - Eurydice_array_to_slice((size_t)128U, prf_output, uint8_t)); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d u[3U]; - libcrux_ml_kem_matrix_compute_vector_u_1b(matrix, r_as_ntt, error_1, u); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0[3U]; - memcpy( - uu____0, u, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - libcrux_ml_kem_ind_cpa_compress_then_serialize_u_43(uu____0, ciphertext); - /* Passing arrays by value in Rust generates a copy in C */ - libcrux_ml_kem_polynomial_PolynomialRingElement_1d copy_of_r_as_ntt[3U]; - memcpy( - copy_of_r_as_ntt, r_as_ntt, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - tuple_ed lit; - memcpy( - lit.fst, copy_of_r_as_ntt, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - lit.snd = error_2; - return lit; -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_then_decompress_message with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_serialize_deserialize_then_decompress_message_ea( - uint8_t *serialized) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = - libcrux_ml_kem_polynomial_ZERO_d6_ea(); - for (size_t i = (size_t)0U; i < (size_t)16U; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector - coefficient_compressed = - libcrux_ml_kem_vector_portable_deserialize_1_b8( - Eurydice_array_to_subslice3(serialized, (size_t)2U * i0, - (size_t)2U * i0 + (size_t)2U, - uint8_t *)); - libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = - libcrux_ml_kem_vector_portable_decompress_1_b8(coefficient_compressed); - re.coefficients[i0] = uu____0; - } - return re; -} - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.add_message_error_reduce -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_add_message_error_reduce_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *message, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d result) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector - coefficient_normal_form = - libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8( - result.coefficients[i0], (int16_t)1441); - libcrux_ml_kem_vector_portable_vector_type_PortableVector sum1 = - libcrux_ml_kem_vector_portable_add_b8(myself->coefficients[i0], - &message->coefficients[i0]); - libcrux_ml_kem_vector_portable_vector_type_PortableVector sum2 = - libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form, &sum1); - libcrux_ml_kem_vector_portable_vector_type_PortableVector red = - libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum2); - result.coefficients[i0] = red; - } - return result; -} - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.add_message_error_reduce_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_add_message_error_reduce_d6_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *message, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d result) { - return libcrux_ml_kem_polynomial_add_message_error_reduce_ea(self, message, - result); -} - -/** - Compute InverseNTT(tᵀ ◦ r̂) + e₂ + message -*/ -/** -A monomorphic instance of libcrux_ml_kem.matrix.compute_ring_element_v -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_matrix_compute_ring_element_v_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *r_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_2, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *message) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d result = - libcrux_ml_kem_polynomial_ZERO_d6_ea(); - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d product = - libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(&t_as_ntt[i0], - &r_as_ntt[i0]); - libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(&result, &product); - } - libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b(&result); - return libcrux_ml_kem_polynomial_add_message_error_reduce_d6_ea( - error_2, message, result); -} - -/** -A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress -with const generics -- COEFFICIENT_BITS= 4 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_compress_d1( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { - size_t i0 = i; - int16_t uu____0 = libcrux_secrets_int_as_i16_f5( - libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient( - (uint8_t)(int32_t)4, - libcrux_secrets_int_as_u16_f5(a.elements[i0]))); - a.elements[i0] = uu____0; - } - return a; -} - -/** -This function found in impl {libcrux_ml_kem::vector::traits::Operations for -libcrux_ml_kem::vector::portable::vector_type::PortableVector} -*/ -/** -A monomorphic instance of libcrux_ml_kem.vector.portable.compress_b8 -with const generics -- COEFFICIENT_BITS= 4 -*/ -static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_vector_portable_compress_b8_d1( - libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { - return libcrux_ml_kem_vector_portable_compress_compress_d1(a); -} - -/** -A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_4 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_serialize_compress_then_serialize_4_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re, - Eurydice_slice serialized) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = - libcrux_ml_kem_vector_portable_compress_b8_d1( - libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea( - re.coefficients[i0])); - uint8_t bytes[8U]; - libcrux_ml_kem_vector_portable_serialize_4_b8(coefficient, bytes); - Eurydice_slice_copy( - Eurydice_slice_subslice3(serialized, (size_t)8U * i0, - (size_t)8U * i0 + (size_t)8U, uint8_t *), - Eurydice_array_to_slice((size_t)8U, bytes, uint8_t), uint8_t); - } -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.compress_then_serialize_ring_element_v with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- COMPRESSION_FACTOR= 4 -- OUT_LEN= 128 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_6c( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re, Eurydice_slice out) { - libcrux_ml_kem_serialize_compress_then_serialize_4_ea(re, out); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c2 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- V_COMPRESSION_FACTOR= 4 -- C2_LEN= 128 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_encrypt_c2_6c( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *r_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_2, - uint8_t *message, Eurydice_slice ciphertext) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d message_as_ring_element = - libcrux_ml_kem_serialize_deserialize_then_decompress_message_ea(message); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d v = - libcrux_ml_kem_matrix_compute_ring_element_v_1b( - t_as_ntt, r_as_ntt, error_2, &message_as_ring_element); - libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_6c( - v, ciphertext); -} - -/** - This function implements Algorithm 13 of the - NIST FIPS 203 specification; this is the Kyber CPA-PKE encryption algorithm. - - Algorithm 13 is reproduced below: - - ```plaintext - Input: encryption key ekₚₖₑ ∈ 𝔹^{384k+32}. - Input: message m ∈ 𝔹^{32}. - Input: encryption randomness r ∈ 𝔹^{32}. - Output: ciphertext c ∈ 𝔹^{32(dᵤk + dᵥ)}. - - N ← 0 - t̂ ← ByteDecode₁₂(ekₚₖₑ[0:384k]) - ρ ← ekₚₖₑ[384k: 384k + 32] - for (i ← 0; i < k; i++) - for(j ← 0; j < k; j++) - Â[i,j] ← SampleNTT(XOF(ρ, i, j)) - end for - end for - for(i ← 0; i < k; i++) - r[i] ← SamplePolyCBD_{η₁}(PRF_{η₁}(r,N)) - N ← N + 1 - end for - for(i ← 0; i < k; i++) - e₁[i] ← SamplePolyCBD_{η₂}(PRF_{η₂}(r,N)) - N ← N + 1 - end for - e₂ ← SamplePolyCBD_{η₂}(PRF_{η₂}(r,N)) - r̂ ← NTT(r) - u ← NTT-¹(Âᵀ ◦ r̂) + e₁ - μ ← Decompress₁(ByteDecode₁(m))) - v ← NTT-¹(t̂ᵀ ◦ rˆ) + e₂ + μ - c₁ ← ByteEncode_{dᵤ}(Compress_{dᵤ}(u)) - c₂ ← ByteEncode_{dᵥ}(Compress_{dᵥ}(v)) - return c ← (c₁ ‖ c₂) - ``` - - The NIST FIPS 203 standard can be found at - . -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_unpacked -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_LEN= 960 -- C2_LEN= 128 -- U_COMPRESSION_FACTOR= 10 -- V_COMPRESSION_FACTOR= 4 -- BLOCK_LEN= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a( - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 *public_key, - uint8_t *message, Eurydice_slice randomness, uint8_t ret[1088U]) { - uint8_t ciphertext[1088U] = {0U}; - tuple_ed uu____0 = libcrux_ml_kem_ind_cpa_encrypt_c1_85( - randomness, public_key->A, - Eurydice_array_to_subslice3(ciphertext, (size_t)0U, (size_t)960U, - uint8_t *)); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d r_as_ntt[3U]; - memcpy( - r_as_ntt, uu____0.fst, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d error_2 = uu____0.snd; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *uu____1 = - public_key->t_as_ntt; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *uu____2 = r_as_ntt; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *uu____3 = &error_2; - uint8_t *uu____4 = message; - libcrux_ml_kem_ind_cpa_encrypt_c2_6c( - uu____1, uu____2, uu____3, uu____4, - Eurydice_array_to_subslice_from((size_t)1088U, ciphertext, (size_t)960U, - uint8_t, size_t, uint8_t[])); - memcpy(ret, ciphertext, (size_t)1088U * sizeof(uint8_t)); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_LEN= 960 -- C2_LEN= 128 -- U_COMPRESSION_FACTOR= 10 -- V_COMPRESSION_FACTOR= 4 -- BLOCK_LEN= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_encrypt_2a( - Eurydice_slice public_key, uint8_t *message, Eurydice_slice randomness, - uint8_t ret[1088U]) { - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 - unpacked_public_key = - libcrux_ml_kem_ind_cpa_build_unpacked_public_key_3f(public_key); - uint8_t ret0[1088U]; - libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a(&unpacked_public_key, message, - randomness, ret0); - memcpy(ret, ret0, (size_t)1088U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_ml_kem::variant::Variant for -libcrux_ml_kem::variant::MlKem} -*/ -/** -A monomorphic instance of libcrux_ml_kem.variant.kdf_39 -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] -with const generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_variant_kdf_39_d6( - Eurydice_slice shared_secret, uint8_t *_, uint8_t ret[32U]) { - uint8_t out[32U] = {0U}; - Eurydice_slice_copy(Eurydice_array_to_slice((size_t)32U, out, uint8_t), - shared_secret, uint8_t); - memcpy(ret, out, (size_t)32U * sizeof(uint8_t)); -} - -/** - This code verifies on some machines, runs out of memory on others -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.decapsulate -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], -libcrux_ml_kem_variant_MlKem with const generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -- CPA_SECRET_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -- CIPHERTEXT_SIZE= 1088 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_SIZE= 960 -- C2_SIZE= 128 -- VECTOR_U_COMPRESSION_FACTOR= 10 -- VECTOR_V_COMPRESSION_FACTOR= 4 -- C1_BLOCK_SIZE= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_decapsulate_62( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { - Eurydice_slice_uint8_t_x4 uu____0 = - libcrux_ml_kem_types_unpack_private_key_b4( - Eurydice_array_to_slice((size_t)2400U, private_key->value, uint8_t)); - Eurydice_slice ind_cpa_secret_key = uu____0.fst; - Eurydice_slice ind_cpa_public_key = uu____0.snd; - Eurydice_slice ind_cpa_public_key_hash = uu____0.thd; - Eurydice_slice implicit_rejection_value = uu____0.f3; - uint8_t decrypted[32U]; - libcrux_ml_kem_ind_cpa_decrypt_42(ind_cpa_secret_key, ciphertext->value, - decrypted); - uint8_t to_hash0[64U]; - libcrux_ml_kem_utils_into_padded_array_24( - Eurydice_array_to_slice((size_t)32U, decrypted, uint8_t), to_hash0); - Eurydice_slice_copy( - Eurydice_array_to_subslice_from( - (size_t)64U, to_hash0, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, - uint8_t, size_t, uint8_t[]), - ind_cpa_public_key_hash, uint8_t); - uint8_t hashed[64U]; - libcrux_ml_kem_hash_functions_portable_G_4a_e0( - Eurydice_array_to_slice((size_t)64U, to_hash0, uint8_t), hashed); - Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at( - Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), - LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t, - Eurydice_slice_uint8_t_x2); - Eurydice_slice shared_secret0 = uu____1.fst; - Eurydice_slice pseudorandomness = uu____1.snd; - uint8_t to_hash[1120U]; - libcrux_ml_kem_utils_into_padded_array_15(implicit_rejection_value, to_hash); - Eurydice_slice uu____2 = Eurydice_array_to_subslice_from( - (size_t)1120U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, - uint8_t, size_t, uint8_t[]); - Eurydice_slice_copy(uu____2, libcrux_ml_kem_types_as_ref_d3_80(ciphertext), - uint8_t); - uint8_t implicit_rejection_shared_secret0[32U]; - libcrux_ml_kem_hash_functions_portable_PRF_4a_41( - Eurydice_array_to_slice((size_t)1120U, to_hash, uint8_t), - implicit_rejection_shared_secret0); - uint8_t expected_ciphertext[1088U]; - libcrux_ml_kem_ind_cpa_encrypt_2a(ind_cpa_public_key, decrypted, - pseudorandomness, expected_ciphertext); - uint8_t implicit_rejection_shared_secret[32U]; - libcrux_ml_kem_variant_kdf_39_d6( - Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret0, - uint8_t), - libcrux_ml_kem_types_as_slice_a9_80(ciphertext), - implicit_rejection_shared_secret); - uint8_t shared_secret[32U]; - libcrux_ml_kem_variant_kdf_39_d6( - shared_secret0, libcrux_ml_kem_types_as_slice_a9_80(ciphertext), - shared_secret); - uint8_t ret0[32U]; - libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time( - libcrux_ml_kem_types_as_ref_d3_80(ciphertext), - Eurydice_array_to_slice((size_t)1088U, expected_ciphertext, uint8_t), - Eurydice_array_to_slice((size_t)32U, shared_secret, uint8_t), - Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret, - uint8_t), - ret0); - memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t)); -} - -/** - Portable decapsulate -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.decapsulate with const generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -- CPA_SECRET_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -- CIPHERTEXT_SIZE= 1088 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_SIZE= 960 -- C2_SIZE= 128 -- VECTOR_U_COMPRESSION_FACTOR= 10 -- VECTOR_V_COMPRESSION_FACTOR= 4 -- C1_BLOCK_SIZE= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 -*/ -static inline void -libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_35( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { - libcrux_ml_kem_ind_cca_decapsulate_62(private_key, ciphertext, ret); -} - -/** - Decapsulate ML-KEM 768 - - Generates an [`MlKemSharedSecret`]. - The input is a reference to an [`MlKem768PrivateKey`] and an - [`MlKem768Ciphertext`]. -*/ -static inline void libcrux_ml_kem_mlkem768_portable_decapsulate( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { - libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_35( - private_key, ciphertext, ret); -} - -/** -This function found in impl {libcrux_ml_kem::variant::Variant for -libcrux_ml_kem::variant::MlKem} -*/ -/** -A monomorphic instance of libcrux_ml_kem.variant.entropy_preprocess_39 -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_variant_entropy_preprocess_39_9c( - Eurydice_slice randomness, uint8_t ret[32U]) { - uint8_t out[32U] = {0U}; - Eurydice_slice_copy(Eurydice_array_to_slice((size_t)32U, out, uint8_t), - randomness, uint8_t); - memcpy(ret, out, (size_t)32U * sizeof(uint8_t)); -} - -/** -This function found in impl {libcrux_ml_kem::hash_functions::Hash for -libcrux_ml_kem::hash_functions::portable::PortableHash} -*/ -/** -A monomorphic instance of libcrux_ml_kem.hash_functions.portable.H_4a -with const generics -- K= 3 -*/ -static inline void libcrux_ml_kem_hash_functions_portable_H_4a_e0( - Eurydice_slice input, uint8_t ret[32U]) { - libcrux_ml_kem_hash_functions_portable_H(input, ret); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.encapsulate -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], -libcrux_ml_kem_variant_MlKem with const generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- PUBLIC_KEY_SIZE= 1184 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_SIZE= 960 -- C2_SIZE= 128 -- VECTOR_U_COMPRESSION_FACTOR= 10 -- VECTOR_V_COMPRESSION_FACTOR= 4 -- C1_BLOCK_SIZE= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE tuple_c2 libcrux_ml_kem_ind_cca_encapsulate_ca( - libcrux_ml_kem_types_MlKemPublicKey_30 *public_key, uint8_t *randomness) { - uint8_t randomness0[32U]; - libcrux_ml_kem_variant_entropy_preprocess_39_9c( - Eurydice_array_to_slice((size_t)32U, randomness, uint8_t), randomness0); - uint8_t to_hash[64U]; - libcrux_ml_kem_utils_into_padded_array_24( - Eurydice_array_to_slice((size_t)32U, randomness0, uint8_t), to_hash); - Eurydice_slice uu____0 = Eurydice_array_to_subslice_from( - (size_t)64U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t, - size_t, uint8_t[]); - uint8_t ret0[32U]; - libcrux_ml_kem_hash_functions_portable_H_4a_e0( - Eurydice_array_to_slice((size_t)1184U, - libcrux_ml_kem_types_as_slice_e6_d0(public_key), - uint8_t), - ret0); - Eurydice_slice_copy( - uu____0, Eurydice_array_to_slice((size_t)32U, ret0, uint8_t), uint8_t); - uint8_t hashed[64U]; - libcrux_ml_kem_hash_functions_portable_G_4a_e0( - Eurydice_array_to_slice((size_t)64U, to_hash, uint8_t), hashed); - Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at( - Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), - LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t, - Eurydice_slice_uint8_t_x2); - Eurydice_slice shared_secret = uu____1.fst; - Eurydice_slice pseudorandomness = uu____1.snd; - uint8_t ciphertext[1088U]; - libcrux_ml_kem_ind_cpa_encrypt_2a( - Eurydice_array_to_slice((size_t)1184U, - libcrux_ml_kem_types_as_slice_e6_d0(public_key), - uint8_t), - randomness0, pseudorandomness, ciphertext); - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_ciphertext[1088U]; - memcpy(copy_of_ciphertext, ciphertext, (size_t)1088U * sizeof(uint8_t)); - tuple_c2 lit; - lit.fst = libcrux_ml_kem_types_from_e0_80(copy_of_ciphertext); - uint8_t ret[32U]; - libcrux_ml_kem_variant_kdf_39_d6(shared_secret, ciphertext, ret); - memcpy(lit.snd, ret, (size_t)32U * sizeof(uint8_t)); - return lit; -} - -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.encapsulate with const generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- PUBLIC_KEY_SIZE= 1184 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_SIZE= 960 -- C2_SIZE= 128 -- VECTOR_U_COMPRESSION_FACTOR= 10 -- VECTOR_V_COMPRESSION_FACTOR= 4 -- C1_BLOCK_SIZE= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static inline tuple_c2 -libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_cd( - libcrux_ml_kem_types_MlKemPublicKey_30 *public_key, uint8_t *randomness) { - return libcrux_ml_kem_ind_cca_encapsulate_ca(public_key, randomness); -} - -/** - Encapsulate ML-KEM 768 - - Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple. - The input is a reference to an [`MlKem768PublicKey`] and [`SHARED_SECRET_SIZE`] - bytes of `randomness`. -*/ -static inline tuple_c2 libcrux_ml_kem_mlkem768_portable_encapsulate( - libcrux_ml_kem_types_MlKemPublicKey_30 *public_key, - uint8_t randomness[32U]) { - return libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_cd( - public_key, randomness); -} - -/** -This function found in impl {core::default::Default for -libcrux_ml_kem::ind_cpa::unpacked::IndCpaPrivateKeyUnpacked[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.default_70 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static inline libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 -libcrux_ml_kem_ind_cpa_unpacked_default_70_1b(void) { - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 lit; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d repeat_expression[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - repeat_expression[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea(); - } - memcpy( - lit.secret_as_ntt, repeat_expression, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - return lit; -} - -/** -This function found in impl {libcrux_ml_kem::variant::Variant for -libcrux_ml_kem::variant::MlKem} -*/ -/** -A monomorphic instance of libcrux_ml_kem.variant.cpa_keygen_seed_39 -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_variant_cpa_keygen_seed_39_9c( - Eurydice_slice key_generation_seed, uint8_t ret[64U]) { - uint8_t seed[33U] = {0U}; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - seed, (size_t)0U, - LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t *), - key_generation_seed, uint8_t); - seed[LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE] = - (uint8_t)(size_t)3U; - uint8_t ret0[64U]; - libcrux_ml_kem_hash_functions_portable_G_4a_e0( - Eurydice_array_to_slice((size_t)33U, seed, uint8_t), ret0); - memcpy(ret, ret0, (size_t)64U * sizeof(uint8_t)); -} - -/** -This function found in impl {core::ops::function::FnMut<(usize), -libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@3]> for -libcrux_ml_kem::ind_cpa::generate_keypair_unpacked::closure[TraitClause@0, TraitClause@1, -TraitClause@2, TraitClause@3, TraitClause@4, TraitClause@5]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cpa.generate_keypair_unpacked.call_mut_73 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], -libcrux_ml_kem_variant_MlKem with const generics -- K= 3 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_call_mut_73_1c( - void **_, size_t tupled_args) { - return libcrux_ml_kem_polynomial_ZERO_d6_ea(); -} - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.to_standard_domain -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector -libcrux_ml_kem_polynomial_to_standard_domain_ea( - libcrux_ml_kem_vector_portable_vector_type_PortableVector vector) { - return libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8( - vector, - LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS); -} - -/** -A monomorphic instance of libcrux_ml_kem.polynomial.add_standard_error_reduce -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_polynomial_add_standard_error_reduce_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error) { - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t j = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector - coefficient_normal_form = - libcrux_ml_kem_polynomial_to_standard_domain_ea( - myself->coefficients[j]); - libcrux_ml_kem_vector_portable_vector_type_PortableVector sum = - libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form, - &error->coefficients[j]); - libcrux_ml_kem_vector_portable_vector_type_PortableVector red = - libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum); - myself->coefficients[j] = red; - } -} - -/** -This function found in impl -{libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.add_standard_error_reduce_d6 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_polynomial_add_standard_error_reduce_d6_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error) { - libcrux_ml_kem_polynomial_add_standard_error_reduce_ea(self, error); -} - -/** - Compute  ◦ ŝ + ê -*/ -/** -A monomorphic instance of libcrux_ml_kem.matrix.compute_As_plus_e -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_matrix_compute_As_plus_e_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d (*matrix_A)[3U], - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *s_as_ntt, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_as_ntt) { - for (size_t i = (size_t)0U; - i < Eurydice_slice_len( - Eurydice_array_to_slice( - (size_t)3U, matrix_A, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]), - libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]); - i++) { - size_t i0 = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *row = matrix_A[i0]; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 = - libcrux_ml_kem_polynomial_ZERO_d6_ea(); - t_as_ntt[i0] = uu____0; - for (size_t i1 = (size_t)0U; - i1 < Eurydice_slice_len( - Eurydice_array_to_slice( - (size_t)3U, row, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d), - libcrux_ml_kem_polynomial_PolynomialRingElement_1d); - i1++) { - size_t j = i1; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *matrix_element = - &row[j]; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d product = - libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(matrix_element, - &s_as_ntt[j]); - libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(&t_as_ntt[i0], - &product); - } - libcrux_ml_kem_polynomial_add_standard_error_reduce_d6_ea( - &t_as_ntt[i0], &error_as_ntt[i0]); - } -} - -/** - This function implements most of Algorithm 12 of the - NIST FIPS 203 specification; this is the Kyber CPA-PKE key generation - algorithm. - - We say "most of" since Algorithm 12 samples the required randomness within - the function itself, whereas this implementation expects it to be provided - through the `key_generation_seed` parameter. - - Algorithm 12 is reproduced below: - - ```plaintext - Output: encryption key ekₚₖₑ ∈ 𝔹^{384k+32}. - Output: decryption key dkₚₖₑ ∈ 𝔹^{384k}. - - d ←$ B - (ρ,σ) ← G(d) - N ← 0 - for (i ← 0; i < k; i++) - for(j ← 0; j < k; j++) - Â[i,j] ← SampleNTT(XOF(ρ, i, j)) - end for - end for - for(i ← 0; i < k; i++) - s[i] ← SamplePolyCBD_{η₁}(PRF_{η₁}(σ,N)) - N ← N + 1 - end for - for(i ← 0; i < k; i++) - e[i] ← SamplePolyCBD_{η₂}(PRF_{η₂}(σ,N)) - N ← N + 1 - end for - ŝ ← NTT(s) - ê ← NTT(e) - t̂ ← Â◦ŝ + ê - ekₚₖₑ ← ByteEncode₁₂(t̂) ‖ ρ - dkₚₖₑ ← ByteEncode₁₂(ŝ) - ``` - - The NIST FIPS 203 standard can be found at - . -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair_unpacked -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], -libcrux_ml_kem_variant_MlKem with const generics -- K= 3 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_1c( - Eurydice_slice key_generation_seed, - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 *private_key, - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 *public_key) { - uint8_t hashed[64U]; - libcrux_ml_kem_variant_cpa_keygen_seed_39_9c(key_generation_seed, hashed); - Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at( - Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), (size_t)32U, - uint8_t, Eurydice_slice_uint8_t_x2); - Eurydice_slice seed_for_A = uu____0.fst; - Eurydice_slice seed_for_secret_and_error = uu____0.snd; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d(*uu____1)[3U] = - public_key->A; - uint8_t ret[34U]; - libcrux_ml_kem_utils_into_padded_array_b6(seed_for_A, ret); - libcrux_ml_kem_matrix_sample_matrix_A_2b(uu____1, ret, true); - uint8_t prf_input[33U]; - libcrux_ml_kem_utils_into_padded_array_c8(seed_for_secret_and_error, - prf_input); - uint8_t domain_separator = - libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b( - private_key->secret_as_ntt, prf_input, 0U); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d error_as_ntt[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - error_as_ntt[i] = - libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_call_mut_73_1c(&lvalue, - i); - } - libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b(error_as_ntt, prf_input, - domain_separator); - libcrux_ml_kem_matrix_compute_As_plus_e_1b( - public_key->t_as_ntt, public_key->A, private_key->secret_as_ntt, - error_as_ntt); - uint8_t uu____2[32U]; - Result_fb dst; - Eurydice_slice_to_array2(&dst, seed_for_A, Eurydice_slice, uint8_t[32U], - TryFromSliceError); - unwrap_26_b3(dst, uu____2); - memcpy(public_key->seed_for_A, uu____2, (size_t)32U * sizeof(uint8_t)); -} - -/** -A monomorphic instance of -libcrux_ml_kem.serialize.serialize_uncompressed_ring_element with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics - -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, uint8_t ret[384U]) { - uint8_t serialized[384U] = {0U}; - for (size_t i = (size_t)0U; - i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { - size_t i0 = i; - libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = - libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea( - re->coefficients[i0]); - uint8_t bytes[24U]; - libcrux_ml_kem_vector_portable_serialize_12_b8(coefficient, bytes); - Eurydice_slice_copy( - Eurydice_array_to_subslice3(serialized, (size_t)24U * i0, - (size_t)24U * i0 + (size_t)24U, uint8_t *), - Eurydice_array_to_slice((size_t)24U, bytes, uint8_t), uint8_t); - } - memcpy(ret, serialized, (size_t)384U * sizeof(uint8_t)); -} - -/** - Call [`serialize_uncompressed_ring_element`] for each ring element. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_vector -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_vector_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *key, - Eurydice_slice out) { - for (size_t i = (size_t)0U; - i < Eurydice_slice_len( - Eurydice_array_to_slice( - (size_t)3U, key, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d), - libcrux_ml_kem_polynomial_PolynomialRingElement_1d); - i++) { - size_t i0 = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = key[i0]; - Eurydice_slice uu____0 = Eurydice_slice_subslice3( - out, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, - (i0 + (size_t)1U) * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, - uint8_t *); - uint8_t ret[384U]; - libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_ea(&re, ret); - Eurydice_slice_copy( - uu____0, Eurydice_array_to_slice((size_t)384U, ret, uint8_t), uint8_t); - } -} - -/** - Concatenate `t` and `ρ` into the public key. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_public_key_mut -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_public_key_mut_89( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt, - Eurydice_slice seed_for_a, uint8_t *serialized) { - libcrux_ml_kem_ind_cpa_serialize_vector_1b( - t_as_ntt, - Eurydice_array_to_subslice3( - serialized, (size_t)0U, - libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U), - uint8_t *)); - Eurydice_slice_copy( - Eurydice_array_to_subslice_from( - (size_t)1184U, serialized, - libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U), - uint8_t, size_t, uint8_t[]), - seed_for_a, uint8_t); -} - -/** - Concatenate `t` and `ρ` into the public key. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_public_key -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_public_key_89( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt, - Eurydice_slice seed_for_a, uint8_t ret[1184U]) { - uint8_t public_key_serialized[1184U] = {0U}; - libcrux_ml_kem_ind_cpa_serialize_public_key_mut_89(t_as_ntt, seed_for_a, - public_key_serialized); - memcpy(ret, public_key_serialized, (size_t)1184U * sizeof(uint8_t)); -} - -/** - Serialize the secret key from the unpacked key pair generation. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_unpacked_secret_key -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- PRIVATE_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -*/ -static inline libcrux_ml_kem_utils_extraction_helper_Keypair768 -libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_6c( - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 *public_key, - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 *private_key) { - uint8_t public_key_serialized[1184U]; - libcrux_ml_kem_ind_cpa_serialize_public_key_89( - public_key->t_as_ntt, - Eurydice_array_to_slice((size_t)32U, public_key->seed_for_A, uint8_t), - public_key_serialized); - uint8_t secret_key_serialized[1152U] = {0U}; - libcrux_ml_kem_ind_cpa_serialize_vector_1b( - private_key->secret_as_ntt, - Eurydice_array_to_slice((size_t)1152U, secret_key_serialized, uint8_t)); - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_secret_key_serialized[1152U]; - memcpy(copy_of_secret_key_serialized, secret_key_serialized, - (size_t)1152U * sizeof(uint8_t)); - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_public_key_serialized[1184U]; - memcpy(copy_of_public_key_serialized, public_key_serialized, - (size_t)1184U * sizeof(uint8_t)); - libcrux_ml_kem_utils_extraction_helper_Keypair768 lit; - memcpy(lit.fst, copy_of_secret_key_serialized, - (size_t)1152U * sizeof(uint8_t)); - memcpy(lit.snd, copy_of_public_key_serialized, - (size_t)1184U * sizeof(uint8_t)); - return lit; -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], -libcrux_ml_kem_variant_MlKem with const generics -- K= 3 -- PRIVATE_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_utils_extraction_helper_Keypair768 -libcrux_ml_kem_ind_cpa_generate_keypair_ea(Eurydice_slice key_generation_seed) { - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 private_key = - libcrux_ml_kem_ind_cpa_unpacked_default_70_1b(); - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 public_key = - libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b(); - libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_1c( - key_generation_seed, &private_key, &public_key); - return libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_6c(&public_key, - &private_key); -} - -/** - Serialize the secret key. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.serialize_kem_secret_key_mut -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] -with const generics -- K= 3 -- SERIALIZED_KEY_LEN= 2400 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_d6( - Eurydice_slice private_key, Eurydice_slice public_key, - Eurydice_slice implicit_rejection_value, uint8_t *serialized) { - size_t pointer = (size_t)0U; - uint8_t *uu____0 = serialized; - size_t uu____1 = pointer; - size_t uu____2 = pointer; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - uu____0, uu____1, uu____2 + Eurydice_slice_len(private_key, uint8_t), - uint8_t *), - private_key, uint8_t); - pointer = pointer + Eurydice_slice_len(private_key, uint8_t); - uint8_t *uu____3 = serialized; - size_t uu____4 = pointer; - size_t uu____5 = pointer; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - uu____3, uu____4, uu____5 + Eurydice_slice_len(public_key, uint8_t), - uint8_t *), - public_key, uint8_t); - pointer = pointer + Eurydice_slice_len(public_key, uint8_t); - Eurydice_slice uu____6 = Eurydice_array_to_subslice3( - serialized, pointer, pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, - uint8_t *); - uint8_t ret[32U]; - libcrux_ml_kem_hash_functions_portable_H_4a_e0(public_key, ret); - Eurydice_slice_copy( - uu____6, Eurydice_array_to_slice((size_t)32U, ret, uint8_t), uint8_t); - pointer = pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE; - uint8_t *uu____7 = serialized; - size_t uu____8 = pointer; - size_t uu____9 = pointer; - Eurydice_slice_copy( - Eurydice_array_to_subslice3( - uu____7, uu____8, - uu____9 + Eurydice_slice_len(implicit_rejection_value, uint8_t), - uint8_t *), - implicit_rejection_value, uint8_t); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.serialize_kem_secret_key -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] -with const generics -- K= 3 -- SERIALIZED_KEY_LEN= 2400 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_serialize_kem_secret_key_d6( - Eurydice_slice private_key, Eurydice_slice public_key, - Eurydice_slice implicit_rejection_value, uint8_t ret[2400U]) { - uint8_t out[2400U] = {0U}; - libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_d6( - private_key, public_key, implicit_rejection_value, out); - memcpy(ret, out, (size_t)2400U * sizeof(uint8_t)); -} - -/** - Packed API - - Generate a key pair. - - Depending on the `Vector` and `Hasher` used, this requires different hardware - features -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.generate_keypair -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], -libcrux_ml_kem_variant_MlKem with const generics -- K= 3 -- CPA_PRIVATE_KEY_SIZE= 1152 -- PRIVATE_KEY_SIZE= 2400 -- PUBLIC_KEY_SIZE= 1184 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_mlkem768_MlKem768KeyPair -libcrux_ml_kem_ind_cca_generate_keypair_15(uint8_t *randomness) { - Eurydice_slice ind_cpa_keypair_randomness = Eurydice_array_to_subslice3( - randomness, (size_t)0U, - LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t *); - Eurydice_slice implicit_rejection_value = Eurydice_array_to_subslice_from( - (size_t)64U, randomness, - LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t, - size_t, uint8_t[]); - libcrux_ml_kem_utils_extraction_helper_Keypair768 uu____0 = - libcrux_ml_kem_ind_cpa_generate_keypair_ea(ind_cpa_keypair_randomness); - uint8_t ind_cpa_private_key[1152U]; - memcpy(ind_cpa_private_key, uu____0.fst, (size_t)1152U * sizeof(uint8_t)); - uint8_t public_key[1184U]; - memcpy(public_key, uu____0.snd, (size_t)1184U * sizeof(uint8_t)); - uint8_t secret_key_serialized[2400U]; - libcrux_ml_kem_ind_cca_serialize_kem_secret_key_d6( - Eurydice_array_to_slice((size_t)1152U, ind_cpa_private_key, uint8_t), - Eurydice_array_to_slice((size_t)1184U, public_key, uint8_t), - implicit_rejection_value, secret_key_serialized); - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_secret_key_serialized[2400U]; - memcpy(copy_of_secret_key_serialized, secret_key_serialized, - (size_t)2400U * sizeof(uint8_t)); - libcrux_ml_kem_types_MlKemPrivateKey_d9 private_key = - libcrux_ml_kem_types_from_77_28(copy_of_secret_key_serialized); - libcrux_ml_kem_types_MlKemPrivateKey_d9 uu____2 = private_key; - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_public_key[1184U]; - memcpy(copy_of_public_key, public_key, (size_t)1184U * sizeof(uint8_t)); - return libcrux_ml_kem_types_from_17_74( - uu____2, libcrux_ml_kem_types_from_fd_d0(copy_of_public_key)); -} - -/** - Portable generate key pair. -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.generate_keypair with const -generics -- K= 3 -- CPA_PRIVATE_KEY_SIZE= 1152 -- PRIVATE_KEY_SIZE= 2400 -- PUBLIC_KEY_SIZE= 1184 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -*/ -static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair -libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_ce( - uint8_t *randomness) { - return libcrux_ml_kem_ind_cca_generate_keypair_15(randomness); -} - -/** - Generate ML-KEM 768 Key Pair -*/ -static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair -libcrux_ml_kem_mlkem768_portable_generate_key_pair(uint8_t randomness[64U]) { - return libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_ce( - randomness); -} - -/** - Validate an ML-KEM private key. - - This implements the Hash check in 7.3 3. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.validate_private_key_only -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] -with const generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -*/ -static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_private_key_only_d6( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key) { - uint8_t t[32U]; - libcrux_ml_kem_hash_functions_portable_H_4a_e0( - Eurydice_array_to_subslice3(private_key->value, (size_t)384U * (size_t)3U, - (size_t)768U * (size_t)3U + (size_t)32U, - uint8_t *), - t); - Eurydice_slice expected = Eurydice_array_to_subslice3( - private_key->value, (size_t)768U * (size_t)3U + (size_t)32U, - (size_t)768U * (size_t)3U + (size_t)64U, uint8_t *); - return Eurydice_array_eq_slice((size_t)32U, t, &expected, uint8_t, bool); -} - -/** - Validate an ML-KEM private key. - - This implements the Hash check in 7.3 3. - Note that the size checks in 7.2 1 and 2 are covered by the `SECRET_KEY_SIZE` - and `CIPHERTEXT_SIZE` in the `private_key` and `ciphertext` types. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.validate_private_key -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] -with const generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -- CIPHERTEXT_SIZE= 1088 -*/ -static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_private_key_37( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *_ciphertext) { - return libcrux_ml_kem_ind_cca_validate_private_key_only_d6(private_key); -} - -/** - Private key validation -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.validate_private_key with const -generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -- CIPHERTEXT_SIZE= 1088 -*/ -static KRML_MUSTINLINE bool -libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_31( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext) { - return libcrux_ml_kem_ind_cca_validate_private_key_37(private_key, - ciphertext); -} - -/** - Validate a private key. - - Returns `true` if valid, and `false` otherwise. -*/ -static inline bool libcrux_ml_kem_mlkem768_portable_validate_private_key( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext) { - return libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_31( - private_key, ciphertext); -} - -/** - Private key validation -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.validate_private_key_only with -const generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -*/ -static KRML_MUSTINLINE bool -libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_only_41( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key) { - return libcrux_ml_kem_ind_cca_validate_private_key_only_d6(private_key); -} - -/** - Validate the private key only. - - Returns `true` if valid, and `false` otherwise. -*/ -static inline bool libcrux_ml_kem_mlkem768_portable_validate_private_key_only( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key) { - return libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_only_41( - private_key); -} - -/** -This function found in impl {core::ops::function::FnMut<(usize), -libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@1]> for -libcrux_ml_kem::serialize::deserialize_ring_elements_reduced_out::closure[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_ring_elements_reduced_out.call_mut_0b with -types libcrux_ml_kem_vector_portable_vector_type_PortableVector with const -generics -- K= 3 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_call_mut_0b_1b( - void **_, size_t tupled_args) { - return libcrux_ml_kem_polynomial_ZERO_d6_ea(); -} - -/** - This function deserializes ring elements and reduces the result by the field - modulus. - - This function MUST NOT be used on secret inputs. -*/ -/** -A monomorphic instance of -libcrux_ml_kem.serialize.deserialize_ring_elements_reduced_out with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_1b( - Eurydice_slice public_key, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d deserialized_pk[3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - deserialized_pk[i] = - libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_call_mut_0b_1b( - &lvalue, i); - } - libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b( - public_key, deserialized_pk); - memcpy( - ret, deserialized_pk, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); -} - -/** - Validate an ML-KEM public key. - - This implements the Modulus check in 7.2 2. - Note that the size check in 7.2 1 is covered by the `PUBLIC_KEY_SIZE` in the - `public_key` type. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.validate_public_key -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_public_key_89( - uint8_t *public_key) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d deserialized_pk[3U]; - libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_1b( - Eurydice_array_to_subslice_to( - (size_t)1184U, public_key, - libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U), - uint8_t, size_t, uint8_t[]), - deserialized_pk); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *uu____0 = deserialized_pk; - uint8_t public_key_serialized[1184U]; - libcrux_ml_kem_ind_cpa_serialize_public_key_89( - uu____0, - Eurydice_array_to_subslice_from( - (size_t)1184U, public_key, - libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U), - uint8_t, size_t, uint8_t[]), - public_key_serialized); - return Eurydice_array_eq((size_t)1184U, public_key, public_key_serialized, - uint8_t); -} - -/** - Public key validation -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.validate_public_key with const -generics -- K= 3 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE bool -libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_41( - uint8_t *public_key) { - return libcrux_ml_kem_ind_cca_validate_public_key_89(public_key); -} - -/** - Validate a public key. - - Returns `true` if valid, and `false` otherwise. -*/ -static inline bool libcrux_ml_kem_mlkem768_portable_validate_public_key( - libcrux_ml_kem_types_MlKemPublicKey_30 *public_key) { - return libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_41( - public_key->value); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.MlKemPublicKeyUnpacked -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- $3size_t -*/ -typedef struct libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0_s { - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 ind_cpa_public_key; - uint8_t public_key_hash[32U]; -} libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0; - -typedef libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768PublicKeyUnpacked; - -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.unpacked.MlKemPrivateKeyUnpacked with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- $3size_t -*/ -typedef struct libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_a0_s { - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 - ind_cpa_private_key; - uint8_t implicit_rejection_value[32U]; -} libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_a0; - -typedef struct - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked_s { - libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_a0 private_key; - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 public_key; -} libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked; - -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.decapsulate -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -- CPA_SECRET_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -- CIPHERTEXT_SIZE= 1088 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_SIZE= 960 -- C2_SIZE= 128 -- VECTOR_U_COMPRESSION_FACTOR= 10 -- VECTOR_V_COMPRESSION_FACTOR= 4 -- C1_BLOCK_SIZE= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_unpacked_decapsulate_51( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { - uint8_t decrypted[32U]; - libcrux_ml_kem_ind_cpa_decrypt_unpacked_42( - &key_pair->private_key.ind_cpa_private_key, ciphertext->value, decrypted); - uint8_t to_hash0[64U]; - libcrux_ml_kem_utils_into_padded_array_24( - Eurydice_array_to_slice((size_t)32U, decrypted, uint8_t), to_hash0); - Eurydice_slice uu____0 = Eurydice_array_to_subslice_from( - (size_t)64U, to_hash0, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, - uint8_t, size_t, uint8_t[]); - Eurydice_slice_copy( - uu____0, - Eurydice_array_to_slice((size_t)32U, key_pair->public_key.public_key_hash, - uint8_t), - uint8_t); - uint8_t hashed[64U]; - libcrux_ml_kem_hash_functions_portable_G_4a_e0( - Eurydice_array_to_slice((size_t)64U, to_hash0, uint8_t), hashed); - Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at( - Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), - LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t, - Eurydice_slice_uint8_t_x2); - Eurydice_slice shared_secret = uu____1.fst; - Eurydice_slice pseudorandomness = uu____1.snd; - uint8_t to_hash[1120U]; - libcrux_ml_kem_utils_into_padded_array_15( - Eurydice_array_to_slice( - (size_t)32U, key_pair->private_key.implicit_rejection_value, uint8_t), - to_hash); - Eurydice_slice uu____2 = Eurydice_array_to_subslice_from( - (size_t)1120U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, - uint8_t, size_t, uint8_t[]); - Eurydice_slice_copy(uu____2, libcrux_ml_kem_types_as_ref_d3_80(ciphertext), - uint8_t); - uint8_t implicit_rejection_shared_secret[32U]; - libcrux_ml_kem_hash_functions_portable_PRF_4a_41( - Eurydice_array_to_slice((size_t)1120U, to_hash, uint8_t), - implicit_rejection_shared_secret); - uint8_t expected_ciphertext[1088U]; - libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a( - &key_pair->public_key.ind_cpa_public_key, decrypted, pseudorandomness, - expected_ciphertext); - uint8_t selector = - libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time( - libcrux_ml_kem_types_as_ref_d3_80(ciphertext), - Eurydice_array_to_slice((size_t)1088U, expected_ciphertext, uint8_t)); - uint8_t ret0[32U]; - libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time( - shared_secret, - Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret, - uint8_t), - selector, ret0); - memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t)); -} - -/** - Unpacked decapsulate -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.decapsulate with const -generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -- CPA_SECRET_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -- CIPHERTEXT_SIZE= 1088 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_SIZE= 960 -- C2_SIZE= 128 -- VECTOR_U_COMPRESSION_FACTOR= 10 -- VECTOR_V_COMPRESSION_FACTOR= 4 -- C1_BLOCK_SIZE= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_decapsulate_35( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { - libcrux_ml_kem_ind_cca_unpacked_decapsulate_51(key_pair, ciphertext, ret); -} - -/** - Decapsulate ML-KEM 768 (unpacked) - - Generates an [`MlKemSharedSecret`]. - The input is a reference to an unpacked key pair of type - [`MlKem768KeyPairUnpacked`] and an [`MlKem768Ciphertext`]. -*/ -static inline void libcrux_ml_kem_mlkem768_portable_unpacked_decapsulate( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked - *private_key, - libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { - libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_decapsulate_35( - private_key, ciphertext, ret); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.encaps_prepare -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] -with const generics -- K= 3 -*/ -static inline void libcrux_ml_kem_ind_cca_unpacked_encaps_prepare_9c( - Eurydice_slice randomness, Eurydice_slice pk_hash, uint8_t ret[64U]) { - uint8_t to_hash[64U]; - libcrux_ml_kem_utils_into_padded_array_24(randomness, to_hash); - Eurydice_slice_copy( - Eurydice_array_to_subslice_from((size_t)64U, to_hash, - LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, - uint8_t, size_t, uint8_t[]), - pk_hash, uint8_t); - uint8_t ret0[64U]; - libcrux_ml_kem_hash_functions_portable_G_4a_e0( - Eurydice_array_to_slice((size_t)64U, to_hash, uint8_t), ret0); - memcpy(ret, ret0, (size_t)64U * sizeof(uint8_t)); -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.encapsulate -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const -generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- PUBLIC_KEY_SIZE= 1184 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_SIZE= 960 -- C2_SIZE= 128 -- VECTOR_U_COMPRESSION_FACTOR= 10 -- VECTOR_V_COMPRESSION_FACTOR= 4 -- VECTOR_U_BLOCK_LEN= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE tuple_c2 libcrux_ml_kem_ind_cca_unpacked_encapsulate_0c( - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *public_key, - uint8_t *randomness) { - uint8_t hashed[64U]; - libcrux_ml_kem_ind_cca_unpacked_encaps_prepare_9c( - Eurydice_array_to_slice((size_t)32U, randomness, uint8_t), - Eurydice_array_to_slice((size_t)32U, public_key->public_key_hash, - uint8_t), - hashed); - Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at( - Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), - LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t, - Eurydice_slice_uint8_t_x2); - Eurydice_slice shared_secret = uu____0.fst; - Eurydice_slice pseudorandomness = uu____0.snd; - uint8_t ciphertext[1088U]; - libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a(&public_key->ind_cpa_public_key, - randomness, pseudorandomness, - ciphertext); - uint8_t shared_secret_array[32U] = {0U}; - Eurydice_slice_copy( - Eurydice_array_to_slice((size_t)32U, shared_secret_array, uint8_t), - shared_secret, uint8_t); - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_ciphertext[1088U]; - memcpy(copy_of_ciphertext, ciphertext, (size_t)1088U * sizeof(uint8_t)); - libcrux_ml_kem_mlkem768_MlKem768Ciphertext uu____2 = - libcrux_ml_kem_types_from_e0_80(copy_of_ciphertext); - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_shared_secret_array[32U]; - memcpy(copy_of_shared_secret_array, shared_secret_array, - (size_t)32U * sizeof(uint8_t)); - tuple_c2 lit; - lit.fst = uu____2; - memcpy(lit.snd, copy_of_shared_secret_array, (size_t)32U * sizeof(uint8_t)); - return lit; -} - -/** - Unpacked encapsulate -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.encapsulate with const -generics -- K= 3 -- CIPHERTEXT_SIZE= 1088 -- PUBLIC_KEY_SIZE= 1184 -- T_AS_NTT_ENCODED_SIZE= 1152 -- C1_SIZE= 960 -- C2_SIZE= 128 -- VECTOR_U_COMPRESSION_FACTOR= 10 -- VECTOR_V_COMPRESSION_FACTOR= 4 -- VECTOR_U_BLOCK_LEN= 320 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -- ETA2= 2 -- ETA2_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE tuple_c2 -libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_encapsulate_cd( - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *public_key, - uint8_t *randomness) { - return libcrux_ml_kem_ind_cca_unpacked_encapsulate_0c(public_key, randomness); -} - -/** - Encapsulate ML-KEM 768 (unpacked) - - Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple. - The input is a reference to an unpacked public key of type - [`MlKem768PublicKeyUnpacked`], the SHA3-256 hash of this public key, and - [`SHARED_SECRET_SIZE`] bytes of `randomness`. -*/ -static inline tuple_c2 libcrux_ml_kem_mlkem768_portable_unpacked_encapsulate( - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *public_key, - uint8_t randomness[32U]) { - return libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_encapsulate_cd( - public_key, randomness); -} - -/** -This function found in impl {core::ops::function::FnMut<(usize), -libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@1]> for -libcrux_ml_kem::ind_cca::unpacked::transpose_a::closure::closure[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.unpacked.transpose_a.closure.call_mut_b4 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_ind_cca_unpacked_transpose_a_closure_call_mut_b4_1b( - void **_, size_t tupled_args) { - return libcrux_ml_kem_polynomial_ZERO_d6_ea(); -} - -/** -This function found in impl {core::ops::function::FnMut<(usize), -@Array[TraitClause@0, -TraitClause@1], K>> for -libcrux_ml_kem::ind_cca::unpacked::transpose_a::closure[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.unpacked.transpose_a.call_mut_7b with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -*/ -static inline void libcrux_ml_kem_ind_cca_unpacked_transpose_a_call_mut_7b_1b( - void **_, size_t tupled_args, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) { - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - ret[i] = libcrux_ml_kem_ind_cca_unpacked_transpose_a_closure_call_mut_b4_1b( - &lvalue, i); - } -} - -/** -This function found in impl {core::clone::Clone for -libcrux_ml_kem::polynomial::PolynomialRingElement[TraitClause@0, -TraitClause@2]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.polynomial.clone_c1 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics - -*/ -static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d -libcrux_ml_kem_polynomial_clone_c1_ea( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d lit; - libcrux_ml_kem_vector_portable_vector_type_PortableVector ret[16U]; - core_array__core__clone__Clone_for__Array_T__N___clone( - (size_t)16U, self->coefficients, ret, - libcrux_ml_kem_vector_portable_vector_type_PortableVector, void *); - memcpy(lit.coefficients, ret, - (size_t)16U * - sizeof(libcrux_ml_kem_vector_portable_vector_type_PortableVector)); - return lit; -} - -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.transpose_a -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static inline void libcrux_ml_kem_ind_cca_unpacked_transpose_a_1b( - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ind_cpa_a[3U][3U], - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U][3U]) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d A[3U][3U]; - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - /* original Rust expression is not an lvalue in C */ - void *lvalue = (void *)0U; - libcrux_ml_kem_ind_cca_unpacked_transpose_a_call_mut_7b_1b(&lvalue, i, - A[i]); - } - for (size_t i = (size_t)0U; i < (size_t)3U; i++) { - size_t i0 = i; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d _a_i[3U][3U]; - memcpy(_a_i, A, - (size_t)3U * - sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U])); - for (size_t i1 = (size_t)0U; i1 < (size_t)3U; i1++) { - size_t j = i1; - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 = - libcrux_ml_kem_polynomial_clone_c1_ea(&ind_cpa_a[j][i0]); - A[i0][j] = uu____0; - } - } - memcpy(ret, A, - (size_t)3U * - sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U])); -} - -/** - Generate Unpacked Keys -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.generate_keypair -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, -libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], -libcrux_ml_kem_variant_MlKem with const generics -- K= 3 -- CPA_PRIVATE_KEY_SIZE= 1152 -- PRIVATE_KEY_SIZE= 2400 -- PUBLIC_KEY_SIZE= 1184 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_unpacked_generate_keypair_15( - uint8_t randomness[64U], - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *out) { - Eurydice_slice ind_cpa_keypair_randomness = Eurydice_array_to_subslice3( - randomness, (size_t)0U, - LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t *); - Eurydice_slice implicit_rejection_value = Eurydice_array_to_subslice_from( - (size_t)64U, randomness, - LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t, - size_t, uint8_t[]); - libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_1c( - ind_cpa_keypair_randomness, &out->private_key.ind_cpa_private_key, - &out->public_key.ind_cpa_public_key); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0[3U][3U]; - memcpy(uu____0, out->public_key.ind_cpa_public_key.A, - (size_t)3U * - sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U])); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d A[3U][3U]; - libcrux_ml_kem_ind_cca_unpacked_transpose_a_1b(uu____0, A); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____1[3U][3U]; - memcpy(uu____1, A, - (size_t)3U * - sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U])); - memcpy(out->public_key.ind_cpa_public_key.A, uu____1, - (size_t)3U * - sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U])); - uint8_t pk_serialized[1184U]; - libcrux_ml_kem_ind_cpa_serialize_public_key_89( - out->public_key.ind_cpa_public_key.t_as_ntt, - Eurydice_array_to_slice( - (size_t)32U, out->public_key.ind_cpa_public_key.seed_for_A, uint8_t), - pk_serialized); - uint8_t uu____2[32U]; - libcrux_ml_kem_hash_functions_portable_H_4a_e0( - Eurydice_array_to_slice((size_t)1184U, pk_serialized, uint8_t), uu____2); - memcpy(out->public_key.public_key_hash, uu____2, - (size_t)32U * sizeof(uint8_t)); - uint8_t uu____3[32U]; - Result_fb dst; - Eurydice_slice_to_array2(&dst, implicit_rejection_value, Eurydice_slice, - uint8_t[32U], TryFromSliceError); - unwrap_26_b3(dst, uu____3); - memcpy(out->private_key.implicit_rejection_value, uu____3, - (size_t)32U * sizeof(uint8_t)); -} - -/** - Generate a key pair -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.generate_keypair with -const generics -- K= 3 -- CPA_PRIVATE_KEY_SIZE= 1152 -- PRIVATE_KEY_SIZE= 2400 -- PUBLIC_KEY_SIZE= 1184 -- ETA1= 2 -- ETA1_RANDOMNESS_SIZE= 128 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_generate_keypair_ce( - uint8_t randomness[64U], - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *out) { - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_randomness[64U]; - memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t)); - libcrux_ml_kem_ind_cca_unpacked_generate_keypair_15(copy_of_randomness, out); -} - -/** - Generate ML-KEM 768 Key Pair in "unpacked" form. -*/ -static inline void -libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair_mut( - uint8_t randomness[64U], - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked - *key_pair) { - /* Passing arrays by value in Rust generates a copy in C */ - uint8_t copy_of_randomness[64U]; - memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t)); - libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_generate_keypair_ce( - copy_of_randomness, key_pair); -} - -/** -This function found in impl {core::default::Default for -libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.default_30 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 -libcrux_ml_kem_ind_cca_unpacked_default_30_1b(void) { - return ( - KRML_CLITERAL(libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0){ - .ind_cpa_public_key = libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b(), - .public_key_hash = {0U}}); -} - -/** -This function found in impl {core::default::Default for -libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.default_7b -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked - libcrux_ml_kem_ind_cca_unpacked_default_7b_1b(void) { - libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_a0 uu____0 = { - .ind_cpa_private_key = libcrux_ml_kem_ind_cpa_unpacked_default_70_1b(), - .implicit_rejection_value = {0U}}; - return (KRML_CLITERAL( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked){ - .private_key = uu____0, - .public_key = libcrux_ml_kem_ind_cca_unpacked_default_30_1b()}); -} - -/** - Generate ML-KEM 768 Key Pair in "unpacked" form. -*/ -static inline libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked -libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair( - uint8_t randomness[64U]) { - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked key_pair = - libcrux_ml_kem_ind_cca_unpacked_default_7b_1b(); - uint8_t uu____0[64U]; - memcpy(uu____0, randomness, (size_t)64U * sizeof(uint8_t)); - libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair_mut(uu____0, - &key_pair); - return key_pair; -} - -/** - Create a new, empty unpacked key. -*/ -static inline libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked -libcrux_ml_kem_mlkem768_portable_unpacked_init_key_pair(void) { - return libcrux_ml_kem_ind_cca_unpacked_default_7b_1b(); -} - -/** - Create a new, empty unpacked public key. -*/ -static inline libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 -libcrux_ml_kem_mlkem768_portable_unpacked_init_public_key(void) { - return libcrux_ml_kem_ind_cca_unpacked_default_30_1b(); -} - -/** - Take a serialized private key and generate an unpacked key pair from it. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.keys_from_private_key -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -- CPA_SECRET_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -- T_AS_NTT_ENCODED_SIZE= 1152 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_unpacked_keys_from_private_key_42( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked - *key_pair) { - Eurydice_slice_uint8_t_x4 uu____0 = - libcrux_ml_kem_types_unpack_private_key_b4( - Eurydice_array_to_slice((size_t)2400U, private_key->value, uint8_t)); - Eurydice_slice ind_cpa_secret_key = uu____0.fst; - Eurydice_slice ind_cpa_public_key = uu____0.snd; - Eurydice_slice ind_cpa_public_key_hash = uu____0.thd; - Eurydice_slice implicit_rejection_value = uu____0.f3; - libcrux_ml_kem_ind_cpa_deserialize_vector_1b( - ind_cpa_secret_key, - key_pair->private_key.ind_cpa_private_key.secret_as_ntt); - libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_3f( - ind_cpa_public_key, &key_pair->public_key.ind_cpa_public_key); - Eurydice_slice_copy( - Eurydice_array_to_slice((size_t)32U, key_pair->public_key.public_key_hash, - uint8_t), - ind_cpa_public_key_hash, uint8_t); - Eurydice_slice_copy( - Eurydice_array_to_slice( - (size_t)32U, key_pair->private_key.implicit_rejection_value, uint8_t), - implicit_rejection_value, uint8_t); - Eurydice_slice_copy( - Eurydice_array_to_slice( - (size_t)32U, key_pair->public_key.ind_cpa_public_key.seed_for_A, - uint8_t), - Eurydice_slice_subslice_from(ind_cpa_public_key, (size_t)1152U, uint8_t, - size_t, uint8_t[]), - uint8_t); -} - -/** - Take a serialized private key and generate an unpacked key pair from it. -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.keypair_from_private_key -with const generics -- K= 3 -- SECRET_KEY_SIZE= 2400 -- CPA_SECRET_KEY_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -- T_AS_NTT_ENCODED_SIZE= 1152 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_keypair_from_private_key_fd( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked - *key_pair) { - libcrux_ml_kem_ind_cca_unpacked_keys_from_private_key_42(private_key, - key_pair); -} - -/** - Get an unpacked key from a private key. -*/ -static inline void -libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_from_private_mut( - libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key, - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked - *key_pair) { - libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_keypair_from_private_key_fd( - private_key, key_pair); -} - -/** -This function found in impl -{libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.unpacked.serialized_private_key_mut_11 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- CPA_PRIVATE_KEY_SIZE= 1152 -- PRIVATE_KEY_SIZE= 2400 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_43( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self, - libcrux_ml_kem_types_MlKemPrivateKey_d9 *serialized) { - libcrux_ml_kem_utils_extraction_helper_Keypair768 uu____0 = - libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_6c( - &self->public_key.ind_cpa_public_key, - &self->private_key.ind_cpa_private_key); - uint8_t ind_cpa_private_key[1152U]; - memcpy(ind_cpa_private_key, uu____0.fst, (size_t)1152U * sizeof(uint8_t)); - uint8_t ind_cpa_public_key[1184U]; - memcpy(ind_cpa_public_key, uu____0.snd, (size_t)1184U * sizeof(uint8_t)); - libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_d6( - Eurydice_array_to_slice((size_t)1152U, ind_cpa_private_key, uint8_t), - Eurydice_array_to_slice((size_t)1184U, ind_cpa_public_key, uint8_t), - Eurydice_array_to_slice( - (size_t)32U, self->private_key.implicit_rejection_value, uint8_t), - serialized->value); -} - -/** -This function found in impl -{libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.unpacked.serialized_private_key_11 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- CPA_PRIVATE_KEY_SIZE= 1152 -- PRIVATE_KEY_SIZE= 2400 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_types_MlKemPrivateKey_d9 -libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_11_43( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self) { - libcrux_ml_kem_types_MlKemPrivateKey_d9 sk = - libcrux_ml_kem_types_default_d3_28(); - libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_43(self, &sk); - return sk; -} - -/** - Get the serialized private key. -*/ -static inline libcrux_ml_kem_types_MlKemPrivateKey_d9 -libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_private_key( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked - *key_pair) { - return libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_11_43(key_pair); -} - -/** - Get the serialized private key. -*/ -static inline void -libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_private_key_mut( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, - libcrux_ml_kem_types_MlKemPrivateKey_d9 *serialized) { - libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_43(key_pair, - serialized); -} - -/** -This function found in impl -{libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_dd -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_types_MlKemPublicKey_30 -libcrux_ml_kem_ind_cca_unpacked_serialized_dd_89( - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *self) { - uint8_t ret[1184U]; - libcrux_ml_kem_ind_cpa_serialize_public_key_89( - self->ind_cpa_public_key.t_as_ntt, - Eurydice_array_to_slice((size_t)32U, self->ind_cpa_public_key.seed_for_A, - uint8_t), - ret); - return libcrux_ml_kem_types_from_fd_d0(ret); -} - -/** -This function found in impl -{libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.unpacked.serialized_public_key_11 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_types_MlKemPublicKey_30 -libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_11_89( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self) { - return libcrux_ml_kem_ind_cca_unpacked_serialized_dd_89(&self->public_key); -} - -/** - Get the serialized public key. -*/ -static inline libcrux_ml_kem_types_MlKemPublicKey_30 -libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_public_key( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked - *key_pair) { - return libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_11_89(key_pair); -} - -/** -This function found in impl -{libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_mut_dd -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_89( - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *self, - libcrux_ml_kem_types_MlKemPublicKey_30 *serialized) { - libcrux_ml_kem_ind_cpa_serialize_public_key_mut_89( - self->ind_cpa_public_key.t_as_ntt, - Eurydice_array_to_slice((size_t)32U, self->ind_cpa_public_key.seed_for_A, - uint8_t), - serialized->value); -} - -/** -This function found in impl -{libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.unpacked.serialized_public_key_mut_11 with types -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_mut_11_89( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self, - libcrux_ml_kem_types_MlKemPublicKey_30 *serialized) { - libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_89(&self->public_key, - serialized); -} - -/** - Get the serialized public key. -*/ -static inline void -libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_public_key_mut( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, - libcrux_ml_kem_types_MlKemPublicKey_30 *serialized) { - libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_mut_11_89(key_pair, - serialized); -} - -/** -This function found in impl {core::clone::Clone for -libcrux_ml_kem::ind_cpa::unpacked::IndCpaPublicKeyUnpacked[TraitClause@0, TraitClause@2]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.clone_91 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static inline libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 -libcrux_ml_kem_ind_cpa_unpacked_clone_91_1b( - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 *self) { - libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0[3U]; - core_array__core__clone__Clone_for__Array_T__N___clone( - (size_t)3U, self->t_as_ntt, uu____0, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d, void *); - uint8_t uu____1[32U]; - core_array__core__clone__Clone_for__Array_T__N___clone( - (size_t)32U, self->seed_for_A, uu____1, uint8_t, void *); - libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 lit; - memcpy( - lit.t_as_ntt, uu____0, - (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d)); - memcpy(lit.seed_for_A, uu____1, (size_t)32U * sizeof(uint8_t)); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U][3U]; - core_array__core__clone__Clone_for__Array_T__N___clone( - (size_t)3U, self->A, ret, - libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U], void *); - memcpy(lit.A, ret, - (size_t)3U * - sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U])); - return lit; -} - -/** -This function found in impl {core::clone::Clone for -libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked[TraitClause@0, TraitClause@2]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.clone_d7 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static inline libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 -libcrux_ml_kem_ind_cca_unpacked_clone_d7_1b( - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *self) { - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 lit; - lit.ind_cpa_public_key = - libcrux_ml_kem_ind_cpa_unpacked_clone_91_1b(&self->ind_cpa_public_key); - uint8_t ret[32U]; - core_array__core__clone__Clone_for__Array_T__N___clone( - (size_t)32U, self->public_key_hash, ret, uint8_t, void *); - memcpy(lit.public_key_hash, ret, (size_t)32U * sizeof(uint8_t)); - return lit; -} - -/** -This function found in impl -{libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked[TraitClause@0, TraitClause@1]} -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.public_key_11 -with types libcrux_ml_kem_vector_portable_vector_type_PortableVector -with const generics -- K= 3 -*/ -static KRML_MUSTINLINE libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 * -libcrux_ml_kem_ind_cca_unpacked_public_key_11_1b( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self) { - return &self->public_key; -} - -/** - Get the unpacked public key. -*/ -static inline void libcrux_ml_kem_mlkem768_portable_unpacked_public_key( - libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair, - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *pk) { - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 uu____0 = - libcrux_ml_kem_ind_cca_unpacked_clone_d7_1b( - libcrux_ml_kem_ind_cca_unpacked_public_key_11_1b(key_pair)); - pk[0U] = uu____0; -} - -/** - Get the serialized public key. -*/ -static inline void -libcrux_ml_kem_mlkem768_portable_unpacked_serialized_public_key( - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *public_key, - libcrux_ml_kem_types_MlKemPublicKey_30 *serialized) { - libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_89(public_key, serialized); -} - -/** - Generate an unpacked key from a serialized key. -*/ -/** -A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.unpack_public_key -with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], -libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics -- K= 3 -- T_AS_NTT_ENCODED_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_unpacked_unpack_public_key_0a( - libcrux_ml_kem_types_MlKemPublicKey_30 *public_key, - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 - *unpacked_public_key) { - Eurydice_slice uu____0 = - Eurydice_array_to_subslice_to((size_t)1184U, public_key->value, - (size_t)1152U, uint8_t, size_t, uint8_t[]); - libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b( - uu____0, unpacked_public_key->ind_cpa_public_key.t_as_ntt); - uint8_t uu____1[32U]; - libcrux_ml_kem_utils_into_padded_array_9e( - Eurydice_array_to_subslice_from((size_t)1184U, public_key->value, - (size_t)1152U, uint8_t, size_t, - uint8_t[]), - uu____1); - memcpy(unpacked_public_key->ind_cpa_public_key.seed_for_A, uu____1, - (size_t)32U * sizeof(uint8_t)); - libcrux_ml_kem_polynomial_PolynomialRingElement_1d(*uu____2)[3U] = - unpacked_public_key->ind_cpa_public_key.A; - uint8_t ret[34U]; - libcrux_ml_kem_utils_into_padded_array_b6( - Eurydice_array_to_subslice_from((size_t)1184U, public_key->value, - (size_t)1152U, uint8_t, size_t, - uint8_t[]), - ret); - libcrux_ml_kem_matrix_sample_matrix_A_2b(uu____2, ret, false); - uint8_t uu____3[32U]; - libcrux_ml_kem_hash_functions_portable_H_4a_e0( - Eurydice_array_to_slice((size_t)1184U, - libcrux_ml_kem_types_as_slice_e6_d0(public_key), - uint8_t), - uu____3); - memcpy(unpacked_public_key->public_key_hash, uu____3, - (size_t)32U * sizeof(uint8_t)); -} - -/** - Get the unpacked public key. -*/ -/** -A monomorphic instance of -libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.unpack_public_key with -const generics -- K= 3 -- T_AS_NTT_ENCODED_SIZE= 1152 -- PUBLIC_KEY_SIZE= 1184 -*/ -static KRML_MUSTINLINE void -libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_unpack_public_key_31( - libcrux_ml_kem_types_MlKemPublicKey_30 *public_key, - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 - *unpacked_public_key) { - libcrux_ml_kem_ind_cca_unpacked_unpack_public_key_0a(public_key, - unpacked_public_key); -} - -/** - Get the unpacked public key. -*/ -static inline void -libcrux_ml_kem_mlkem768_portable_unpacked_unpacked_public_key( - libcrux_ml_kem_types_MlKemPublicKey_30 *public_key, - libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 - *unpacked_public_key) { - libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_unpack_public_key_31( - public_key, unpacked_public_key); -} - -#if defined(__cplusplus) -} -#endif - -#define libcrux_mlkem768_portable_H_DEFINED -#endif /* libcrux_mlkem768_portable_H */ - - -/* rename some types to be a bit more ergonomic */ -#define libcrux_mlkem768_keypair libcrux_ml_kem_mlkem768_MlKem768KeyPair_s -#define libcrux_mlkem768_pk libcrux_ml_kem_types_MlKemPublicKey_30_s -#define libcrux_mlkem768_sk libcrux_ml_kem_types_MlKemPrivateKey_d9_s -#define libcrux_mlkem768_ciphertext libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s -#define libcrux_mlkem768_enc_result tuple_c2_s -/* defines for PRNG inputs */ -#define LIBCRUX_ML_KEM_KEY_PAIR_PRNG_LEN 64U -#define LIBCRUX_ML_KEM_ENC_PRNG_LEN 32 diff --git a/mlkem768.sh b/mlkem768.sh deleted file mode 100644 index bec372a5fc7b..000000000000 --- a/mlkem768.sh +++ /dev/null @@ -1,219 +0,0 @@ -#!/bin/sh -# $OpenBSD: mlkem768.sh,v 1.5 2025/11/13 05:13:06 djm Exp $ -# Placed in the Public Domain. -# - -#WANT_LIBCRUX_REVISION="origin/main" -WANT_LIBCRUX_REVISION="core-models-v0.0.4" - -BASE="libcrux/libcrux-ml-kem/extracts/c_header_only/generated" -FILES=" - $BASE/eurydice_glue.h - $BASE/libcrux_mlkem_core.h - $BASE/libcrux_ct_ops.h - $BASE/libcrux_sha3_portable.h - $BASE/libcrux_mlkem768_portable.h -" - -START="$PWD" -die() { - echo "$@" 1>&2 - exit 1 -} - -set -xeuo pipefail -test -d libcrux || git clone https://github.com/cryspen/libcrux -cd libcrux -test `git diff | wc -l` -ne 0 && die "tree has unstaged changes" -git fetch -git checkout -B extract 1>&2 -git reset --hard $WANT_LIBCRUX_REVISION 1>&2 -LIBCRUX_REVISION=`git rev-parse HEAD` -set +x - -cd $START -( -printf '/* $Open'; printf 'BSD$ */\n' # Sigh -echo -echo "/* Extracted from libcrux revision $LIBCRUX_REVISION */" -echo -echo '/*' -cat libcrux/LICENSE-MIT | sed 's/^/ * /;s/ *$//' -echo ' */' -echo - -LSHIFT="<<" -cat << _EOF -#if !defined(__GNUC__) || (__GNUC__ < 2) -# define __attribute__(x) -#endif -#define KRML_MUSTINLINE inline -#define KRML_NOINLINE __attribute__((noinline, unused)) -#define KRML_HOST_EPRINTF(...) -#define KRML_HOST_EXIT(x) fatal_f("internal error") - -static inline void -store64_le(uint8_t dst[8], uint64_t src) -{ - dst[0] = src & 0xff; - dst[1] = (src >> 8) & 0xff; - dst[2] = (src >> 16) & 0xff; - dst[3] = (src >> 24) & 0xff; - dst[4] = (src >> 32) & 0xff; - dst[5] = (src >> 40) & 0xff; - dst[6] = (src >> 48) & 0xff; - dst[7] = (src >> 56) & 0xff; -} - -static inline void -store32_le(uint8_t dst[4], uint32_t src) -{ - dst[0] = src & 0xff; - dst[1] = (src >> 8) & 0xff; - dst[2] = (src >> 16) & 0xff; - dst[3] = (src >> 24) & 0xff; -} - -static inline void -store32_be(uint8_t dst[4], uint32_t src) -{ - dst[0] = (src >> 24) & 0xff; - dst[1] = (src >> 16) & 0xff; - dst[2] = (src >> 8) & 0xff; - dst[3] = src & 0xff; -} - -static inline uint64_t -load64_le(uint8_t src[8]) -{ - return (uint64_t)(src[0]) | - ((uint64_t)(src[1]) $LSHIFT 8) | - ((uint64_t)(src[2]) $LSHIFT 16) | - ((uint64_t)(src[3]) $LSHIFT 24) | - ((uint64_t)(src[4]) $LSHIFT 32) | - ((uint64_t)(src[5]) $LSHIFT 40) | - ((uint64_t)(src[6]) $LSHIFT 48) | - ((uint64_t)(src[7]) $LSHIFT 56); -} - -static inline uint32_t -load32_le(uint8_t src[4]) -{ - return (uint32_t)(src[0]) | - ((uint32_t)(src[1]) $LSHIFT 8) | - ((uint32_t)(src[2]) $LSHIFT 16) | - ((uint32_t)(src[3]) $LSHIFT 24); -} - -#ifdef MISSING_BUILTIN_POPCOUNT -static inline unsigned int -__builtin_popcount(unsigned int num) -{ - const int v[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; - return v[num & 0xf] + v[(num >> 4) & 0xf]; -} -#endif - -_EOF - -for i in $FILES; do - echo "/* from $i */" - # Changes to all files: - # - remove all includes, we inline everything required. - # - cleanup whitespace - sed -e "/#include/d" \ - -e 's/[ ]*$//' \ - $i | \ - case "$i" in - */eurydice_glue.h) - # Replace endian function for consistency. - perl -0777 -pe 's/(static inline void core_num__u32__to_be_bytes.*\n)([^}]*\n)/\1 store32_be(dst, src);\n/' - ;; - # Default: pass through. - *) - cat - ;; - esac - echo -done - -echo -echo '/* rename some types to be a bit more ergonomic */' -echo '#define libcrux_mlkem768_keypair libcrux_ml_kem_mlkem768_MlKem768KeyPair_s' -echo '#define libcrux_mlkem768_pk libcrux_ml_kem_types_MlKemPublicKey_30_s' -echo '#define libcrux_mlkem768_sk libcrux_ml_kem_types_MlKemPrivateKey_d9_s' -echo '#define libcrux_mlkem768_ciphertext libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s' -echo '#define libcrux_mlkem768_enc_result tuple_c2_s' -) > libcrux_mlkem768_sha3.h_new - -# Do some checks on the resultant file - -cat > libcrux_mlkem768_sha3_check.c << _EOF -#include -#include -#include -#include -#include -#include -#include -#include -#include "crypto_api.h" -#define fatal_f(x) exit(1) -#include "libcrux_mlkem768_sha3.h_new" -int main(void) { - struct libcrux_mlkem768_keypair keypair = {0}; - struct libcrux_mlkem768_pk pk = {0}; - struct libcrux_mlkem768_sk sk = {0}; - struct libcrux_mlkem768_ciphertext ct = {0}; - struct libcrux_mlkem768_enc_result enc_result = {0}; - uint8_t kp_seed[64] = {0}, enc_seed[32] = {0}; - uint8_t shared_key[crypto_kem_mlkem768_BYTES]; - - if (sizeof(keypair.pk.value) != crypto_kem_mlkem768_PUBLICKEYBYTES) - errx(1, "keypair.pk bad"); - if (sizeof(keypair.sk.value) != crypto_kem_mlkem768_SECRETKEYBYTES) - errx(1, "keypair.sk bad"); - if (sizeof(pk.value) != crypto_kem_mlkem768_PUBLICKEYBYTES) - errx(1, "pk bad"); - if (sizeof(sk.value) != crypto_kem_mlkem768_SECRETKEYBYTES) - errx(1, "sk bad"); - if (sizeof(ct.value) != crypto_kem_mlkem768_CIPHERTEXTBYTES) - errx(1, "ct bad"); - if (sizeof(enc_result.fst.value) != crypto_kem_mlkem768_CIPHERTEXTBYTES) - errx(1, "enc_result ct bad"); - if (sizeof(enc_result.snd) != crypto_kem_mlkem768_BYTES) - errx(1, "enc_result shared key bad"); - - keypair = libcrux_ml_kem_mlkem768_portable_generate_key_pair(kp_seed); - if (!libcrux_ml_kem_mlkem768_portable_validate_public_key(&keypair.pk)) - errx(1, "valid smoke failed"); - enc_result = libcrux_ml_kem_mlkem768_portable_encapsulate(&keypair.pk, - enc_seed); - libcrux_ml_kem_mlkem768_portable_decapsulate(&keypair.sk, - &enc_result.fst, shared_key); - if (memcmp(shared_key, enc_result.snd, sizeof(shared_key)) != 0) - errx(1, "smoke failed"); - return 0; -} -_EOF -cc -Wall -Wextra -Wno-unused-parameter -I . -o libcrux_mlkem768_sha3_check \ - libcrux_mlkem768_sha3_check.c -./libcrux_mlkem768_sha3_check - -# Extract PRNG inputs; there's no nice #defines for these -key_pair_rng_len=`grep '^libcrux_ml_kem_mlkem768_portable_generate_key_pair.*randomness' libcrux_mlkem768_sha3.h_new | sed 's/.*randomness[[]//;s/\].*//'` -enc_rng_len=`sed -e '/^static inline tuple_c2 libcrux_ml_kem_mlkem768_portable_encapsulate[(]$/,/[)] {$/!d' < libcrux_mlkem768_sha3.h_new | grep 'uint8_t randomness\[[0-9]*U\][)]' | sed 's/.*randomness\[\([0-9]*\)U\].*/\1/'` -test -z "$key_pair_rng_len" && die "couldn't find size of libcrux_ml_kem_mlkem768_portable_kyber_generate_key_pair randomness argument" -test -z "$enc_rng_len" && die "couldn't find size of libcrux_ml_kem_mlkem768_portable_kyber_encapsulate randomness argument" - -( -echo "/* defines for PRNG inputs */" -echo "#define LIBCRUX_ML_KEM_KEY_PAIR_PRNG_LEN $key_pair_rng_len" -echo "#define LIBCRUX_ML_KEM_ENC_PRNG_LEN $enc_rng_len" -) >> libcrux_mlkem768_sha3.h_new - -mv libcrux_mlkem768_sha3.h_new libcrux_mlkem768_sha3.h -rm libcrux_mlkem768_sha3_check libcrux_mlkem768_sha3_check.c -echo 1>&2 -echo "libcrux_mlkem768_sha3.h OK" 1>&2 - diff --git a/mlkem_mldsa.sh b/mlkem_mldsa.sh new file mode 100644 index 000000000000..fb470e26f520 --- /dev/null +++ b/mlkem_mldsa.sh @@ -0,0 +1,341 @@ +#!/bin/sh +# $OpenBSD: mlkem_mldsa.sh,v 1.1 2026/06/14 03:59:34 djm Exp $ +# Placed in the Public Domain. +# + +WANT_LIBCRUX_REVISION="origin/jonas/combined-extraction-mldsa" + +BASE="libcrux/combined_extraction/generated" +FILES=" + $BASE/eurydice_glue.h + $BASE/combined_core.h + $BASE/libcrux_sha3_portable.h + $BASE/libcrux_mlkem_core.h + $BASE/libcrux_mldsa_core.h + $BASE/libcrux_ct_ops.h + $BASE/libcrux_mldsa_portable.h + $BASE/libcrux_mldsa44_portable.h + $BASE/libcrux_mldsa65_portable.h + $BASE/libcrux_mldsa87_portable.h + $BASE/libcrux_mlkem768_portable.h +" + +START="$PWD" +die() { + echo "$@" 1>&2 + exit 1 +} + +set -xeuo pipefail +test -d libcrux || git clone https://github.com/cryspen/libcrux +cd libcrux +test `git diff | wc -l` -ne 0 && die "tree has unstaged changes" +git fetch +git checkout -B extract 1>&2 +git reset --hard $WANT_LIBCRUX_REVISION 1>&2 +LIBCRUX_REVISION=`git rev-parse HEAD` +set +x + +cd $START +( +printf '/* $Open'; printf 'BSD$ */\n' # Sigh +echo +echo "/* Extracted from libcrux revision $LIBCRUX_REVISION */" +echo +echo '/*' +cat libcrux/LICENSE-MIT | sed 's/^/ * /;s/ *$//' +echo ' */' +echo + +LSHIFT="<<" +cat << _EOF +#if !defined(__GNUC__) || (__GNUC__ < 2) +# define __attribute__(x) +#endif +#define KRML_MUSTINLINE inline +#define KRML_NOINLINE __attribute__((noinline, unused)) +#define KRML_HOST_EPRINTF(...) +#define KRML_HOST_EXIT(x) fatal_f("internal error") +#define KRML_UNION_CONSTRUCTOR(T) + +static inline void +store64_le(uint8_t dst[8], uint64_t src) +{ + dst[0] = src & 0xff; + dst[1] = (src >> 8) & 0xff; + dst[2] = (src >> 16) & 0xff; + dst[3] = (src >> 24) & 0xff; + dst[4] = (src >> 32) & 0xff; + dst[5] = (src >> 40) & 0xff; + dst[6] = (src >> 48) & 0xff; + dst[7] = (src >> 56) & 0xff; +} + +static inline void +store32_le(uint8_t dst[4], uint32_t src) +{ + dst[0] = src & 0xff; + dst[1] = (src >> 8) & 0xff; + dst[2] = (src >> 16) & 0xff; + dst[3] = (src >> 24) & 0xff; +} + +static inline void +store16_le(uint8_t dst[2], uint16_t src) +{ + dst[0] = src & 0xff; + dst[1] = (src >> 8) & 0xff; +} + +static inline void +store32_be(uint8_t dst[4], uint32_t src) +{ + dst[0] = (src >> 24) & 0xff; + dst[1] = (src >> 16) & 0xff; + dst[2] = (src >> 8) & 0xff; + dst[3] = src & 0xff; +} + +static inline uint64_t +load64_le(uint8_t src[8]) +{ + return (uint64_t)(src[0]) | + ((uint64_t)(src[1]) $LSHIFT 8) | + ((uint64_t)(src[2]) $LSHIFT 16) | + ((uint64_t)(src[3]) $LSHIFT 24) | + ((uint64_t)(src[4]) $LSHIFT 32) | + ((uint64_t)(src[5]) $LSHIFT 40) | + ((uint64_t)(src[6]) $LSHIFT 48) | + ((uint64_t)(src[7]) $LSHIFT 56); +} + +static inline uint32_t +load32_le(uint8_t src[4]) +{ + return (uint32_t)(src[0]) | + ((uint32_t)(src[1]) $LSHIFT 8) | + ((uint32_t)(src[2]) $LSHIFT 16) | + ((uint32_t)(src[3]) $LSHIFT 24); +} + +static inline uint16_t +load16_le(uint8_t src[4]) +{ + return (uint16_t)(src[0]) | + ((uint16_t)(src[1]) $LSHIFT 8); +} + +#ifdef MISSING_BUILTIN_POPCOUNT +static inline unsigned int +__builtin_popcount(unsigned int num) +{ + const int v[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; + return v[num & 0xf] + v[(num >> 4) & 0xf]; +} +#endif + +_EOF + +for i in $FILES; do + echo "/* from $i */" + # Changes to all files: + # - remove all includes, we inline everything required. + # - cleanup whitespace + # - convert C++-style constructors to C-style compound literals + # - convert Result constructors to C initializers + # - use anonymous unions to avoid "union U" redefinition errors + sed -e "/#include/d" \ + -e 's/[ ]*$//' \ + $i | \ + case "$i" in + */eurydice_glue.h) + # Replace endian function for consistency. + perl -0777 -pe 's/(static inline void core_num__u32__to_be_bytes.*\n)([^}]*\n)/\1 store32_be(dst, src);\n/' + ;; + # Default: pass through. + *) + cat + ;; + esac | \ + perl -0777 -pe 's/ <<\n\s+\(uint32_t\)\(int32_t\)0//g' + echo +done + +cat << _EOF + +/* rename some types to be a bit more ergonomic */ + +/* ML-KEM 768 */ +typedef Eurydice_arr_c7 libcrux_mlkem768_keypair_rnd; +typedef Eurydice_arr_ec libcrux_mlkem768_enc_rnd; +typedef libcrux_ml_kem_mlkem768_MlKem768KeyPair libcrux_mlkem768_keypair; +typedef Eurydice_arr_5f libcrux_mlkem768_pk; +typedef Eurydice_arr_7d libcrux_mlkem768_sk; +typedef Eurydice_arr_2b libcrux_mlkem768_ciphertext; +typedef tuple_f4 libcrux_mlkem768_enc_result; +typedef Eurydice_arr_ec libcrux_mlkem768_dec_result; +/* ML-DSA 44 */ +typedef Eurydice_arr_ec libcrux_mldsa44_keypair_rnd; +typedef libcrux_ml_dsa_ml_dsa_generic_ml_dsa_44_MLDSA44KeyPair + libcrux_mldsa44_keypair; +typedef Eurydice_arr_10 libcrux_mldsa44_sk; +typedef Eurydice_arr_02 libcrux_mldsa44_pk; +typedef Eurydice_borrow_slice_u8 libcrux_mldsa44_message; +typedef Eurydice_arr_ec libcrux_mldsa44_sign_rnd; +typedef core_result_Result_48 libcrux_mldsa44_sign_result; +typedef core_result_Result_41 libcrux_mldsa44_verify_result; +typedef Eurydice_arr_85 libcrux_mldsa44_signature; +/* ML-DSA 65 */ +typedef Eurydice_arr_ec libcrux_mldsa65_keypair_rnd; +typedef libcrux_ml_dsa_ml_dsa_generic_ml_dsa_65_MLDSA65KeyPair + libcrux_mldsa65_keypair; +typedef Eurydice_arr_24 libcrux_mldsa65_sk; +typedef Eurydice_arr_29 libcrux_mldsa65_pk; +typedef Eurydice_borrow_slice_u8 libcrux_mldsa65_message; +typedef Eurydice_arr_ec libcrux_mldsa65_sign_rnd; +typedef core_result_Result_8c libcrux_mldsa65_sign_result; +typedef core_result_Result_41 libcrux_mldsa65_verify_result; +typedef Eurydice_arr_0c libcrux_mldsa65_signature; +/* ML-DSA 87 */ +typedef Eurydice_arr_ec libcrux_mldsa87_keypair_rnd; +typedef libcrux_ml_dsa_ml_dsa_generic_ml_dsa_87_MLDSA87KeyPair + libcrux_mldsa87_keypair; +typedef Eurydice_arr_e2 libcrux_mldsa87_sk; +typedef Eurydice_arr_43 libcrux_mldsa87_pk; +typedef Eurydice_borrow_slice_u8 libcrux_mldsa87_message; +typedef Eurydice_arr_ec libcrux_mldsa87_sign_rnd; +typedef core_result_Result_8b libcrux_mldsa87_sign_result; +typedef core_result_Result_41 libcrux_mldsa87_verify_result; +typedef Eurydice_arr_93 libcrux_mldsa87_signature; + +#define LIBCRUX_RESULT_OK core_result_Ok + +_EOF + +) > libcrux_internal.h_new + +# Do some checks on the resultant file + +cat > libcrux_internal_check.c << _EOF +#include +#include +#include +#include +#include +#include +#include +#include +#include "crypto_api.h" +#define fatal_f(x) exit(1) +#include "libcrux_internal.h_new" + +#define TEST_MLDSA(L) do { \ + libcrux_mldsa##L##_keypair_rnd kpseed##L = {0}; \ + libcrux_mldsa##L##_keypair kp##L = {0}; \ + libcrux_mldsa##L##_sk sk##L = {0}; \ + libcrux_mldsa##L##_pk pk##L = {0}; \ + const uint8_t msgdata##L[6] = { 0x4a, 0x75, 0x6c, 0x69, 0x75, 0x73 }; \ + libcrux_mldsa##L##_message msg##L = { \ + msgdata##L, sizeof(msgdata##L) \ + }; \ + const uint8_t ctxdata##L[4] = { 0x48, 0x75, 0x67, 0x6f }; \ + libcrux_mldsa##L##_message ctx##L = { \ + ctxdata##L, sizeof(ctxdata##L) \ + }; \ + libcrux_mldsa##L##_sign_rnd signseed##L = {0}; \ + libcrux_mldsa##L##_sign_result signresult##L = {0}; \ + libcrux_mldsa##L##_verify_result verifyresult##L = {0}; \ + libcrux_mldsa##L##_signature sig##L = {0}; \ + \ + if (sizeof(kpseed##L.data) != MLDSA##L##_SEEDBYTES) \ + errx(1, "libcrux_mldsa%d_keypair_rnd bad", L); \ + if (sizeof(kp##L.verification_key.data) != MLDSA##L##_PUBLICKEYBYTES) \ + errx(1, "libcrux_mldsa%d_keypair verification_key bad", L); \ + if (sizeof(kp##L.signing_key.data) != MLDSA##L##_SECRETKEYBYTES) \ + errx(1, "libcrux_mldsa%d_keypair signing_key bad", L); \ + if (sizeof(pk##L.data) != MLDSA##L##_PUBLICKEYBYTES) \ + errx(1, "libcrux_mldsa%d_pk bad", L); \ + if (sizeof(sk##L.data) != MLDSA##L##_SECRETKEYBYTES) \ + errx(1, "libcrux_mldsa%d_sk bad", L); \ + if (sizeof(signresult##L.val.case_Ok.data) != MLDSA##L##_SIGBYTES) \ + errx(1, "libcrux_mldsa%d_sign_result bad", L); \ + if (sizeof(sig##L.data) != MLDSA##L##_SIGBYTES) \ + errx(1, "libcrux_mldsa%d_signature bad", L); \ + \ + kp##L = libcrux_ml_dsa_ml_dsa_##L##_portable_generate_key_pair( \ + kpseed##L); \ + sk##L = kp##L.signing_key; \ + pk##L = kp##L.verification_key; \ + signresult##L = libcrux_ml_dsa_ml_dsa_##L##_portable_sign(&sk##L, \ + msg##L, ctx##L, signseed##L); \ + if (signresult##L.tag != LIBCRUX_RESULT_OK) \ + errx(1, "libcrux_ml_dsa_ml_dsa_%d_portable_sign failed", L); \ + sig##L = signresult##L.val.case_Ok; \ + verifyresult##L = libcrux_ml_dsa_ml_dsa_##L##_portable_verify(&pk##L, \ + msg##L, ctx##L, &sig##L); \ + if (verifyresult##L.tag != LIBCRUX_RESULT_OK) \ + errx(1, "libcrux_ml_dsa_ml_dsa_%d_portable_verify failed", L); \ + sig##L.data[10] ^= 0x10; /* corrupt the signature */ \ + verifyresult##L = libcrux_ml_dsa_ml_dsa_##L##_portable_verify(&pk##L, \ + msg##L, ctx##L, &sig##L); \ + if (verifyresult##L.tag == LIBCRUX_RESULT_OK) \ + errx(1, "libcrux_ml_dsa_ml_dsa_%d_portable_verify fail2", L); \ +} while (0) + +int main(void) { + libcrux_mlkem768_keypair keypair = {0}; + libcrux_mlkem768_pk pk = {0}; + libcrux_mlkem768_sk sk = {0}; + libcrux_mlkem768_ciphertext ct = {0}; + libcrux_mlkem768_enc_result enc_result = {0}; + libcrux_mlkem768_keypair_rnd kp_seed = {0}; + libcrux_mlkem768_enc_rnd enc_seed = {0}; + libcrux_mlkem768_dec_result shared_secret = {0}; + uint8_t shared_key[crypto_kem_mlkem768_BYTES]; + + if (sizeof(keypair.pk.data) != crypto_kem_mlkem768_PUBLICKEYBYTES) + errx(1, "keypair.pk bad"); + if (sizeof(keypair.sk.data) != crypto_kem_mlkem768_SECRETKEYBYTES) + errx(1, "keypair.sk bad"); + if (sizeof(pk.data) != crypto_kem_mlkem768_PUBLICKEYBYTES) + errx(1, "pk bad"); + if (sizeof(sk.data) != crypto_kem_mlkem768_SECRETKEYBYTES) + errx(1, "sk bad"); + if (sizeof(ct.data) != crypto_kem_mlkem768_CIPHERTEXTBYTES) + errx(1, "ct bad"); + if (sizeof(enc_result.fst.data) != crypto_kem_mlkem768_CIPHERTEXTBYTES) + errx(1, "enc_result ct bad"); + if (sizeof(enc_result.snd.data) != crypto_kem_mlkem768_BYTES) + errx(1, "enc_result shared key bad"); + if (sizeof(kp_seed.data) != crypto_kem_mlkem768_KEYPAIRSEEDBYTES) + errx(1, "keypair rnd bad"); + if (sizeof(enc_seed.data) != crypto_kem_mlkem768_ENCSEEDBYTES) + errx(1, "keypair rnd bad"); + + keypair = libcrux_ml_kem_mlkem768_portable_generate_key_pair(kp_seed); + if (!libcrux_ml_kem_mlkem768_portable_validate_public_key(&keypair.pk)) + errx(1, "valid smoke failed"); + enc_result = libcrux_ml_kem_mlkem768_portable_encapsulate(&keypair.pk, + enc_seed); + shared_secret = libcrux_ml_kem_mlkem768_portable_decapsulate( + &keypair.sk, &enc_result.fst); + memcpy(shared_key, shared_secret.data, sizeof(shared_key)); + if (memcmp(shared_key, enc_result.snd.data, sizeof(shared_key)) != 0) + errx(1, "smoke failed"); + + TEST_MLDSA(44); + TEST_MLDSA(65); + TEST_MLDSA(87); + + return 0; +} +_EOF +cc -Wall -Wextra -Wno-unused-parameter -I . -o libcrux_internal_check \ + libcrux_internal_check.c +./libcrux_internal_check + +mv libcrux_internal.h_new libcrux_internal.h +rm libcrux_internal_check libcrux_internal_check.c +echo 1>&2 +echo "libcrux_internal.h OK" 1>&2 + diff --git a/pathnames.h b/pathnames.h index ae01c69e2d91..2f0b9f4f66d2 100644 --- a/pathnames.h +++ b/pathnames.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pathnames.h,v 1.36 2025/08/29 03:50:38 djm Exp $ */ +/* $OpenBSD: pathnames.h,v 1.37 2026/06/14 03:59:34 djm Exp $ */ /* * Author: Tatu Ylonen @@ -39,6 +39,7 @@ #define _PATH_HOST_ECDSA_KEY_FILE SSHDIR "/ssh_host_ecdsa_key" #define _PATH_HOST_RSA_KEY_FILE SSHDIR "/ssh_host_rsa_key" #define _PATH_HOST_ED25519_KEY_FILE SSHDIR "/ssh_host_ed25519_key" +#define _PATH_HOST_MLDSA44_ED25519_KEY_FILE SSHDIR "/ssh_host_mldsa44_ed25519_key" #define _PATH_DH_MODULI SSHDIR "/moduli" #ifndef _PATH_SSH_PROGRAM @@ -90,6 +91,7 @@ #define _PATH_SSH_CLIENT_ID_ED25519 _PATH_SSH_USER_DIR "/id_ed25519" #define _PATH_SSH_CLIENT_ID_ECDSA_SK _PATH_SSH_USER_DIR "/id_ecdsa_sk" #define _PATH_SSH_CLIENT_ID_ED25519_SK _PATH_SSH_USER_DIR "/id_ed25519_sk" +#define _PATH_SSH_CLIENT_ID_MLDSA44_ED25519 _PATH_SSH_USER_DIR "/id_mldsa44_ed25519" /* * Configuration file in user's home directory. This file need not be diff --git a/servconf.c b/servconf.c index 006c216c78cd..09fef2e7a5de 100644 --- a/servconf.c +++ b/servconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: servconf.c,v 1.447 2026/05/31 11:30:50 djm Exp $ */ +/* $OpenBSD: servconf.c,v 1.449 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland * All rights reserved @@ -319,6 +319,8 @@ fill_default_server_options(ServerOptions *options) #endif servconf_add_hostkey("[default]", 0, options, _PATH_HOST_ED25519_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_MLDSA44_ED25519_KEY_FILE, 0); } /* No certificates by default */ if (options->num_ports == 0) diff --git a/ssh-keygen.c b/ssh-keygen.c index 584d5a899993..f5fb4b20bc4a 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keygen.c,v 1.490 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: ssh-keygen.c,v 1.491 2026/06/14 03:59:34 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1994 Tatu Ylonen , Espoo, Finland @@ -273,6 +273,10 @@ ask_filename(struct passwd *pw, const char *prompt) case KEY_ED25519_SK_CERT: name = _PATH_SSH_CLIENT_ID_ED25519_SK; break; + case KEY_MLDSA44_ED25519: + case KEY_MLDSA44_ED25519_CERT: + name = _PATH_SSH_CLIENT_ID_MLDSA44_ED25519; + break; default: fatal("bad key type"); } @@ -1015,6 +1019,8 @@ do_gen_all_hostkeys(struct passwd *pw) #endif /* OPENSSL_HAS_ECC */ #endif /* WITH_OPENSSL */ { "ed25519", "ED25519",_PATH_HOST_ED25519_KEY_FILE }, + { "mldsa44-ed25519", "MLDSA44-ED25519", + _PATH_HOST_MLDSA44_ED25519_KEY_FILE }, { NULL, NULL, NULL } }; diff --git a/ssh-keyscan.c b/ssh-keyscan.c index 9bd3e78ebbd3..ddaf8dfb1de5 100644 --- a/ssh-keyscan.c +++ b/ssh-keyscan.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keyscan.c,v 1.167 2025/08/29 03:50:38 djm Exp $ */ +/* $OpenBSD: ssh-keyscan.c,v 1.168 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright 1995, 1996 by David Mazieres . * @@ -64,12 +64,13 @@ int ssh_port = SSH_DEFAULT_PORT; #define KT_ED25519 (1<<2) #define KT_ECDSA_SK (1<<4) #define KT_ED25519_SK (1<<5) +#define KT_MLDSA44_ED25519 (1<<6) #define KT_MIN KT_RSA -#define KT_MAX KT_ED25519_SK +#define KT_MAX KT_MLDSA44_ED25519 int get_cert = 0; -int get_keytypes = KT_RSA|KT_ECDSA|KT_ED25519|KT_ECDSA_SK|KT_ED25519_SK; +int get_keytypes = KT_RSA|KT_ECDSA|KT_ED25519|KT_ECDSA_SK|KT_ED25519_SK|KT_MLDSA44_ED25519; int hash_hosts = 0; /* Hash hostname on output */ @@ -257,6 +258,11 @@ keygrab_ssh2(con *c) "ecdsa-sha2-nistp384," "ecdsa-sha2-nistp521"; break; + case KT_MLDSA44_ED25519: + myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = get_cert ? + "ssh-mldsa44-ed25519-cert-v01@openssh.com" : + "ssh-mldsa44-ed25519@openssh.com"; + break; case KT_ECDSA_SK: myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = get_cert ? "sk-ecdsa-sha2-nistp256-cert-v01@openssh.com" : @@ -745,6 +751,9 @@ main(int argc, char **argv) case KEY_ECDSA_SK: get_keytypes |= KT_ECDSA_SK; break; + case KEY_MLDSA44_ED25519: + get_keytypes |= KT_MLDSA44_ED25519; + break; case KEY_UNSPEC: default: fatal("Unknown key type \"%s\"", tname); diff --git a/ssh-keysign.c b/ssh-keysign.c index 6cfa51102a62..fd6cf7c00330 100644 --- a/ssh-keysign.c +++ b/ssh-keysign.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keysign.c,v 1.80 2026/03/19 02:36:28 djm Exp $ */ +/* $OpenBSD: ssh-keysign.c,v 1.81 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright (c) 2002 Markus Friedl. All rights reserved. * @@ -203,6 +203,7 @@ main(int argc, char **argv) key_fd[i++] = open(_PATH_HOST_ECDSA_KEY_FILE, O_RDONLY); key_fd[i++] = open(_PATH_HOST_ED25519_KEY_FILE, O_RDONLY); key_fd[i++] = open(_PATH_HOST_RSA_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_MLDSA44_ED25519_KEY_FILE, O_RDONLY); if ((pw = getpwuid(getuid())) == NULL) fatal("getpwuid failed"); diff --git a/ssh-mldsa-eddsa.c b/ssh-mldsa-eddsa.c new file mode 100644 index 000000000000..6d43726523b7 --- /dev/null +++ b/ssh-mldsa-eddsa.c @@ -0,0 +1,501 @@ +/* $OpenBSD: ssh-mldsa-eddsa.c,v 1.1 2026/06/14 03:59:34 djm Exp $ */ +/* + * Copyright (c) 2026 Damien Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* draft-miller-sshm-mldsa44-ed25519-composite-sigs-00 */ + +#include +#include +#include +#include + +#include "crypto_api.h" +#include "sshbuf.h" +#include "ssherr.h" +#include "digest.h" +#define SSHKEY_INTERNAL +#include "sshkey.h" +#include "log.h" + +#define COMPOSITE_PREFIX "CompositeAlgorithmSignatures2025" +#define COMPOSITE_LABEL "COMPSIG-MLDSA44-Ed25519-SHA512" +#define SSH_MLDSA44_ED25519_ALG_NAME "ssh-mldsa44-ed25519@openssh.com" + +/* + * raw_* functions implement the draft-ietf-lamps-pq-composite-sigs-18 + * composite signature scheme. These are exposed (i.e. not static) so + * we can test them separately in unittests/crypto. + */ + +int +crypto_sign_mldsa44_ed25519_keygen(uint8_t pk[MLDSA44_ED25519_PK_SZ], + uint8_t sk[MLDSA44_ED25519_SK_SZ]) +{ + uint8_t mldsa_seed[32], ed25519_seed[32]; + int r; + + arc4random_buf(mldsa_seed, sizeof(mldsa_seed)); + arc4random_buf(ed25519_seed, sizeof(ed25519_seed)); + + r = crypto_sign_mldsa44_ed25519_keygen_seeded(pk, sk, mldsa_seed, + ed25519_seed); + explicit_bzero(mldsa_seed, sizeof(mldsa_seed)); + explicit_bzero(ed25519_seed, sizeof(ed25519_seed)); + return r; +} + +int +crypto_sign_mldsa44_ed25519_keygen_seeded(uint8_t pk[MLDSA44_ED25519_PK_SZ], + uint8_t sk[MLDSA44_ED25519_SK_SZ], const uint8_t mldsa_seed[32], + const uint8_t ed25519_seed[32]) +{ + uint8_t ed25519_pk[32], ed25519_sk[64]; + uint8_t mldsa_sk[MLDSA44_SECRETKEYBYTES]; + int ret = -1; + + if (crypto_sign_mldsa44_keypair_seeded(pk, mldsa_sk, mldsa_seed) != 0) + goto out; + if (crypto_sign_ed25519_keypair_from_seed(ed25519_pk, ed25519_sk, + ed25519_seed) != 0) + goto out; + + /* Serialize PK: mldsaPK || ed25519PK */ + memcpy(pk + MLDSA44_PUBLICKEYBYTES, ed25519_pk, 32); + + /* Serialize SK: mldsaSeed || ed25519Seed */ + memcpy(sk, mldsa_seed, 32); + memcpy(sk + 32, ed25519_seed, 32); + + /* success */ + ret = 0; + out: + explicit_bzero(mldsa_sk, sizeof(mldsa_sk)); + explicit_bzero(ed25519_sk, sizeof(ed25519_sk)); + return ret; +} + +static int +construct_m_prime(uint8_t **m_primep, size_t *m_prime_lenp, + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen) +{ + int r; + uint8_t hash[64]; + struct sshbuf *m_prime; + + *m_primep = NULL; + *m_prime_lenp = 0; + + if (ctxlen > 255) + return SSH_ERR_INVALID_ARGUMENT; + if ((r = ssh_digest_memory(SSH_DIGEST_SHA512, msg, msglen, + hash, sizeof(hash))) != 0) + return r; + if ((m_prime = sshbuf_new()) == NULL) + return SSH_ERR_ALLOC_FAIL; + if ((r = sshbuf_put(m_prime, COMPOSITE_PREFIX, + sizeof(COMPOSITE_PREFIX) - 1)) != 0 || + (r = sshbuf_put(m_prime, COMPOSITE_LABEL, + sizeof(COMPOSITE_LABEL) - 1)) != 0 || + (r = sshbuf_put_u8(m_prime, (uint8_t)ctxlen)) != 0 || + (r = sshbuf_put(m_prime, ctx, ctxlen)) != 0 || + (r = sshbuf_put(m_prime, hash, sizeof(hash))) != 0) { + sshbuf_free(m_prime); + return r; + } + if ((*m_primep = malloc(sshbuf_len(m_prime))) == NULL) { + sshbuf_free(m_prime); + return SSH_ERR_ALLOC_FAIL; + } + memcpy(*m_primep, sshbuf_ptr(m_prime), sshbuf_len(m_prime)); + *m_prime_lenp = sshbuf_len(m_prime); + /* success */ + sshbuf_free(m_prime); + return 0; +} + +int +crypto_sign_mldsa44_ed25519_sign(uint8_t sig[MLDSA44_ED25519_SIG_SZ], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t sk[MLDSA44_ED25519_SK_SZ]) +{ + uint8_t *m_prime = NULL; + size_t m_prime_len = 0; + uint8_t mldsa_sk[MLDSA44_SECRETKEYBYTES]; + uint8_t mldsa_pk_dummy[MLDSA44_PUBLICKEYBYTES]; + uint8_t ed25519_pk[32], ed25519_sk[64]; + uint8_t mldsa_rnd[32]; + unsigned long long smlen; + int r = -1; + + if (construct_m_prime(&m_prime, &m_prime_len, msg, msglen, + ctx, ctxlen) != 0) + return -1; + + /* Expand ML-DSA key from seed */ + if (crypto_sign_mldsa44_keypair_seeded(mldsa_pk_dummy, mldsa_sk, sk) != 0) + goto out; + + /* Sign with ML-DSA */ + arc4random_buf(mldsa_rnd, sizeof(mldsa_rnd)); + if (crypto_sign_mldsa44_seeded(sig, m_prime, m_prime_len, + (const uint8_t *)COMPOSITE_LABEL, sizeof(COMPOSITE_LABEL) - 1, + mldsa_sk, mldsa_rnd) != 0) + goto out; + + /* Expand Ed25519 key from seed */ + if (crypto_sign_ed25519_keypair_from_seed(ed25519_pk, ed25519_sk, + sk + 32) != 0) + goto out; + + /* Sign with Ed25519 */ + uint8_t *sm = malloc(m_prime_len + 64); + if (sm == NULL) + goto out; + + if (crypto_sign_ed25519(sm, &smlen, m_prime, m_prime_len, + ed25519_sk) != 0) { + free(sm); + goto out; + } + memcpy(sig + MLDSA44_SIGBYTES, sm, 64); + free(sm); + + r = 0; + out: + free(m_prime); + explicit_bzero(mldsa_rnd, sizeof(mldsa_rnd)); + explicit_bzero(mldsa_sk, sizeof(mldsa_sk)); + explicit_bzero(ed25519_sk, sizeof(ed25519_sk)); + return r; +} + +int +crypto_sign_mldsa44_ed25519_verify(const uint8_t sig[MLDSA44_ED25519_SIG_SZ], + const uint8_t *msg, size_t msglen, + const uint8_t *ctx, size_t ctxlen, + const uint8_t pk[MLDSA44_ED25519_PK_SZ]) +{ + uint8_t *m_prime = NULL; + size_t m_prime_len = 0; + uint8_t *sm = NULL, *m = NULL; + unsigned long long smlen, mlen; + int r = -1; + + if (construct_m_prime(&m_prime, &m_prime_len, msg, msglen, + ctx, ctxlen) != 0) + return -1; + + /* Verify ML-DSA */ + if (crypto_sign_mldsa44_verify(sig, m_prime, m_prime_len, + (const uint8_t *)COMPOSITE_LABEL, sizeof(COMPOSITE_LABEL) - 1, + pk) != 0) + goto out; + + /* Verify Ed25519 */ + smlen = m_prime_len + 64; + mlen = smlen; + if ((sm = malloc(smlen)) == NULL || (m = malloc(mlen)) == NULL) + goto out; + memcpy(sm, sig + MLDSA44_SIGBYTES, 64); + memcpy(sm + 64, m_prime, m_prime_len); + + if (crypto_sign_ed25519_open(m, &mlen, sm, smlen, + pk + MLDSA44_PUBLICKEYBYTES) != 0) + goto out; + if (mlen != m_prime_len) + goto out; + + r = 0; + out: + free(m_prime); + free(sm); + free(m); + return r; +} + +/* sshkey integration */ + +static void +ssh_mldsa44_ed25519_cleanup(struct sshkey *k) +{ + freezero(k->mldsa_ed25519_pk, MLDSA44_ED25519_PK_SZ); + freezero(k->mldsa_ed25519_sk, MLDSA44_ED25519_SK_SZ); + k->mldsa_ed25519_pk = NULL; + k->mldsa_ed25519_sk = NULL; +} + +static int +ssh_mldsa44_ed25519_equal(const struct sshkey *a, const struct sshkey *b) +{ + if (a->mldsa_ed25519_pk == NULL || b->mldsa_ed25519_pk == NULL) + return 0; + if (memcmp(a->mldsa_ed25519_pk, b->mldsa_ed25519_pk, + MLDSA44_ED25519_PK_SZ) != 0) + return 0; + return 1; +} + +static int +ssh_mldsa44_ed25519_serialize_public(const struct sshkey *key, struct sshbuf *b, + enum sshkey_serialize_rep opts) +{ + int r; + + if (key->mldsa_ed25519_pk == NULL) + return SSH_ERR_INVALID_ARGUMENT; + if ((r = sshbuf_put_string(b, key->mldsa_ed25519_pk, + MLDSA44_ED25519_PK_SZ)) != 0) + return r; + + return 0; +} + +static int +ssh_mldsa44_ed25519_serialize_private(const struct sshkey *key, struct sshbuf *b, + enum sshkey_serialize_rep opts) +{ + int r; + + if (key->mldsa_ed25519_sk == NULL) + return SSH_ERR_INVALID_ARGUMENT; + if (!sshkey_is_cert(key)) { + if ((r = ssh_mldsa44_ed25519_serialize_public(key, + b, opts)) != 0) + return r; + } + if ((r = sshbuf_put_string(b, key->mldsa_ed25519_sk, + MLDSA44_ED25519_SK_SZ)) != 0) + return r; + + return 0; +} + +static int +ssh_mldsa44_ed25519_deserialize_public(const char *ktype, struct sshbuf *b, + struct sshkey *key) +{ + u_char *pk = NULL; + size_t len = 0; + int r; + + if ((r = sshbuf_get_string(b, &pk, &len)) != 0) + return r; + if (len != MLDSA44_ED25519_PK_SZ) { + freezero(pk, len); + return SSH_ERR_INVALID_FORMAT; + } + key->mldsa_ed25519_pk = pk; + return 0; +} + +static int +ssh_mldsa44_ed25519_deserialize_private(const char *ktype, struct sshbuf *b, + struct sshkey *key) +{ + int r; + size_t sklen = 0; + u_char *sk = NULL; + + if (!sshkey_is_cert(key)) { + if ((r = ssh_mldsa44_ed25519_deserialize_public(ktype, + b, key)) != 0) + return r; + } + if ((r = sshbuf_get_string(b, &sk, &sklen)) != 0) + goto out; + if (sklen != MLDSA44_ED25519_SK_SZ) { + r = SSH_ERR_INVALID_FORMAT; + goto out; + } + key->mldsa_ed25519_sk = sk; + sk = NULL; /* transferred */ + r = 0; + out: + freezero(sk, sklen); + return r; +} + +static int +ssh_mldsa44_ed25519_generate(struct sshkey *k, int bits) +{ + free(k->mldsa_ed25519_pk); + free(k->mldsa_ed25519_sk); + k->mldsa_ed25519_pk = NULL; + k->mldsa_ed25519_sk = NULL; + if ((k->mldsa_ed25519_pk = malloc(MLDSA44_ED25519_PK_SZ)) == NULL || + (k->mldsa_ed25519_sk = malloc(MLDSA44_ED25519_SK_SZ)) == NULL) { + free(k->mldsa_ed25519_pk); + return SSH_ERR_ALLOC_FAIL; + } + if (crypto_sign_mldsa44_ed25519_keygen(k->mldsa_ed25519_pk, + k->mldsa_ed25519_sk) != 0) { + free(k->mldsa_ed25519_pk); + free(k->mldsa_ed25519_sk); + return SSH_ERR_CRYPTO_ERROR; + } + return 0; +} + +static int +ssh_mldsa44_ed25519_copy_public(const struct sshkey *from, struct sshkey *to) +{ + if (from->mldsa_ed25519_pk == NULL) + return SSH_ERR_INVALID_ARGUMENT; + if ((to->mldsa_ed25519_pk = malloc(MLDSA44_ED25519_PK_SZ)) == NULL) + return SSH_ERR_ALLOC_FAIL; + memcpy(to->mldsa_ed25519_pk, from->mldsa_ed25519_pk, + MLDSA44_ED25519_PK_SZ); + return 0; +} + +static int +ssh_mldsa44_ed25519_sign(struct sshkey *key, + u_char **sigp, size_t *lenp, const u_char *data, size_t datalen, + const char *alg, const char *sk_provider, const char *sk_pin, + u_int compat) +{ + u_char sig[MLDSA44_ED25519_SIG_SZ]; + struct sshbuf *b = NULL; + int r = SSH_ERR_INTERNAL_ERROR; + + if (lenp != NULL) + *lenp = 0; + if (sigp != NULL) + *sigp = NULL; + + if (key == NULL || + sshkey_type_plain(key->type) != KEY_MLDSA44_ED25519 || + key->mldsa_ed25519_sk == NULL) + return SSH_ERR_INVALID_ARGUMENT; + + if (crypto_sign_mldsa44_ed25519_sign(sig, data, datalen, NULL, 0, + key->mldsa_ed25519_sk) != 0) { + r = SSH_ERR_CRYPTO_ERROR; + goto out; + } + + if ((b = sshbuf_new()) == NULL) { + r = SSH_ERR_ALLOC_FAIL; + goto out; + } + if ((r = sshbuf_put_cstring(b, SSH_MLDSA44_ED25519_ALG_NAME)) != 0 || + (r = sshbuf_put_string(b, sig, sizeof(sig))) != 0) + goto out; + + if (sigp != NULL) { + if ((*sigp = malloc(sshbuf_len(b))) == NULL) { + r = SSH_ERR_ALLOC_FAIL; + goto out; + } + memcpy(*sigp, sshbuf_ptr(b), sshbuf_len(b)); + } + if (lenp != NULL) + *lenp = sshbuf_len(b); + r = 0; + out: + sshbuf_free(b); + explicit_bzero(sig, sizeof(sig)); + return r; +} + +static int +ssh_mldsa44_ed25519_verify(const struct sshkey *key, + const u_char *sig, size_t siglen, const u_char *data, size_t dlen, + const char *alg, u_int compat, struct sshkey_sig_details **detailsp) +{ + struct sshbuf *b = NULL; + char *ktype = NULL; + const u_char *sigblob; + size_t len; + int r; + + if (key == NULL || + sshkey_type_plain(key->type) != KEY_MLDSA44_ED25519 || + key->mldsa_ed25519_pk == NULL || + sig == NULL || siglen == 0) + return SSH_ERR_INVALID_ARGUMENT; + + if ((b = sshbuf_from(sig, siglen)) == NULL) + return SSH_ERR_ALLOC_FAIL; + if ((r = sshbuf_get_cstring(b, &ktype, NULL)) != 0 || + (r = sshbuf_get_string_direct(b, &sigblob, &len)) != 0) + goto out; + if (strcmp(SSH_MLDSA44_ED25519_ALG_NAME, ktype) != 0) { + r = SSH_ERR_KEY_TYPE_MISMATCH; + goto out; + } + if (sshbuf_len(b) != 0) { + r = SSH_ERR_UNEXPECTED_TRAILING_DATA; + goto out; + } + if (len != MLDSA44_ED25519_SIG_SZ) { + r = SSH_ERR_INVALID_FORMAT; + goto out; + } + + if (crypto_sign_mldsa44_ed25519_verify(sigblob, data, dlen, NULL, 0, + key->mldsa_ed25519_pk) != 0) { + r = SSH_ERR_SIGNATURE_INVALID; + goto out; + } + + r = 0; + out: + sshbuf_free(b); + free(ktype); + return r; +} + +const struct sshkey_impl_funcs sshkey_mldsa44_ed25519_funcs = { + /* .size = */ NULL, + /* .alloc = */ NULL, + /* .cleanup = */ ssh_mldsa44_ed25519_cleanup, + /* .equal = */ ssh_mldsa44_ed25519_equal, + /* .ssh_serialize_public = */ ssh_mldsa44_ed25519_serialize_public, + /* .ssh_deserialize_public = */ ssh_mldsa44_ed25519_deserialize_public, + /* .ssh_serialize_private = */ ssh_mldsa44_ed25519_serialize_private, + /* .ssh_deserialize_private = */ ssh_mldsa44_ed25519_deserialize_private, + /* .generate = */ ssh_mldsa44_ed25519_generate, + /* .copy_public = */ ssh_mldsa44_ed25519_copy_public, + /* .sign = */ ssh_mldsa44_ed25519_sign, + /* .verify = */ ssh_mldsa44_ed25519_verify, +}; + +const struct sshkey_impl sshkey_mldsa44_ed25519_impl = { + /* .name = */ "ssh-mldsa44-ed25519@openssh.com", + /* .shortname = */ "MLDSA44-ED25519", + /* .sigalg = */ NULL, + /* .type = */ KEY_MLDSA44_ED25519, + /* .nid = */ 0, + /* .cert = */ 0, + /* .sigonly = */ 0, + /* .keybits = */ 256, + /* .funcs = */ &sshkey_mldsa44_ed25519_funcs, +}; + +const struct sshkey_impl sshkey_mldsa44_ed25519_cert_impl = { + /* .name = */ "ssh-mldsa44-ed25519-cert-v01@openssh.com", + /* .shortname = */ "MLDSA44-ED25519-CERT", + /* .sigalg = */ NULL, + /* .type = */ KEY_MLDSA44_ED25519_CERT, + /* .nid = */ 0, + /* .cert = */ 1, + /* .sigonly = */ 0, + /* .keybits = */ 256, + /* .funcs = */ &sshkey_mldsa44_ed25519_funcs, +}; diff --git a/ssh.c b/ssh.c index 91c16dcca571..5a160c8c1352 100644 --- a/ssh.c +++ b/ssh.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh.c,v 1.632 2026/05/31 05:55:21 djm Exp $ */ +/* $OpenBSD: ssh.c,v 1.633 2026/06/14 03:59:34 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1741,9 +1741,11 @@ main(int ac, char **av) L_CERT(_PATH_HOST_ECDSA_KEY_FILE, 0); L_CERT(_PATH_HOST_ED25519_KEY_FILE, 1); L_CERT(_PATH_HOST_RSA_KEY_FILE, 2); + L_CERT(_PATH_HOST_MLDSA44_ED25519_KEY_FILE, 3); L_PUBKEY(_PATH_HOST_ECDSA_KEY_FILE, 4); L_PUBKEY(_PATH_HOST_ED25519_KEY_FILE, 5); L_PUBKEY(_PATH_HOST_RSA_KEY_FILE, 6); + L_PUBKEY(_PATH_HOST_MLDSA44_ED25519_KEY_FILE, 7); if (loaded == 0) debug("HostbasedAuthentication enabled but no " "local public host keys could be loaded."); diff --git a/sshconnect.c b/sshconnect.c index 4384277a6eab..2fc1f6026eb2 100644 --- a/sshconnect.c +++ b/sshconnect.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect.c,v 1.382 2026/02/16 00:45:41 dtucker Exp $ */ +/* $OpenBSD: sshconnect.c,v 1.383 2026/06/14 03:59:34 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1633,6 +1633,7 @@ show_other_keys(struct hostkeys *hostkeys, struct sshkey *key) KEY_RSA, KEY_ECDSA, KEY_ED25519, + KEY_MLDSA44_ED25519, -1 }; int i, ret = 0; diff --git a/sshd-auth.c b/sshd-auth.c index ad02aa48cdd4..fb1bab66fad1 100644 --- a/sshd-auth.c +++ b/sshd-auth.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd-auth.c,v 1.15 2026/05/31 11:30:50 djm Exp $ */ +/* $OpenBSD: sshd-auth.c,v 1.16 2026/06/14 03:59:34 djm Exp $ */ /* * SSH2 implementation: * Privilege Separation: @@ -249,6 +249,7 @@ list_hostkey_types(void) /* FALLTHROUGH */ case KEY_ECDSA: case KEY_ED25519: + case KEY_MLDSA44_ED25519: case KEY_ECDSA_SK: case KEY_ED25519_SK: append_hostkey_type(b, sshkey_ssh_name(key)); @@ -268,6 +269,7 @@ list_hostkey_types(void) /* FALLTHROUGH */ case KEY_ECDSA_CERT: case KEY_ED25519_CERT: + case KEY_MLDSA44_ED25519_CERT: case KEY_ECDSA_SK_CERT: case KEY_ED25519_SK_CERT: append_hostkey_type(b, sshkey_ssh_name(key)); @@ -292,6 +294,7 @@ get_hostkey_public_by_type(int type, int nid, struct ssh *ssh) case KEY_RSA_CERT: case KEY_ECDSA_CERT: case KEY_ED25519_CERT: + case KEY_MLDSA44_ED25519_CERT: case KEY_ECDSA_SK_CERT: case KEY_ED25519_SK_CERT: key = host_certificates[i]; diff --git a/sshd-session.c b/sshd-session.c index e9a488d08906..be30c8d70dd3 100644 --- a/sshd-session.c +++ b/sshd-session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd-session.c,v 1.23 2026/03/11 09:10:59 dtucker Exp $ */ +/* $OpenBSD: sshd-session.c,v 1.24 2026/06/14 03:59:34 djm Exp $ */ /* * SSH2 implementation: * Privilege Separation: @@ -439,6 +439,7 @@ get_hostkey_by_type(int type, int nid, int need_private, struct ssh *ssh) case KEY_ED25519_CERT: case KEY_ECDSA_SK_CERT: case KEY_ED25519_SK_CERT: + case KEY_MLDSA44_ED25519_CERT: key = sensitive_data.host_certificates[i]; break; default: diff --git a/sshd.c b/sshd.c index 74d25fc73fbe..1532ee69bf62 100644 --- a/sshd.c +++ b/sshd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd.c,v 1.626 2026/02/09 21:21:39 dtucker Exp $ */ +/* $OpenBSD: sshd.c,v 1.627 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright (c) 2000, 2001, 2002 Markus Friedl. All rights reserved. * Copyright (c) 2002 Niels Provos. All rights reserved. @@ -1653,6 +1653,7 @@ main(int ac, char **av) case KEY_RSA: case KEY_ECDSA: case KEY_ED25519: + case KEY_MLDSA44_ED25519: case KEY_ECDSA_SK: case KEY_ED25519_SK: if (have_agent || key != NULL) diff --git a/ssherr.c b/ssherr.c index d22072de7966..942f1dc42a9b 100644 --- a/ssherr.c +++ b/ssherr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssherr.c,v 1.11 2026/02/06 23:31:29 dtucker Exp $ */ +/* $OpenBSD: ssherr.c,v 1.12 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -72,6 +72,8 @@ ssh_err(int n) case SSH_ERR_LIBCRYPTO_ERROR: msg = ssherr_libcrypto(); return msg != NULL ? msg : "error in libcrypto"; + case SSH_ERR_INTERNAL_CRYPTO_ERROR: + return "cryptographic operation failed"; case SSH_ERR_UNEXPECTED_TRAILING_DATA: return "unexpected bytes remain after decoding"; case SSH_ERR_SYSTEM_ERROR: diff --git a/ssherr.h b/ssherr.h index 3dac27ab0234..ea9803f2a1a5 100644 --- a/ssherr.h +++ b/ssherr.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ssherr.h,v 1.9 2026/02/06 23:31:29 dtucker Exp $ */ +/* $OpenBSD: ssherr.h,v 1.10 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -82,6 +82,8 @@ #define SSH_ERR_SIGN_ALG_UNSUPPORTED -58 #define SSH_ERR_FEATURE_UNSUPPORTED -59 #define SSH_ERR_DEVICE_NOT_FOUND -60 +#define SSH_ERR_CRYPTO_ERROR -61 +#define SSH_ERR_INTERNAL_CRYPTO_ERROR -62 /* Translate a numeric error code to a human-readable error string */ const char *ssh_err(int n); diff --git a/sshkey.c b/sshkey.c index 59d14531c473..b91bb43bb1c1 100644 --- a/sshkey.c +++ b/sshkey.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshkey.c,v 1.161 2026/02/06 22:59:18 dtucker Exp $ */ +/* $OpenBSD: sshkey.c,v 1.162 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. * Copyright (c) 2008 Alexander von Gernler. All rights reserved. @@ -90,6 +90,8 @@ extern const struct sshkey_impl sshkey_ed25519_impl; extern const struct sshkey_impl sshkey_ed25519_cert_impl; extern const struct sshkey_impl sshkey_ed25519_sk_impl; extern const struct sshkey_impl sshkey_ed25519_sk_cert_impl; +extern const struct sshkey_impl sshkey_mldsa44_ed25519_impl; +extern const struct sshkey_impl sshkey_mldsa44_ed25519_cert_impl; #ifdef WITH_OPENSSL # ifdef OPENSSL_HAS_ECC # ifdef ENABLE_SK @@ -122,6 +124,8 @@ const struct sshkey_impl * const keyimpls[] = { &sshkey_ed25519_sk_impl, &sshkey_ed25519_sk_cert_impl, #endif + &sshkey_mldsa44_ed25519_impl, + &sshkey_mldsa44_ed25519_cert_impl, #ifdef WITH_OPENSSL # ifdef OPENSSL_HAS_ECC &sshkey_ecdsa_nistp256_impl, @@ -439,6 +443,8 @@ sshkey_type_plain(int type) return KEY_ECDSA_SK; case KEY_ED25519_CERT: return KEY_ED25519; + case KEY_MLDSA44_ED25519_CERT: + return KEY_MLDSA44_ED25519; case KEY_ED25519_SK_CERT: return KEY_ED25519_SK; default: @@ -459,6 +465,8 @@ sshkey_type_certified(int type) return KEY_ECDSA_SK_CERT; case KEY_ED25519: return KEY_ED25519_CERT; + case KEY_MLDSA44_ED25519: + return KEY_MLDSA44_ED25519_CERT; case KEY_ED25519_SK: return KEY_ED25519_SK_CERT; default: @@ -3388,6 +3396,7 @@ sshkey_private_to_fileblob(struct sshkey *key, struct sshbuf *blob, #ifdef WITH_OPENSSL case KEY_ECDSA_SK: #endif /* WITH_OPENSSL */ + case KEY_MLDSA44_ED25519: return sshkey_private_to_blob2(key, blob, passphrase, comment, openssh_format_cipher, openssh_format_rounds); default: diff --git a/sshkey.h b/sshkey.h index a9cdfcd19502..9ad5583a24a4 100644 --- a/sshkey.h +++ b/sshkey.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sshkey.h,v 1.73 2026/03/03 09:57:26 dtucker Exp $ */ +/* $OpenBSD: sshkey.h,v 1.74 2026/06/14 03:59:34 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. @@ -67,6 +67,8 @@ enum sshkey_types { KEY_ECDSA_SK_CERT, KEY_ED25519_SK, KEY_ED25519_SK_CERT, + KEY_MLDSA44_ED25519, + KEY_MLDSA44_ED25519_CERT, KEY_UNSPEC }; @@ -124,6 +126,9 @@ struct sshkey { /* KEY_ED25519 and KEY_ED25519_SK */ u_char *ed25519_sk; u_char *ed25519_pk; + /* KEY_MLDSA44_ED25519 */ + u_char *mldsa_ed25519_sk; + u_char *mldsa_ed25519_pk; /* KEY_ECDSA_SK and KEY_ED25519_SK */ char *sk_application; uint8_t sk_flags; From db1bad146ff3e9aa8e2e8eac926b185870417b2f Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 14 Jun 2026 04:16:19 +0000 Subject: [PATCH 102/196] upstream: make crypto_sign_ed25519_keypair_from_seed non-static. The new ML-DSA/ed25519 code needs it OpenBSD-Commit-ID: 48d00a2094bca8e422494aaa76105c708837436e --- ed25519.c | 4 ++-- ed25519.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ed25519.c b/ed25519.c index b7baa1490bef..346fd3644229 100644 --- a/ed25519.c +++ b/ed25519.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ed25519.c,v 1.7 2026/06/07 08:50:17 dtucker Exp $ */ +/* $OpenBSD: ed25519.c,v 1.8 2026/06/14 04:16:19 djm Exp $ */ /* * Public Domain, Authors: @@ -1912,7 +1912,7 @@ static void ge25519_scalarmult_base(ge25519_p3 *r, const sc25519 *s) } /* from supercop-20221122/crypto_sign/ed25519/ref/keypair.c */ -static int crypto_sign_ed25519_keypair_from_seed(unsigned char *pk,unsigned char *sk, const unsigned char *seed) +int crypto_sign_ed25519_keypair_from_seed(unsigned char *pk,unsigned char *sk, const unsigned char *seed) { unsigned char az[64]; sc25519 scsk; diff --git a/ed25519.sh b/ed25519.sh index 5846cb6e7ab6..987f61d80c99 100644 --- a/ed25519.sh +++ b/ed25519.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $OpenBSD: ed25519.sh,v 1.5 2026/06/07 08:50:17 dtucker Exp $ +# $OpenBSD: ed25519.sh,v 1.6 2026/06/14 04:16:19 djm Exp $ # Placed in the Public Domain. # AUTHOR="supercop-20221122/crypto_sign/ed25519/ref/implementors" @@ -101,7 +101,7 @@ _EOF */crypto_sign/ed25519/ref/keypair.c) # provide an explicit-seed key generation function and rename # it to the name OpenSSH expects - sed -e "s/int crypto_sign_keypair(unsigned char \*pk,unsigned char \*sk)/static int crypto_sign_ed25519_keypair_from_seed(unsigned char *pk,unsigned char *sk, const unsigned char *seed)/g" \ + sed -e "s/int crypto_sign_keypair(unsigned char \*pk,unsigned char \*sk)/int crypto_sign_ed25519_keypair_from_seed(unsigned char *pk,unsigned char *sk, const unsigned char *seed)/g" \ -e "s/randombytes(sk,32);/memcpy(sk, seed, 32);/g" ;; */crypto_sign/ed25519/ref/open.c) From 5a474d1bf338a895ce5973883c2f79d766f7dd42 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 14 Jun 2026 04:08:05 +0000 Subject: [PATCH 103/196] upstream: unit and regression tests for composite PQ ML-DSA44/Ed25519 keys. Includes a new unittests/crypto test that tests basic functionality of the underlying crypto primitives against public test vectors OpenBSD-Regress-ID: 4463b2e8adec391efa24a953f3c911b72892ca80 --- regress/agent.sh | 17 +- regress/cert-hostkey.sh | 15 +- regress/cert-userkey.sh | 16 +- regress/keytype.sh | 8 +- regress/knownhosts-command.sh | 5 +- regress/unittests/Makefile | 4 +- regress/unittests/authopt/Makefile | 4 +- regress/unittests/crypto/Makefile | 26 + regress/unittests/crypto/test_ed25519.c | 104 +++ regress/unittests/crypto/test_mldsa.c | 143 ++++ regress/unittests/crypto/test_mldsa_eddsa.c | 192 +++++ regress/unittests/crypto/test_mlkem.c | 167 ++++ .../draft-ietf-lamps-pq-composite-sigs.json | 8 + .../crypto/testdata/nistkats-44.json | 802 ++++++++++++++++++ regress/unittests/crypto/tests.c | 114 +++ regress/unittests/hostkeys/Makefile | 4 +- regress/unittests/kex/Makefile | 3 +- regress/unittests/servconf/Makefile | 3 +- regress/unittests/sshkey/Makefile | 4 +- regress/unittests/sshkey/mktestdata.sh | 22 +- regress/unittests/sshkey/test_file.c | 67 +- regress/unittests/sshkey/test_fuzz.c | 58 +- regress/unittests/sshkey/test_sshkey.c | 111 ++- .../sshkey/testdata/mldsa44_ed25519_1 | 58 ++ .../sshkey/testdata/mldsa44_ed25519_1-cert.fp | 1 + .../testdata/mldsa44_ed25519_1-cert.pub | 1 + .../sshkey/testdata/mldsa44_ed25519_1.fp | 1 + .../sshkey/testdata/mldsa44_ed25519_1.fp.bb | 1 + .../sshkey/testdata/mldsa44_ed25519_1.pub | 1 + .../sshkey/testdata/mldsa44_ed25519_1_pw | 59 ++ .../sshkey/testdata/mldsa44_ed25519_2 | 58 ++ .../sshkey/testdata/mldsa44_ed25519_2.fp | 1 + .../sshkey/testdata/mldsa44_ed25519_2.fp.bb | 1 + .../sshkey/testdata/mldsa44_ed25519_2.pub | 1 + regress/unittests/sshsig/Makefile | 4 +- regress/unittests/sshsig/mktestdata.sh | 9 +- .../unittests/sshsig/testdata/mldsa44-ed25519 | 58 ++ .../sshsig/testdata/mldsa44-ed25519.pub | 1 + .../sshsig/testdata/mldsa44-ed25519.sig | 78 ++ regress/unittests/sshsig/tests.c | 6 +- 40 files changed, 2203 insertions(+), 33 deletions(-) create mode 100644 regress/unittests/crypto/Makefile create mode 100644 regress/unittests/crypto/test_ed25519.c create mode 100644 regress/unittests/crypto/test_mldsa.c create mode 100644 regress/unittests/crypto/test_mldsa_eddsa.c create mode 100644 regress/unittests/crypto/test_mlkem.c create mode 100644 regress/unittests/crypto/testdata/draft-ietf-lamps-pq-composite-sigs.json create mode 100644 regress/unittests/crypto/testdata/nistkats-44.json create mode 100644 regress/unittests/crypto/tests.c create mode 100644 regress/unittests/sshkey/testdata/mldsa44_ed25519_1 create mode 100644 regress/unittests/sshkey/testdata/mldsa44_ed25519_1-cert.fp create mode 100644 regress/unittests/sshkey/testdata/mldsa44_ed25519_1-cert.pub create mode 100644 regress/unittests/sshkey/testdata/mldsa44_ed25519_1.fp create mode 100644 regress/unittests/sshkey/testdata/mldsa44_ed25519_1.fp.bb create mode 100644 regress/unittests/sshkey/testdata/mldsa44_ed25519_1.pub create mode 100644 regress/unittests/sshkey/testdata/mldsa44_ed25519_1_pw create mode 100644 regress/unittests/sshkey/testdata/mldsa44_ed25519_2 create mode 100644 regress/unittests/sshkey/testdata/mldsa44_ed25519_2.fp create mode 100644 regress/unittests/sshkey/testdata/mldsa44_ed25519_2.fp.bb create mode 100644 regress/unittests/sshkey/testdata/mldsa44_ed25519_2.pub create mode 100644 regress/unittests/sshsig/testdata/mldsa44-ed25519 create mode 100644 regress/unittests/sshsig/testdata/mldsa44-ed25519.pub create mode 100644 regress/unittests/sshsig/testdata/mldsa44-ed25519.sig diff --git a/regress/agent.sh b/regress/agent.sh index 26d4c9ed44b2..8a008d2e1326 100644 --- a/regress/agent.sh +++ b/regress/agent.sh @@ -1,4 +1,4 @@ -# $OpenBSD: agent.sh,v 1.23 2025/05/06 06:05:48 djm Exp $ +# $OpenBSD: agent.sh,v 1.24 2026/06/14 04:08:05 djm Exp $ # Placed in the Public Domain. tid="simple agent test" @@ -84,8 +84,14 @@ if [ $r -ne 52 ]; then fail "ssh connect with failed (exit code $r)" fi +cp $OBJ/sshd_proxy $OBJ/sshd_proxy.bak +cp $OBJ/ssh_proxy $OBJ/ssh_proxy.bak for t in ${SSH_KEYTYPES}; do trace "connect via agent using $t key" + grep -vi PubkeyAcceptedAlgorithms $OBJ/sshd_proxy.bak > $OBJ/sshd_proxy + echo "PubkeyAcceptedAlgorithms=+$t" >> $OBJ/sshd_proxy + grep -vi PubkeyAcceptedAlgorithms $OBJ/ssh_proxy.bak > $OBJ/ssh_proxy + echo "PubkeyAcceptedAlgorithms=+$t" >> $OBJ/ssh_proxy ${SSH} -F $OBJ/ssh_proxy -i $OBJ/$t-agent.pub -oIdentitiesOnly=yes \ somehost exit 52 r=$? @@ -93,6 +99,8 @@ for t in ${SSH_KEYTYPES}; do fail "ssh connect with failed (exit code $r)" fi done +cp $OBJ/sshd_proxy.bak $OBJ/sshd_proxy +cp $OBJ/ssh_proxy.bak $OBJ/ssh_proxy trace "agent forwarding" ${SSH} -A -F $OBJ/ssh_proxy somehost ${SSHADD} -l > /dev/null 2>&1 @@ -140,6 +148,13 @@ fi > $OBJ/authorized_keys_$USER for t in ${SSH_KEYTYPES}; do trace "connect via agent using $t key" + # Accept both keys and certs. + BASE=`echo $t | cut -d '@' -f1` + ACCEPT=`$SSH -Q key | grep "^$BASE" | paste -sd , -` + grep -vi PubkeyAcceptedAlgorithms $OBJ/sshd_proxy.bak > $OBJ/sshd_proxy + echo "PubkeyAcceptedAlgorithms=+$ACCEPT" >> $OBJ/sshd_proxy + grep -vi PubkeyAcceptedAlgorithms $OBJ/ssh_proxy.bak > $OBJ/ssh_proxy + echo "PubkeyAcceptedAlgorithms=+$ACCEPT" >> $OBJ/ssh_proxy ${SSH} -F $OBJ/ssh_proxy -i $OBJ/$t-agent.pub \ -oCertificateFile=$OBJ/$t-agent-cert.pub \ -oIdentitiesOnly=yes somehost exit 52 diff --git a/regress/cert-hostkey.sh b/regress/cert-hostkey.sh index 0c160775388f..a55a1b35b50d 100644 --- a/regress/cert-hostkey.sh +++ b/regress/cert-hostkey.sh @@ -1,4 +1,4 @@ -# $OpenBSD: cert-hostkey.sh,v 1.31 2026/02/11 22:58:23 djm Exp $ +# $OpenBSD: cert-hostkey.sh,v 1.32 2026/06/14 04:08:05 djm Exp $ # Placed in the Public Domain. tid="certified host keys" @@ -70,7 +70,18 @@ touch $OBJ/host_revoked_plain touch $OBJ/host_revoked_cert cat $OBJ/host_ca_key.pub $OBJ/host_ca_key2.pub > $OBJ/host_revoked_ca -PLAIN_TYPES=`echo "$SSH_KEYTYPES" | sed 's/^ssh-//'` +PLAIN_TYPES="" +for i in $SSH_KEYTYPES; do + case "$i" in + *@openssh.com*) t="$i" ;; + *) t=`echo "$i" | sed 's/^ssh-//'` ;; + esac + if [ -z "$PLAIN_TYPES" ]; then + PLAIN_TYPES="$t" + else + PLAIN_TYPES="$PLAIN_TYPES $t" + fi +done if echo "$PLAIN_TYPES" | grep '^rsa$' >/dev/null 2>&1 ; then PLAIN_TYPES="$PLAIN_TYPES rsa-sha2-256 rsa-sha2-512" diff --git a/regress/cert-userkey.sh b/regress/cert-userkey.sh index c0decf065cd3..5d9aa94c8586 100644 --- a/regress/cert-userkey.sh +++ b/regress/cert-userkey.sh @@ -1,4 +1,4 @@ -# $OpenBSD: cert-userkey.sh,v 1.32 2026/02/11 22:58:23 djm Exp $ +# $OpenBSD: cert-userkey.sh,v 1.33 2026/06/14 04:08:05 djm Exp $ # Placed in the Public Domain. tid="certified user keys" @@ -10,7 +10,18 @@ cp $OBJ/ssh_proxy $OBJ/ssh_proxy_bak grep -v AuthorizedKeysFile $OBJ/sshd_proxy > $OBJ/sshd_proxy_bak echo "AuthorizedKeysFile $OBJ/authorized_keys_%u_*" >> $OBJ/sshd_proxy_bak -PLAIN_TYPES=`$SSH -Q key-plain | maybe_filter_sk | sed 's/^ssh-//'` +PLAIN_TYPES="" +for i in `$SSH -Q key-plain | maybe_filter_sk`; do + case "$i" in + *@openssh.com*) t="$i" ;; + *) t=`echo "$i" | sed 's/^ssh-//'` ;; + esac + if [ -z "$PLAIN_TYPES" ]; then + PLAIN_TYPES="$t" + else + PLAIN_TYPES="$PLAIN_TYPES $t" + fi +done EXTRA_TYPES="" rsa="" @@ -24,6 +35,7 @@ kname() { rsa-sha2-*) n="$1" ;; sk-ecdsa-*) n="sk-ecdsa" ;; sk-ssh-ed25519*) n="sk-ssh-ed25519" ;; + ssh-mldsa*) n=`echo "$1" | sed 's/@.*//'` ;; # subshell because some seds will add a newline *) n=$(echo $1 | sed 's/^rsa/ssh-rsa/;s/^ed/ssh-ed/') ;; esac diff --git a/regress/keytype.sh b/regress/keytype.sh index 11ef7d0cb270..d13525bdcd59 100644 --- a/regress/keytype.sh +++ b/regress/keytype.sh @@ -1,4 +1,4 @@ -# $OpenBSD: keytype.sh,v 1.12 2025/05/06 06:05:48 djm Exp $ +# $OpenBSD: keytype.sh,v 1.13 2026/06/14 04:08:05 djm Exp $ # Placed in the Public Domain. tid="login with different key types" @@ -17,6 +17,7 @@ for i in ${SSH_KEYTYPES}; do ecdsa-sha2-nistp521) ktypes="$ktypes ecdsa-521" ;; sk-ssh-ed25519*) ktypes="$ktypes ed25519-sk" ;; sk-ecdsa-sha2-nistp256*) ktypes="$ktypes ecdsa-sk" ;; + ssh-mldsa44-ed25519*) ktypes="$ktypes mldsa44-ed25519" ;; esac done @@ -25,8 +26,8 @@ for kt in $ktypes; do xbits=`echo ${kt} | awk -F- '{print $2}'` xtype=`echo ${kt} | awk -F- '{print $1}'` case "$kt" in - *sk) type="$kt"; bits="n/a"; bits_arg="";; - *) type=$xtype; bits=$xbits; bits_arg="-b $bits";; + mldsa*|*sk) type="$kt"; bits="n/a"; bits_arg="";; + *) type=$xtype; bits=$xbits; bits_arg="-b $bits";; esac verbose "keygen $type, $bits bits" ${SSHKEYGEN} $bits_arg -q -N '' -t $type -f $OBJ/key.$kt || \ @@ -42,6 +43,7 @@ kname_to_ktype() { rsa-*) echo rsa-sha2-512,rsa-sha2-256,ssh-rsa;; ed25519-sk) echo sk-ssh-ed25519@openssh.com;; ecdsa-sk) echo sk-ecdsa-sha2-nistp256@openssh.com;; + mldsa44-ed25519) echo ssh-mldsa44-ed25519@openssh.com ;; esac } diff --git a/regress/knownhosts-command.sh b/regress/knownhosts-command.sh index 2ed6fa05e06a..58004b80e320 100644 --- a/regress/knownhosts-command.sh +++ b/regress/knownhosts-command.sh @@ -1,4 +1,4 @@ -# $OpenBSD: knownhosts-command.sh,v 1.4 2025/05/06 06:05:48 djm Exp $ +# $OpenBSD: knownhosts-command.sh,v 1.5 2026/06/14 04:08:05 djm Exp $ # Placed in the Public Domain. tid="known hosts command " @@ -38,7 +38,10 @@ _EOF chmod a+x $OBJ/knownhosts_command ${SSH} -F $OBJ/ssh_proxy x true && fail "ssh connect succeeded with bad exit" +cp $OBJ/sshd_proxy $OBJ/sshd_proxy.bak for keytype in ${SSH_HOSTKEY_TYPES} ; do + grep -vi HostKeyAlgorithms $OBJ/sshd_proxy.bak > $OBJ/sshd_proxy + echo "HostKeyAlgorithms=+$keytype" >> $OBJ/sshd_proxy algs=$keytype test "x$keytype" = "xssh-rsa" && algs=ssh-rsa,rsa-sha2-256,rsa-sha2-512 verbose "keytype $keytype" diff --git a/regress/unittests/Makefile b/regress/unittests/Makefile index 8d7a6b1e3d8e..5d482eab4a85 100644 --- a/regress/unittests/Makefile +++ b/regress/unittests/Makefile @@ -1,6 +1,6 @@ -# $OpenBSD: Makefile,v 1.14 2026/05/31 11:39:44 djm Exp $ +# $OpenBSD: Makefile,v 1.15 2026/06/14 04:08:05 djm Exp $ SUBDIR= test_helper sshbuf sshkey bitmap kex hostkeys utf8 match conversion -SUBDIR+=authopt misc sshsig servconf +SUBDIR+=authopt misc sshsig servconf crypto .include diff --git a/regress/unittests/authopt/Makefile b/regress/unittests/authopt/Makefile index a7b8a867da3d..e8accee189ca 100644 --- a/regress/unittests/authopt/Makefile +++ b/regress/unittests/authopt/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.12 2026/02/06 23:39:14 dtucker Exp $ +# $OpenBSD: Makefile,v 1.13 2026/06/14 04:08:05 djm Exp $ PROG=test_authopt SRCS=tests.c @@ -14,7 +14,7 @@ SRCS+=addr.c addrmatch.c bitmap.c SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c SRCS+=ssherr-libcrypto.c - +SRCS+=ssh-mldsa-eddsa.c libcrux-mlkem-mldsa.c SRCS+=digest-openssl.c ed25519-openssl.c #SRCS+=digest-libc.c ed25519.c SRCS+=utf8.c diff --git a/regress/unittests/crypto/Makefile b/regress/unittests/crypto/Makefile new file mode 100644 index 000000000000..0a99e47170fb --- /dev/null +++ b/regress/unittests/crypto/Makefile @@ -0,0 +1,26 @@ +# $OpenBSD: Makefile,v 1.1 2026/06/14 04:08:05 djm Exp $ + +PROG=test_crypto +SRCS=tests.c +SRCS+=test_mldsa.c +SRCS+=test_mlkem.c +SRCS+=test_ed25519.c +SRCS+=test_mldsa_eddsa.c + +# From usr.bin/ssh +SRCS+=sshbuf-getput-basic.c sshbuf-getput-crypto.c sshbuf-misc.c sshbuf.c +SRCS+=sshbuf-io.c atomicio.c sshkey.c authfile.c cipher.c log.c ssh-rsa.c +SRCS+=ssh-ecdsa.c ssh-ed25519.c mac.c umac.c umac128.c hmac.c misc.c +SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c +SRCS+=addr.c addrmatch.c bitmap.c +SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c +SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c +SRCS+=utf8.c ssherr-libcrypto.c libcrux-mlkem-mldsa.c ssh-mldsa-eddsa.c + +SRCS+=digest-openssl.c ed25519-openssl.c +#SRCS+=digest-libc.c ed25519.c + +run-regress-${PROG}: ${PROG} + env ${TEST_ENV} ./${PROG} ${UNITTEST_ARGS} -d ${.CURDIR}/testdata + +.include diff --git a/regress/unittests/crypto/test_ed25519.c b/regress/unittests/crypto/test_ed25519.c new file mode 100644 index 000000000000..5c554ace5532 --- /dev/null +++ b/regress/unittests/crypto/test_ed25519.c @@ -0,0 +1,104 @@ +/* $OpenBSD: test_ed25519.c,v 1.1 2026/06/14 04:08:05 djm Exp $ */ +/* + * Regress test for Ed25519 keypair from seed + * + * Placed in the public domain + */ + +#include +#include +#include +#include +#include + +#include "../test_helper/test_helper.h" +#include "crypto_api.h" +#include "xmalloc.h" + +struct ed25519_kat { + const char *sk; + const char *pk; + const char *msg; + const char *sig; +}; + +static const struct ed25519_kat ed25519_kats[] = { + { + "9d61b19deffd5a60ba844af492ec2cc44449c569" + "7b326919703bac031cae7f60", + "d75a980182b10ab7d54bfed3c964073a0ee172f3" + "daa62325af021a68f707511a", + "", + "e5564300c360ac729086e2cc806e828a84877f1e" + "b8e5d974d873e065224901555fb8821590a33bac" + "c61e39701cf9b46bd25bf5f0595bbe2465514143" + "8e7a100b" + }, + { + "4ccd089b28ff96da9db6c346ec114e0f5b8a319f" + "35aba624da8cf6ed4fb8a6fb", + "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf" + "2ec4968cc0cd55f12af4660c", + "72", + "92a009a9f0d4cab8720e820b5f642540a2b27b54" + "16503f8fb3762223ebdb69da085ac1e43e15996e" + "458f3613d0f11d8c387b2eaeb4302aeeb00d2916" + "12bb0c00" + }, + { + "c5aa8df43f9f837bedb7442f31dcb7b166d38535" + "076f094b85ce3a2e0b4458f7", + "fc51cd8e6218a1a38da47ed00230f0580816ed13" + "ba3303ac5deb911548908025", + "af82", + "6291d657deec24024827e69c3abe01a30ce548a2" + "84743a445e3680d7db5ac3ac18ff9b538d16f290" + "ae67f760984dc6594a7c15e9716ed28dc027bece" + "ea1ec40a" + } +}; + +void ed25519_tests(void); + +static void +hex2bin(uint8_t *bin, const char *hex, size_t len) +{ + size_t i; + for (i = 0; i < len; i++) + sscanf(hex + i * 2, "%02hhx", &bin[i]); +} + +void +ed25519_tests(void) +{ + uint8_t pk[32], sk[64], seed[32]; + uint8_t expected_pk[32], expected_sig[64]; + uint8_t *msg, *tmp; + size_t i, msglen; + unsigned long long smlen; + + for (i = 0; i < sizeof(ed25519_kats)/sizeof(ed25519_kats[0]); i++) { + TEST_START("Ed25519 keypair from seed"); + hex2bin(seed, ed25519_kats[i].sk, 32); + hex2bin(expected_pk, ed25519_kats[i].pk, 32); + ASSERT_INT_EQ(crypto_sign_ed25519_keypair_from_seed(pk, sk, seed), 0); + ASSERT_MEM_EQ(pk, expected_pk, 32); + TEST_DONE(); + + TEST_START("Ed25519 sign/verify KAT"); + msglen = strlen(ed25519_kats[i].msg) / 2; + msg = malloc(msglen + 64); + tmp = malloc(msglen + 64); + hex2bin(msg + 64, ed25519_kats[i].msg, msglen); + hex2bin(expected_sig, ed25519_kats[i].sig, 64); + + ASSERT_INT_EQ(crypto_sign_ed25519(msg, &smlen, msg + 64, msglen, sk), 0); + ASSERT_MEM_EQ(msg, expected_sig, 64); + + ASSERT_INT_EQ(crypto_sign_ed25519_open(tmp, &smlen, msg, msglen + 64, pk), 0); + ASSERT_INT_EQ(smlen, msglen); + free(msg); + free(tmp); + TEST_DONE(); + } +} diff --git a/regress/unittests/crypto/test_mldsa.c b/regress/unittests/crypto/test_mldsa.c new file mode 100644 index 000000000000..c9c796d799b6 --- /dev/null +++ b/regress/unittests/crypto/test_mldsa.c @@ -0,0 +1,143 @@ +/* $OpenBSD: test_mldsa.c,v 1.1 2026/06/14 04:08:06 djm Exp $ */ +/* + * Regress test for ML-DSA + * + * Placed in the public domain + */ + +#include +#include +#include +#include +#include + +#include "../test_helper/test_helper.h" +#include "crypto_api.h" +#include "xmalloc.h" +#include "sshbuf.h" + +/* in tests.c */ +struct sshbuf *load_text_file(const char *name); +char *get_json_string(struct sshbuf *content, const char *key, int consume); + +void mldsa_tests(void); + +struct kat { + char *seed; + char *pk_hash; + char *sk_hash; + char *msg; + char *rand; + char *sig_hash; +}; + +static void +load_kats(const char *file, struct kat ***katsp, size_t *nkatsp) +{ + struct sshbuf *json_buf; + struct kat *kat = NULL, **kats = NULL; + size_t nkats = 0; + + json_buf = load_text_file(file); + while (sshbuf_find(json_buf, 0, "key_generation_seed", + strlen("key_generation_seed"), NULL) == 0) { + kat = xcalloc(1, sizeof(*kat)); + kat->seed = get_json_string(json_buf, "key_generation_seed", 1); + kat->pk_hash = get_json_string(json_buf, + "sha3_256_hash_of_verification_key", 1); + kat->sk_hash = get_json_string(json_buf, + "sha3_256_hash_of_signing_key", 1); + kat->msg = get_json_string(json_buf, "message", 1); + kat->rand = get_json_string(json_buf, "signing_randomness", 1); + kat->sig_hash = get_json_string(json_buf, + "sha3_256_hash_of_signature", 1); + kats = xrecallocarray(kats, nkats, nkats + 1, sizeof(*kats)); + kats[nkats++] = kat; + } + *katsp = kats; + *nkatsp = nkats; + sshbuf_free(json_buf); +} + +static void +free_kats(struct kat **kats, size_t nkats) +{ + size_t i; + struct kat *kat; + + for (i = 0; i < nkats; i++) { + kat = kats[i]; + free(kat->seed); + free(kat->pk_hash); + free(kat->sk_hash); + free(kat->msg); + free(kat->rand); + free(kat->sig_hash); + free(kat); + } + free(kats); +} + +static void +hex2bin(uint8_t *bin, const char *hex, size_t len) +{ + size_t i; + for (i = 0; i < len; i++) + sscanf(hex + i * 2, "%02hhx", &bin[i]); +} + +void +mldsa_tests(void) +{ + uint8_t pk[MLDSA44_PUBLICKEYBYTES]; + uint8_t sk[MLDSA44_SECRETKEYBYTES]; + uint8_t sig[MLDSA44_SIGBYTES]; + uint8_t pk_hash[32], sk_hash[32], sig_hash[32]; + uint8_t expected_pk_hash[32], expected_sk_hash[32]; + uint8_t expected_sig_hash[32]; + uint8_t seed[32], rand[32]; + uint8_t *msg; + size_t nkats, i, msglen; + struct kat **kats, *kat; + + TEST_START("ML-DSA 44 KATs"); + load_kats("nistkats-44.json", &kats, &nkats); + for (i = 0; i < nkats; i++) { + kat = kats[i]; + test_subtest_info("vector %zu", i); + + hex2bin(seed, kat->seed, 32); + hex2bin(expected_pk_hash, kat->pk_hash, 32); + hex2bin(expected_sk_hash, kat->sk_hash, 32); + + /* Keypair generation */ + ASSERT_INT_EQ(crypto_sign_mldsa44_keypair_seeded(pk, + sk, seed), 0); + + sha3_256(pk_hash, pk, sizeof(pk)); + sha3_256(sk_hash, sk, sizeof(sk)); + + ASSERT_MEM_EQ(pk_hash, expected_pk_hash, 32); + ASSERT_MEM_EQ(sk_hash, expected_sk_hash, 32); + + msglen = strlen(kat->msg) / 2; + msg = malloc(msglen); + hex2bin(msg, kat->msg, msglen); + hex2bin(rand, kat->rand, 32); + hex2bin(expected_sig_hash, kat->sig_hash, 32); + + /* Signing */ + ASSERT_INT_EQ(crypto_sign_mldsa44_seeded(sig, msg, + msglen, NULL, 0, sk, rand), 0); + + sha3_256(sig_hash, sig, sizeof(sig)); + ASSERT_MEM_EQ(sig_hash, expected_sig_hash, 32); + + /* Verification */ + ASSERT_INT_EQ(crypto_sign_mldsa44_verify(sig, msg, + msglen, NULL, 0, pk), 0); + free(msg); + } + free_kats(kats, nkats); + TEST_DONE(); +} diff --git a/regress/unittests/crypto/test_mldsa_eddsa.c b/regress/unittests/crypto/test_mldsa_eddsa.c new file mode 100644 index 000000000000..b9549e94d9e4 --- /dev/null +++ b/regress/unittests/crypto/test_mldsa_eddsa.c @@ -0,0 +1,192 @@ +/* $OpenBSD: test_mldsa_eddsa.c,v 1.1 2026/06/14 04:08:06 djm Exp $ */ +/* + * Regress test for MLDSA44-Ed25519 composite signature + * + * Placed in the public domain + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../test_helper/test_helper.h" +#include "crypto_api.h" +#include "ssherr.h" +#include "sshkey.h" +#include "sshbuf.h" +#include "log.h" + +/* in tests.c */ +struct sshbuf *load_text_file(const char *name); +char *get_json_string(struct sshbuf *content, const char *key, int consume); + +void mldsa_eddsa_tests(void); + +/* + * Simple JSON-ish parser for tvec.json. + * Extracts the base64 value for a given key and decodes it into a new sshbuf. + * Errors cause ASSERT_* failures. + */ +static struct sshbuf * +get_json_b64(struct sshbuf *content, const char *key) +{ + char *b64; + struct sshbuf *ret; + + b64 = get_json_string(content, key, 0); + ASSERT_PTR_NE(ret = sshbuf_new(), NULL); + ASSERT_INT_EQ(sshbuf_b64tod(ret, b64), 0); + free(b64); + return ret; +} + +static void +onerror(void *fuzz) +{ + fprintf(stderr, "Failed during fuzz:\n"); + fuzz_dump((struct fuzz *)fuzz); +} + +static void +sig_fuzz(const uint8_t *m, size_t m_len, const uint8_t *ctx, size_t ctx_len, + const uint8_t *pk, const uint8_t *s) +{ + struct fuzz *fuzz; + u_int fuzzers = FUZZ_1_BIT_FLIP | FUZZ_1_BYTE_FLIP; + + if (test_is_fast()) + fuzzers &= ~FUZZ_1_BIT_FLIP; + if (test_is_slow()) + fuzzers |= FUZZ_2_BYTE_FLIP; /* FUZZ_2_BIT_FLIP much too slow */ + + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(s, m, m_len, + ctx, ctx_len, pk), 0); + fuzz = fuzz_begin(fuzzers, s, MLDSA44_ED25519_SIG_SZ); + TEST_ONERROR(onerror, fuzz); + for(; !fuzz_done(fuzz); fuzz_next(fuzz)) { + /* Ensure 1-bit difference at least */ + if (fuzz_matches_original(fuzz)) + continue; + ASSERT_INT_NE(crypto_sign_mldsa44_ed25519_verify(fuzz_ptr(fuzz), + m, m_len, ctx, ctx_len, pk), 0); + } + fuzz_cleanup(fuzz); +} + + +void +mldsa_eddsa_tests(void) +{ + uint8_t pk[MLDSA44_ED25519_PK_SZ]; + uint8_t sk[MLDSA44_ED25519_SK_SZ]; + uint8_t sig[MLDSA44_ED25519_SIG_SZ]; + struct sshbuf *b_m = NULL, *b_ctx = NULL, *b_pk = NULL; + struct sshbuf *b_sk = NULL, *b_s = NULL, *b_sWithContext = NULL; + struct sshbuf *json_buf = NULL; + const uint8_t *tvec_m; + size_t tvec_m_len; + const uint8_t *tvec_ctx; + size_t tvec_ctx_len; + const uint8_t *tvec_pk; + const uint8_t *tvec_sk; + const uint8_t *tvec_s; + const uint8_t *tvec_sWithContext; + + TEST_START("MLDSA44-Ed25519-SHA512 load test vectors"); + json_buf = load_text_file("draft-ietf-lamps-pq-composite-sigs.json"); + b_m = get_json_b64(json_buf, "m"); + b_ctx = get_json_b64(json_buf, "ctx"); + b_pk = get_json_b64(json_buf, "pk"); + b_sk = get_json_b64(json_buf, "sk"); + b_s = get_json_b64(json_buf, "s"); + b_sWithContext = get_json_b64(json_buf, "sWithContext"); + ASSERT_INT_EQ(sshbuf_len(b_pk), MLDSA44_ED25519_PK_SZ); + ASSERT_INT_EQ(sshbuf_len(b_sk), MLDSA44_ED25519_SK_SZ); + ASSERT_INT_EQ(sshbuf_len(b_s), MLDSA44_ED25519_SIG_SZ); + ASSERT_INT_EQ(sshbuf_len(b_sWithContext), MLDSA44_ED25519_SIG_SZ); + TEST_DONE(); + + tvec_m = sshbuf_ptr(b_m); + tvec_m_len = sshbuf_len(b_m); + tvec_ctx = sshbuf_ptr(b_ctx); + tvec_ctx_len = sshbuf_len(b_ctx); + tvec_pk = sshbuf_ptr(b_pk); + tvec_sk = sshbuf_ptr(b_sk); + tvec_s = sshbuf_ptr(b_s); + tvec_sWithContext = sshbuf_ptr(b_sWithContext); + + TEST_START("MLDSA44-Ed25519-SHA512 raw self-consistency"); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_keygen(pk, sk), 0); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_sign(sig, + tvec_m, tvec_m_len, tvec_ctx, tvec_ctx_len, sk), 0); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(sig, + tvec_m, tvec_m_len, tvec_ctx, tvec_ctx_len, pk), 0); + TEST_DONE(); + + TEST_START("MLDSA44-Ed25519-SHA512 raw KAT key expansion"); + uint8_t pk_expanded[MLDSA44_ED25519_PK_SZ]; + uint8_t sk_expanded[MLDSA44_ED25519_SK_SZ]; + + /* Expansion: mldsa_seed (sk[0:32]) and ed25519_seed (sk[32:64]) */ + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_keygen_seeded(pk_expanded, + sk_expanded, tvec_sk, tvec_sk + 32), 0); + ASSERT_MEM_EQ(pk_expanded, tvec_pk, MLDSA44_ED25519_PK_SZ); + /* sk_expanded should also match tvec_sk */ + ASSERT_MEM_EQ(sk_expanded, tvec_sk, MLDSA44_ED25519_SK_SZ); + TEST_DONE(); + + TEST_START("MLDSA44-Ed25519-SHA512 raw KAT verify (no context)"); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(tvec_s, tvec_m, + tvec_m_len, NULL, 0, tvec_pk), 0); + TEST_DONE(); + + TEST_START("MLDSA44-Ed25519-SHA512 raw KAT verify (with context)"); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(tvec_sWithContext, + tvec_m, tvec_m_len, tvec_ctx, tvec_ctx_len, tvec_pk), 0); + TEST_DONE(); + + TEST_START("MLDSA44-Ed25519-SHA512 raw round-trip (no context)"); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_sign(sig, tvec_m, tvec_m_len, + NULL, 0, tvec_sk), 0); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(sig, + tvec_m, tvec_m_len, NULL, 0, tvec_pk), 0); + TEST_DONE(); + + TEST_START("MLDSA44-Ed25519-SHA512 raw round-trip (with context)"); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_sign(sig, + tvec_m, tvec_m_len, tvec_ctx, tvec_ctx_len, tvec_sk), 0); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(sig, + tvec_m, tvec_m_len, tvec_ctx, tvec_ctx_len, tvec_pk), 0); + TEST_DONE(); + + TEST_START("MLDSA44-Ed25519-SHA512 raw KAT verify (no context)"); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(tvec_s, tvec_m, + tvec_m_len, NULL, 0, tvec_pk), 0); + TEST_DONE(); + + TEST_START("MLDSA44-Ed25519-SHA512 fuzz raw verify (with context)"); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(tvec_sWithContext, + tvec_m, tvec_m_len, tvec_ctx, tvec_ctx_len, tvec_pk), 0); + sig_fuzz(tvec_m, tvec_m_len, NULL, 0, tvec_pk, tvec_s); + TEST_DONE(); + + TEST_START("MLDSA44-Ed25519-SHA512 fuzz raw verify (with context)"); + ASSERT_INT_EQ(crypto_sign_mldsa44_ed25519_verify(tvec_sWithContext, + tvec_m, tvec_m_len, tvec_ctx, tvec_ctx_len, tvec_pk), 0); + sig_fuzz(tvec_m, tvec_m_len, tvec_ctx, tvec_ctx_len, + tvec_pk, tvec_sWithContext); + TEST_DONE(); + + sshbuf_free(json_buf); + sshbuf_free(b_m); + sshbuf_free(b_ctx); + sshbuf_free(b_pk); + sshbuf_free(b_sk); + sshbuf_free(b_s); + sshbuf_free(b_sWithContext); +} diff --git a/regress/unittests/crypto/test_mlkem.c b/regress/unittests/crypto/test_mlkem.c new file mode 100644 index 000000000000..9cd7183e2fd8 --- /dev/null +++ b/regress/unittests/crypto/test_mlkem.c @@ -0,0 +1,167 @@ +/* $OpenBSD: test_mlkem.c,v 1.1 2026/06/14 04:08:06 djm Exp $ */ +/* + * Regress test for ML-KEM + * + * Placed in the public domain + */ + +#include +#include +#include +#include +#include + +#include "../test_helper/test_helper.h" +#include "crypto_api.h" + +struct mlkem768_kat { + const char *seed; + const char *pk_hash; + const char *sk_hash; + const char *enc_seed; + const char *ct_hash; + const char *shared_secret; +}; + +static const struct mlkem768_kat mlkem768_kats[] = { + { + "7c9935a0b07694aa0c6d10e4db6b1add2fd81a25" + "ccb148032dcd739936737f2d" + "8626ed79d451140800e03b59b956f8210e556067" + "407d13dc90fa9e8b872bfb8f", + "f57262661358cde8d3ebf990e5fd1d5b896c992c" + "cfaadb5256b68bbf5943b132", + "7deef44965b03d76de543ad6ef9e74a2772fa5a9" + "fa0e761120dac767cf0152ef", + "147c03f7a5bebba406c8fae1874d7f13c80efe79" + "a3a9a874cc09fe76f6997615", + "6e777e2cf8054659136a971d9e70252f30122693" + "0c19c470ee0688163a63c15b", + "e7184a0975ee3470878d2d159ec83129c8aec253" + "d4ee17b4810311d198cd0368" + }, + { + "d60b93492a1d8c1c7ba6fc0b733137f3406cee81" + "10a93f170e7a78658af326d9" + "003271531cf27285b8721ed5cb46853043b346a6" + "6cba6cf765f1b0eaa40bf672", + "7b00751eb9b1253231213f8a14f06f0fe1b7a4fd" + "b7d1cfe44c161e577e5e8f0a", + "3a8c009e8e648ac572d5592e4a92907fae0c1767" + "be41c544b59dc3ffe61f7ded", + "cde797df8ce67231f6c5d15811843e01eb2ab84c" + "7490931240822adbddd72046", + "bce1bf3450f574130b9561ee11565fa41d599d05" + "d2136f10ad2c013eb5d13ca9", + "5f0c5d9f39d3e724b5a2bd54e69e360f72ffab5d" + "4d6cc5e572fecba80acd4796" + }, + { + "4b622de1350119c45a9f2e2ef3dc5df50a759d13" + "8cdfbd64c81cc7cc2f513345" + "e82fcc97ca60ccb27bf6938c975658aeb8b4d37c" + "ffbde25d97e561f36c219ade", + "9bda55b63cffa9bf953993918b18cd6595ea6433" + "b479e89b5cd3c9339e4468cb", + "d5fc96564df6e53622b2db8295a80a44e3bad714" + "7696e2ad1f728639c98791b1", + "f43f68fbd694f0a6d307297110ecd4739876489f" + "df07eb9b03364e2ed0ff96e9", + "2a8b5d9bdcac1b7ffb6d655368e15148308eee98" + "ae34f4105eaae87f24a008a2", + "7f3bcc03a35a0030255264914e5d88a0c93611c7" + "ca21f0609678a88ca42ce1c9" + }, + { + "050d58f9f757edc1e8180e3808b806f5bbb3586d" + "b3470b069826d1bb9a4efc2c" + "de950541fd53a8a47aaa8cdfe80d928262a5ef7f" + "8129ec3ef92f78d7cc32ef60", + "647a81f0f1b3e3dacb6e73e900f7c078cdfaa711" + "9a5ede48c7685fdb7e0fe2f5", + "1cf686cb8732c73a38b35d73b0b28fb120bc89cd" + "a1554d9f12adedc057862081", + "ea74fbc3c546500ed684bed6fe3c496d3b86d2d6" + "dfaf223969b942e9a8c95e85", + "1c51c85ce66d80c1f9bb138e5bce84dd75cee426" + "0c8817e06c6f2bd920601530", + "c630736985fdb7830d7446e18b6b81fa4a707a60" + "58964b99190120de85e7559c" + }, + { + "66b79b844e0c2adad694e0478661ac46fe6b6001" + "f6a71ff8e2f034b1fd8833d3" + "be2d3c64d38269a1ee8660b9a2beaeb9f5ac022e" + "8f0a357feebfd13b06813854", + "811aea11a24a4b09e428415f82ee836e930c3b77" + "867aafc5e6728149e3f2bd1b", + "6a1ff1351c538a5661fc3576c29408c19f42da36" + "88fa16f9ec5ead6a84420db5", + "64efa87a12cb96f98b9b81a7e5128a959c74e533" + "2aaab0444fca7b4a5e5e0216", + "db4dedc1e4d383acaf974fb50ffbf881bd3938ad" + "196fb9aebeeb1bf1ddc94e10", + "41e078d0d0c4fe5df5c6683171d5c1c3f1ef152c" + "4945f9cb299f74278ce4cc4f" + } +}; + +void mlkem_tests(void); + +static void +hex2bin(uint8_t *bin, const char *hex, size_t len) +{ + size_t i; + for (i = 0; i < len; i++) + sscanf(hex + i * 2, "%02hhx", &bin[i]); +} + +void +mlkem_tests(void) +{ + uint8_t pk[MLKEM768_PUBLICKEYBYTES]; + uint8_t sk[MLKEM768_SECRETKEYBYTES]; + uint8_t ct[MLKEM768_CIPHERTEXTBYTES]; + uint8_t shared_secret[MLKEM768_BYTES], shared_secret2[MLKEM768_BYTES]; + uint8_t pk_hash[32], sk_hash[32], ct_hash[32]; + uint8_t expected_pk_hash[32], expected_sk_hash[32]; + uint8_t expected_ct_hash[32], expected_shared_secret[32]; + uint8_t seed[64], enc_seed[32]; + size_t i; + + TEST_START("ML-KEM 768 KATs"); + for (i = 0; i < sizeof(mlkem768_kats) / sizeof(mlkem768_kats[0]); i++) { + test_subtest_info("vector %zu", i); + + hex2bin(seed, mlkem768_kats[i].seed, 64); + hex2bin(expected_pk_hash, mlkem768_kats[i].pk_hash, 32); + hex2bin(expected_sk_hash, mlkem768_kats[i].sk_hash, 32); + + /* Keypair generation */ + ASSERT_INT_EQ(crypto_kem_mlkem768_keypair_seeded(pk, sk, seed), 0); + + sha3_256(pk_hash, pk, sizeof(pk)); + sha3_256(sk_hash, sk, sizeof(sk)); + + ASSERT_MEM_EQ(pk_hash, expected_pk_hash, 32); + ASSERT_MEM_EQ(sk_hash, expected_sk_hash, 32); + + hex2bin(enc_seed, mlkem768_kats[i].enc_seed, 32); + hex2bin(expected_ct_hash, mlkem768_kats[i].ct_hash, 32); + hex2bin(expected_shared_secret, + mlkem768_kats[i].shared_secret, 32); + + /* Encapsulation */ + ASSERT_INT_EQ(crypto_kem_mlkem768_enc_seeded(ct, shared_secret, + pk, enc_seed), 0); + + sha3_256(ct_hash, ct, sizeof(ct)); + ASSERT_MEM_EQ(ct_hash, expected_ct_hash, 32); + ASSERT_MEM_EQ(shared_secret, expected_shared_secret, 32); + + /* Decapsulation */ + ASSERT_INT_EQ(crypto_kem_mlkem768_dec(shared_secret2, ct, sk), 0); + ASSERT_MEM_EQ(shared_secret, shared_secret2, 32); + } + TEST_DONE(); +} diff --git a/regress/unittests/crypto/testdata/draft-ietf-lamps-pq-composite-sigs.json b/regress/unittests/crypto/testdata/draft-ietf-lamps-pq-composite-sigs.json new file mode 100644 index 000000000000..69d0281968c5 --- /dev/null +++ b/regress/unittests/crypto/testdata/draft-ietf-lamps-pq-composite-sigs.json @@ -0,0 +1,8 @@ + { + "m": "VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4=", + "ctx": "VGhlIGxldGhhcmdpYywgY29sb3JsZXNzIGRvZyBzYXQgYmVuZWF0aCB0aGUgZW5lcmdldGljLCBzdGF0aW9uYXJ5IGZveC4=", + "pk": "FlplaQIgVuYEA04nN9VXyMWK4XDhRhnaGaWO6FqoCtiDr5rL89omEFSIf811XxbbHpKBJzROqBqKfbPgsrMRZjBdHeRn5Oi4pK7bshdjBkXm7yCqPfMC50PkzKI5CFTsw13ikA4UmJuBupSxXDzhEchHLCybpQPBdr++Tr4NKh0cEaDi9GFlDdzLsDP/1d9Dh1N57rHOCPLi/7tjmqPYrCzFspEADbBkKBfwNgPRajzMl8FnQB8qQfMzK5tiO6jKEb+fd0C5UhwOYe4NXLazpqGtsV82Z0IC1DrQvHXNvePyHT/hOASYQQKM7D8MUSs954UFZPYFqvQrh1JyRl+87cFioQGOjfn3tt2uhYpMqzyRyeaywjwq8tyJC4ZAGuTTfDqXr76QdvTB4lKX42llgyIIdBwc4DBjugWYEiVR/PxGmzwyIBSM9PgXPAW+ijfEkyqayX0cPQRFaqi6JKxhg0iWADGTssEK8ofZwz4N711co7LRNSqfcRFb+QT9v3aAQS/VZsxyTybLHLpACDsq9qDCctewHEKZpVazOFRkTZlTIsp/YBd9avMTFWIgaxRjnuKiaLpMek0Hlx9BdvSQM9b7zFlIMGw11HBBtg/R22UfK+x2zNqSZeS3ZN6fylfum2YAm7IrNzn4car8g64DfQ6AMZHePK4eql5d5n8iShRAFTRg8jGv6pkaQBM1OaPcWMba1eDicN5pyCaYgwrhYy2yVN3uTOF4/Z1pxZ8XQ3Dx6zkA79f4P7dNhjGdYnlBH1wAnwTdGeP4epk3aF3jR/JJjRx0MxevLEYKN3DrSE580KWTmGEMM9UQcPz9sJ/+VgNkgRKGRXhw001q8vAzEhriL8mFnZhBaCNvGTbckPTH4ri3qWHbiDpztzjqKg7/bmZflQ7N7y3eX8wWSZ0g0Yh9KDJqwsIc7maoD20LxQRCr2dQZJ8mNOjsr+NonCDPBA4usp9i16WU1bBwRb81p+K6MWrax+wG+m2eBn/n/tkXBYYy1r0fBfiTizFQY6bna0HSzXqHkwwmDYc20ZGo77JE4bBlagKFQ12W74bSe7HwP28DxtvWKW56Is6lMuqZVkg8GQMW4Iz3hX9SKBe6/tw06PegPDbp/RfFAxzq9vcb5FU9kshMdnvTAY6I7OjgVGR8FXN4iZARzU5+BBQa4QblkxDUyiPLSjSSAX3oKkWmu9S9LxmrhsHgd2KOqbZL19EoZrx+eQyseaLjDuF569Da6V133Nqej46CPTZNp6ojwNSAjPY2ai1D0hZ8GQpTaeTRRiVcFUps4UHRCsUbBSTC5RJLVoGqj0eORAhib4xp7DGlKf7s1j88ZH1OgOw/rIbFMsyKSQsKKmI22Bo3FW2iVL/SoPGOKDupMQJvolkieVqK0DjUxsfDLf/VpkrM6fH3FIiw6Dz7vSz3CfUIQ0gDfQi/w08WWCP706VHeDwX1rscAvn2Cc6/q3TbP9bMYoEvS04p5LPGeHtvX/PVyfv9JNqAbrRVmtuTAd1rQhiPNHK5JH5feweblxNOsluNH5iJ2tH70R/3LcbL6jiHS9DfoxzHPnX3arWpVF1ZZ4aZivePAOX8B9J7zbxdhhdU1eUNFt+sEuGyA6VsTsHf8fZeXpbPwy1OBRMmNiJ3wG+VQC7guTMjnhs7kljuWlhZ1MlsnGroX7y51x2l78r3ntwiXkpyfpOBiDezTHPu8kYMNkLaZWeo4bygR04SD75GmjwkYGAXKSvL2XMqT8iCO8wQRrKneIeBgmQKojolj5EQlQIYptCzHjq0kVVout5a", + "sk": "AdjfWRUtikTjmiXmd17xigBEsg5YwsQ0asN8J9FSF2xb6mwkVGF7+0hHnrixO3EamBFrc/fsrDD68d2bT6F9aA==", + "s": "jf3ldp/wzf7aHNAWXPULSa7WoqVbFXac+zkQpMtFRz/dQd8bbXrttS+XKo7F/zb0ZuRfHteGNNoSVnkUvPU0i2Y1rVtgY5j7DlHKGSgk+WncxH+nusXYb4kjltDPZe4A/yvGSD6Boaq/09Yr/edE79gSs1bkNyLL7Qa33BhiZEUAT4d3SDhi2WiPtv5gkiwRGrGs4PiRkkn9gTTPVHDlct1jpfip0lDt5BWXY214k013ZKL0a+55lmMEXmyrdSTi6PdBUEQ61OCiiWEYDateWKRqZgj04qCQFJ4EdyAxVnQkN7bO1+OZdE539uNDNs9nqToegkw1AE+Iew6WGpmD4at8EyKC46OsHbCYgLzXgNBUqQEWuGUdb9JjXJx6Ycir4S1dZVcSSMopyNPfNoNrkVcQrjXuCEh2wcUNq8YcYF8EapDBTZVdcGrkGeg7/kBexN/7jBXbTBfR0dXfX/EsLPXRoWr4jW9IfTPWzaWjZijzndJXb8Mbf+PxhVQAH4fKPzMUYXsnSVLjgYv4/EIqzC4CNXU2y3zEF+0EBVG0sF0KKfzuAWvRA2Sfoy6TLotPvj574MoWoUSym9Fvk60MHmtUvUow4AAQEgjAPdR1zpJsnKdmZUWKrf2MAB5powP7G94qywlLDlH93r9RarI90hGVdhaIoGdEU+e7A+i5Uj65AIQJGcHFxeHC1gQ+gjTlVTyJt6TFmlCAcj8aLlOpQXO4TTq5Y3izgAZs92t2Nrpx8GByKgC7OHYG+aYo3Z+KvIANyfh377cogp8+tW/YQchb/22l96/q3scWIViA+AKVRJnrOOYaaL9PHrCeG81b/QUClZrmFozUiU7yyv++J6orbIDXw5rGYEPaA618km10q0Podyy2WZvldOyR5MH238zql1lu1QIGL19ivHCnwJFtE9mJQJbZ+hUk/OLfdRN025junC6h1XP52zVDu4Eb/syrGu59ox5+JyF8czYVNQhfFjWD7+Dbw5BUemv3388zjgY3q9mOfZexZglIBGvRccBuNaPnPDkxVF8o64gHgV/ydyAUcq7kIKmUfi6geORAXtCjEtLQEDnkxGX/iS7mokZ9mrb7TfygiuG93+PPlxNu9PNG7ISXrGFFAwdZCPOyyiHIU1EquBehWnmvdcM0vt0BVz35hZq2LhcWW74xCMVpScU8CypJZCkgj8ZtDUgl5z7ZfpX9OZ21glJK9s/UQOmfoFZLYhszBB21S4X2nhKEOgFv8JW48SQzVoWLlATXen0UomBn3rh4PY+dmRGwj0gxEVGMDTeSRsF/jF0l0GV437hvP4UlYaAVfc50RTOFargFEBS91YLFNfpcq5PMECgwJc5EC/iK5FR2EXYJQM7xj0a5OH+qtVO+xNVlMJT7AXQ960ie+IxvqAyHuRCXUKyi14KOdLFH5iGL0VsB8VZ1RtfU1wkwHyKkqioFE5LaoZ6MPoYMtPvRf+/nOak9m6bwtF5IxrAS1fRGTTJmMlNK3xzMwwQsurt5KBaFBdE0FYOV01A0xMpN5Wo3YFpoOebnRYxXHdwDLZZ1UAfokYkf+mS53h8xLI2mSW4J9LQaDg/y/sDuZPGIqKTyjlvc/X8zN3UvQpXb8lAHAAfbo3Xj5mkGWUglUDBnIP378angbNEIzLZcuPsfrfcSGU0ki4zM4adptxGY5LX7DinlQ6Pe4FO39BURjnYBrVH+zFQu20WfLrwBthjInasLUUUvdBew+n1/gHaxDKqAIvfBubWXJdZpPqwT9wsHBwcKQhrXxnVDXeQD2n0Vxw4tMXc3KFVUEoLRxTWQlVveaJK3zSo8XZOLS4WqEJoMweOGOAMjny6UUAjTl7wlMHOukwVK5jPCrATL40V0QvMNP08uy76fMkIFOgXvn1UmeKE1+PP6k8iX4UiVxAbkAkHVc2bA7pPHot0Eii6QvEtZGrXATpIEcbN1FdS2FmxZ/Jw+Ln+8uTviKuvlcUBXTte1MSWu2pw/V2HskCGoxsvoyGIP3qRwooxEzPrN7IBLJVOpBj67dzxfoRwFIpGBrldINyQVxT9ENgwWnTCzrI+1yZfhTlNnpw7gugImTMm9TVhFOA9kJKT/hPxq3Hyp/WJDYP/qa+O7hL8zob6UBDuCgJToU3B5TXJNl2YGnmUF6TwyWt90l6kgBTqEX7PoaoFsXUdnAHtVc4BCqMGK+fDYlrZs7PgaQbeCVcUKComEMUvg37D2OByl+kaLUbWTCyv3ajWC7teAPSRTziIArC2YKJkHktKVssnUQWLKCqWmNkX9OzsaGzDFtP+2QOEVTnydi/Zv25WuYPN9QifZmBz59vm/7vl89loTK9LegfGjSk0U0scZGDnc7hMYKbo63mwifYY2hS26qb0ZFOioUfjrQgqoHzdvBcJpvJDaR3IeL9qy5LHgXfWu/Og4f7PAjX6e3mpyUA1XfxIXBT9VsuptCNnJxFBzG6V5eNPi4ZgDa3jEW3ZYs9JRUZbGQtSuTRg2JlS+xe7/HNZPzP8ALwsaJ4zkRdEe55lqNW9nF9XiKaYXoX4FvZIE1a1e7nID2rnPIBO/hdapEtaJFaed3dua6EmJjWBEMQfpjw5EczeHnE/zbyqSelUXKN7EH+eDnIoWAA4vBjurEOWcFCraT/GNiJ81n7pT7hfsxUSDLhOdfDxy9pmttccsA8bjk4avPUOPA/Z6+R5VhL9WS1Vzqr+B9uw7PbZrFsgoYCUmKfcGi9hm0NEKvENnqS8LzTYgwENtk7JCvTnBSx2KwjPLx5HqvvUqCabb1R5OojT9wn0IOGfD1Y4Q1x3PD4ZiqDAWG6iiG2wXL5fSEckqm8VJV/jgeXAZ/C4cjIqiqF6BC7AL1ZBUCgHovQehyxT44K2xCe1KtdCvmpX59y0ZTLBA7IvO8gkbMA07BSrAhiNITMUWJulYMH1D2lPZ2DKMqtTWe4HyPubEqBQAP6J9MPrCgsDuK+GVaFaCAzSj402on8ezdr12mHE3DiuGbdQLXJ/2PNuwL22dnLe+r2BvPaFFbW/scPuxc58V2kU1SQWO8vjfWvMdbxIkZr8gJTHeDBfSo1HDjSoth/kHJw+rbwe1iwyPuwz3fZX/ggsKF6tqZB1gejx/uzkMFx0kTVaOlq/c3/0KRUpgeJWnrsvN7fEtLzx4j6uu4fL4/QQmN1CiyNbe8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwYIyw4p6ZpVOH9qAghOpGxmCwS6dSUaGbwxWhCXBSwStykpNKHmRTmcmD0as/7cBaKsCuyU6hziLYmqqRsg8TYKZQN", + "sWithContext": "16QOR8ygVCYwhcop8DrFlrolDN9WWlr1FqhFp9bNJuFbXzZLoMVKM9aLySZxlCT95sBlqEnWfoxFNAPgNAnZAEAjEWIc0ePRXyainNlXec3gmZNP122ssUc0Li+QQ7k7Bn3DkOBtV+TD5vAjtEZjD+UQFBXy2vpsjCgUyqj/w3RUVQO6+37kwgXQa8D2Cjk4NpdC06dCnQZWQWR4qj1GHGg4lg+FMo3Sr9k7cQ0ULU1TvSKMA+0CIAmdXE1uvp7Ycz2rMK6jqRrCp3AFIsADg3kgqiMwCBz8s22SuZgzdx2jpWMuWNKhJIhhcFLZtfyGEiljs36nubKENp9dOmmo22k4CdGpazZAxbQHHj5dDj8bgaCjlFyvonw6nyBlIYVI1OPpFVkWqcaUTuFl7XhvFb+kgLpL13MEeolw/VqCe0grJm9rgml1VL55Ws4JcV4c2XYJ7hjox0Yd++5uZmq0G86V2cOCZwzNE4osuQHU7C2kiMw6NmfOItfUAX5w90oPT5wld1oPfLvBmIYZOwHkXdvWkTEvBtfzQWJnussprVpzRtvi2j/4q3k6IiZKavDsVYs3x7j6zYazZlWCrQqVqQT8zxqAPo8HH4KRX53h+0vrBaXj2Mn9CLd5PvoMgF04z35nSX5ZykV02s02k3nJ+lte2cAaC0uHr8WohuwN5RK2ZDOSL/631o05F67BLKxBUD8zcOyxPYGDvjKlh/0OKxbg1w62VRdkn+MxsinAytotJIZpOMDdlfwTupe2urYRKG4hFXvBQio31kQcaXSajYoC6rLEavEea5xaLY/hrD7KexP7h0dNps2i04gF0GBz0oAfgoOW7SUnLk0ey+ZLpsQc0O4MIIkghZs1aA62zkv1Kes6C1gFZ6ypHA86yjS0p7C+GJnNCSVLLO3/fWp6PQLyNJuLM4bZD8AYqIIMBumj6bMoez57KsAD6ogBwl2P6bNGIPCON1YlrEav9kR7IsISYF4N7f2Gu2fiHgjbdvDSo2uBu09kcOC8GlR2Ef3adYq6EJl5uNk3OUo2vjX5MI9SheYDBmKXWYpmvJXvofuw6HSo8wKo7Nv63APeSIzP1ZCX0ktz8TtDINMKMcQKin6YigXaJCWJ+TLPPhmkhxPuqQ/85umRmxf3NUlCBoL0TwoR0y4V9/KRdpPkyo3MKx/5vkOTYJZabCRPO7xrMyF8oA0h8toOhKsJOcgtRPkmqx5UJRoebHqgdzJoasxfWd2naenjcfaLUSJvzOa2FWkgNPA5QXZAkQdYDVh/FUWSonf+i1XwBj25hEqv1XgdmqCq/rKZ6Z9yEoWnacW1IEiYRggaCeuPY1KSFFtU3vYjhm8iDgMmeBJO7bKwQeAs8+UkyOumbNdIvc/+VAz9FUomsRqW1UAGnahV2ePcCwNTb/zxnkgIwBA5nPRu9WTrC5pgiqGlekoNWyiNZ0RfCPiP1r6qMCZ0K0luHEtkyp5ObmoGQWJOqq+PhurA+Uy4ISurVBD/OumGpn7fD4rcNhwohpZBS+czVeHTfvRYN/BRgKAu4rkFeC+1b9h+ayp3w+CQqc044k8PArEiw1XB0I7lwsXwlFp4hyvrmPqrV/d077k8BQERxSgvcwQc3jyTY51ofgfDt7No73Ws04EckY6PSt37AMfWF8HoESA9cy27mRAK8j5RUyigWm9vUbnXWjyA2toBrAyGqjhpmb15W5dwYVTX/SFxpZr4R6Els2KVWVeO1hY3LHhIZ33l/FOWQKuRZ+7seG72C7mr35wEUeia8p/CLMD2r/qdi3LNl9M4ypMXVnvyB6bAfjPqLCitDaRR+OQME1RSty+RtWdNrl9MxjH2jxNA9Ur3SNVYRnrtWSCKUPJNcxDAHrgfEZu3vdh773XWOE/Cp9eMEwSsXYD8gLNi0hTeIQG0Cpe3s2fAngfuok6aUBnv6Zl45sq6IZYxQjei0cJO5bMg9ahDpc1Kbr/RoJK2orDlRPL8MVtsk261zg08/YtDTxDi7nBVFKTKfS/T0J0xpHmbmVxvAYOR9WH39hvVsdmlph+P4FClweo8VIS667g1lfS3ak6ih01pCnlB/wF7ik7ExVV2E5bHAM+tzaj8o8EWr95Ob1LNv9AjPuzb7RCsq9A7mTuUV+Zl8yBxC9bpaPXje3pErOHptPUSqs96xboT9XEdsb9KaovUvpuBDEXDrKJVIlR/uzoHCUjTuwP1cUgLP750J472D0Z2QJ7n+n8bUgEic1wzSVLAQL48SohxwDO1Kds42TSFPnw+xTdQeHhG89Ma1tayR3RKZeSHdWoqRkBwuOPZs/Yj6tlSgJj1xfd+9ezzBEAKxr0TBPq9RvepkEj7ujwXlAaJkpD8e59DCpY5GtuQ9lUE2kj8j94jBo4GrZ3H3g3OV2A9L2HlDhTTtgWCGR97YUhQUF9jiTKDBm/kgkDrtJg3khEMAdy3w5Kg+KyFQ1Zk9heV3Pd0rHi0L+wq32pMmq5KqVCw6QLNaYOaWKEx5KhSq56wx1+wY3tYKqIsvWAvoR/JxYFSPP2xX+dj7ZWy881jKoduzXybL42MVisieBHx+TppLv1NviLPIK/vxBbIWOkzKCP2Tz42RGKnT+L38mvpqVuQKC66nlgvjXX3uhsvIi21YzcHrye/X+b16+MS4zQs5lFqMYO8VHTLzs5+QTHYeuGuep7G1VVIFE4xyrpX/6IpKmOwOKlrcTl83Bin3ezXMLRPIZw0IPpT4kwO1pY0OV0ue5JkSv4i/StClpee0WzROCFwuTnUS6zyto7wZayPswbKYngAEe6cDn4FraUtKhDW+i4KxUpxy/4FDYfMb4BUNkvy1e4P2XWfkuGP9BerbkJlcBMLiDVPg3cq2iJnnDHrkOC6oOnX0hsrleTRRthW4dZ0+0hLeYQFhz4ZQXoPQNHudHknMw92ljCvYFzcsEK3x2BRS3Bxy5t3RV9fu+CH/FUHcxpUyWYef+/lLwA59cRspAlebQubUSt5h88JYdk8P0f/zjSc5stBe05+LWvDap2gELbW28+Yh5Gj4wWIRQnyOaOg9AnMguJzy+qLdkj9n93/1VshFwf5uTjdGUBxXClRMDlnJUf3VL7c2MYoEAQlGKULbNAuci0CCxNbe4zD4AsTN5evtMbX4PHy8xksMTY+RUhQYnh/gqrN2ff8AgU1ODlBYWhsbXBymZqkp7Cz9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgUJTj58hwuB2hJl7Dzze2CSxtJ6vPILyue6EC8WWg7EocSMmqVGdGPosayh5fFFCmYnrMRJKER/VVQLyanEE30/KkA" + } diff --git a/regress/unittests/crypto/testdata/nistkats-44.json b/regress/unittests/crypto/testdata/nistkats-44.json new file mode 100644 index 000000000000..af1ecae2c1ce --- /dev/null +++ b/regress/unittests/crypto/testdata/nistkats-44.json @@ -0,0 +1,802 @@ +[ + { + "key_generation_seed": "7c9935a0b07694aa0c6d10e4db6b1add2fd81a25ccb148032dcd739936737f2d", + "sha3_256_hash_of_verification_key": "42e51c8ab5de8df35bd209e57656e1e83f41a6c90fa10bc71b95c4f4f2c70a2c", + "sha3_256_hash_of_signing_key": "af98fdf9fd9bcf1f44c424a15c54a0dd26073f26bfdb32c19c8cbbcdc3c548ba", + "message": "d81c4d8d734fcbfbeade3d3f8a039faa2a2c9957e835ad55b22e75bf57bb556ac8", + "signing_randomness": "8626ed79d451140800e03b59b956f8210e556067407d13dc90fa9e8b872bfb8f", + "sha3_256_hash_of_signature": "e50bfc6f185ce042313ce4eeb98c3c8fa62c3ddd18917997a104dea224186a3a" + }, + { + "key_generation_seed": "4b622de1350119c45a9f2e2ef3dc5df50a759d138cdfbd64c81cc7cc2f513345", + "sha3_256_hash_of_verification_key": "3f8259e55ddf984d721052c391a81ba3cba1e3d9637fb5f07152fd2d1c25f21f", + "sha3_256_hash_of_signing_key": "7984ce89b5045ad4b37360bb73183c695f3a559147a28da5a76034c27fedf652", + "message": "225d5ce2ceac61930a07503fb59f7c2f936a3e075481da3ca299a80f8c5df9223a073e7b90e02ebf98ca2227eba38c1ab2568209e46dba961869c6f83983b17dcd49", + "signing_randomness": "e82fcc97ca60ccb27bf6938c975658aeb8b4d37cffbde25d97e561f36c219ade", + "sha3_256_hash_of_signature": "7902f301c1f1a3be2f7212b6c84f8a7105e1642863ae24406edcf494960b1d6a" + }, + { + "key_generation_seed": "1d836e889e46259bcd1ccd2b369583c5b47cfbb919ec2b72c280247cb15a5569", + "sha3_256_hash_of_verification_key": "e7d48befd495681a943bee8f4e5f6b49e1be9b5f13b578df60dee00e84e25361", + "sha3_256_hash_of_signing_key": "364b20d3f76bd412f7ec6af4f0d360cba1662d249e91574d457c9d1111749727", + "message": "2b8c4b0f29363eaee469a7e33524538aa066ae98980eaa19d1f10593203da2143b9e9e1973f7ff0e6c6aaa3c0b900e50d003412efe96deece3046d8c46bc7709228789775abdf56aed6416c90033780cb7a4984815da1b14660dcf34aa34bf82cebbcf", + "signing_randomness": "f333d36590910e7a5a6cbe567bcdd154137eef62b92bf8dc1fdc900e7c194e5f", + "sha3_256_hash_of_signature": "6fc43168ded663eb41778b787dd76a875302e42e05b4c65a74bb6f89436467d7" + }, + { + "key_generation_seed": "539577cb7f2088fbedff1b53f235d607321857db32bba645f8df3a89dd426552", + "sha3_256_hash_of_verification_key": "bf4293953a8947a34ea53107c397d783449c1b2997ba1a93c3518626479a104b", + "sha3_256_hash_of_signing_key": "12e6e576e0095b0b04206aafa1af2d136d4cb4d576973e970646c23b6032efe8", + "message": "2f7af5b52a046471efcd720c9384919be05a61cde8e8b01251c5ab885e820fd36ed9ff6fdf45783ec81a86728cbb74b426adff96123c08fac2bc6c58a9c0dd71761292262c65f20df47751f0831770a6bb7b3760bb7f5efffb6e11ac35f353a6f24400b80b287834e92c9cf0d3c949d6dca31b0b94e0e3312e8bd02174b170c2ca9355fe", + "signing_randomness": "f52a43f5358999ddbe311866dedcf629fbd5ae94919abde9fdebdaf93bb0c847", + "sha3_256_hash_of_signature": "51b56173b1c32c972a1b4a82161341f7127ddccd266df562e2429714ae267938" + }, + { + "key_generation_seed": "2ca59c6cf33c53803749f69ef5abfa9482fcee7efd87fbf17135ecc3ff3fd7f7", + "sha3_256_hash_of_verification_key": "fd89760f974478a48349b3bbba85375786559437cfff806773deffc01d4d2bb8", + "sha3_256_hash_of_signing_key": "4bf0a05d40b6580a32dc09e3b852aba2b55789644d37c26b7fba0fb1b8efd555", + "message": "1cdf0ae1124780a8ff00318f779a3b86b3504d059ca7ab3fe4d6eae9fd46428d1dabb704c0735a8fe8708f409741017b723d9a304e54fdc5789a7b0748c2464b7308ac9665115644c569ae253d5205751342574c03346dddc1950a6273546616b96d0c5ece0a044af0edefbe445f9ae37da5afb8d22a56d9fd1801425a0a276f48431d7af039521e549551481391fe5f4ebfb7644d9f9782d83a95137e84ea3aeb3c2f8099", + "signing_randomness": "a685acf5e2640f2d085efd1c9cebe815e042482a79694c32e28e97fad3bef590", + "sha3_256_hash_of_signature": "2da345196311cac635d4bab01c5debaa9800d4e7cbf05ab12f3b0220cca3ab2c" + }, + { + "key_generation_seed": "e17e72290e49a44c9c534f211195257cf13b0d45405782ceda2d7f982a551721", + "sha3_256_hash_of_verification_key": "2e4a755846f0fa861761e1a9df18901593b4919a7855d61638fa25756ab42375", + "sha3_256_hash_of_signing_key": "04ccfe2dfef4dff93fd9e8a399670522ac6494e6d02dd2857034bda0cb931c42", + "message": "dbe5b6c299b44f8d60fa972a336df789ef4534ec9ba90df92ad401d1907951eb6285eda8f134277ab0a1145001c34e392187122506aa2dbb8617d7943a129eb5c07df133d7ccde94a7cb7f1795c62493ed375353d1f044257da799f7d112c174fbc35687e2f87fefbe2d83d29d7314b30a749fe41b1b81095638f112bc4563420af235280e466ffbe7050c4937c60fc18d1a6025bcbd489f0c538e088e906abe8597e2c8ebb64f01d225c847aae4b77bae6eba9269962c4b94a9732ceaa2cb4093d442ffbcdd", + "signing_randomness": "bf7fe774845dd2519943a685217bbb9e641acf9570468e47fc0b6b908271cd3c", + "sha3_256_hash_of_signature": "e4142a0e5b14aca1e39c99f9edb0960413808f2c90324b62ff5a37b628af660a" + }, + { + "key_generation_seed": "3b7388e675de5c59a78af095481c7dd999c6eea898595b1e7dcda7edc3a2c25c", + "sha3_256_hash_of_verification_key": "41dad024181b1dc97c6bbcdda150e81ff528881e4dd0db1ffe92a06b1795c004", + "sha3_256_hash_of_signing_key": "1db68131bccfb19de9ba7fea38f5e747b602b13194497f70a3b7a0913898cad1", + "message": "0073bee97fc97c0fbc750d474aeb93189f061e1a5cf6600c04fb0464338ec7e85252f94fcbc7b2bd00e438480d9af3add92a92e3e2e8acb55077c3278fc7503988a76e9b6062996b20889aa55b343d5a003c8a8852d738f955799fa3426be5ccd3aa6b6eda04d4884941ffc0b69c5acf12b347a74d0580cc3335ba816200f87674a4c1d98097c70f2f27c74e94a661850610ecf4847ab5b58344f958c5719e06ba396225bbe21acb0fdc512b885d391e11b0c0ed5ce6b5dd8faff91f50025c69d43072f7706d80d9fd786e1104125d79a5f4b5fd838815d44fc8b1ab678078cc174dde970d448b", + "signing_randomness": "83963a577ad1ff81ef4afe4945fea5b2fcbdeb6ac3dd714c3d9422cc5039066f", + "sha3_256_hash_of_signature": "b8f2b85dedc4cc3b6f506c4a7704e5b830c5eaee420ad419fd0c47e4799c4c5a" + }, + { + "key_generation_seed": "dc9f40cabe2e8e4f3d1538fbc1ada27b61b99081455ab0c4c41b5b3da8101000", + "sha3_256_hash_of_verification_key": "a446da30acc101ac4a1f3fb40b81b410c4cda56f2e57b3b0b0e0fa49adadbdd6", + "sha3_256_hash_of_signing_key": "80e74892c2a2046d1c50f77f5ddf6c9d04e7fd3284b86abae9ad8c626c703c33", + "message": "a1586245d81f96bd8ee81aa30f10c0adb343d74cf72c4dff71550c12873af89fa1874d4731c996243c3749af3f6188ffe9fa45430549045134eb29ef3cec37e72904aa082b1c6161e6b52361e49af4933a8d8c0734f21cafd7467b0c02876f43211d6122e3e735fe36064df7a0c91449237c2bc7c3a78ac7bb0f9567f2576f05802c872adf183a87aa3b8217188f2f3535f877724f35b29e545de4bcf258f13bbc7edd8c6587f733c9691f74b4151cf8c060c3ae9e8d49fe7c77bf477dc9f23fd0f0b67320275529034b84f94176730923c03aa50f9584d9c2d60b8dccf85a13f243f30a51abefbbf2cda602bf3d75e849eb92422b808416c7e56b046ce38e4677ad24d23d7237a9", + "signing_randomness": "d18cbd60c7a706d7ce6206aaea7ff817ddcb25d36fd0f800f0c3b38ce5853c76", + "sha3_256_hash_of_signature": "bdb22e5bbc018cef0c5b077873f6c69d50ee4812f1421c5b3bd941f30a902caa" + }, + { + "key_generation_seed": "1dade637ae98c393260f5bbbe288373100dd7af37eba913c528d2b7b998767cb", + "sha3_256_hash_of_verification_key": "aa63c17cc430929c4740191e8ac82281ab4b3394f7012ba983a1357e9a437add", + "sha3_256_hash_of_signing_key": "3f2fb35e415d2956b6f1fbc7e4c9613462b32eef2779f3e8c52a736a7c6e90e0", + "message": "9366ed7b3b623c411448b634446f1a3faabdd163a6cc1e2bcae4a98703cd8cee441405892fba051be2a586a6950a5ef73a255e5f86b0d7212e0c51c3bc79be4b88e76ed6f043fef3204faf044bfb1ed722d61eb5d0b74c66a257e8ac3a2206273c80d2ec2123a4dbb715d60118d99ed7322e38f1562f82379138da3ddb8baa7ce61ab729afc3748c0134633cf45a9973c05c75d04e82f631845427626b5799dc07ddf830ba01e8bc6236bb6d03b37d949dbb29eec7dfe60fbc17ea590956d251539792016e2a8b01e70476961bc9ada43cda682d0caa4fcc58810bba1a673ef8f6bc90baee701e8e4f7c04a346ca56c7b2862ff57756ce6cd1ee22d677bcdaa896eae96f87870e032c18b6c6a0c1a191fae2ed487ce55296cc4b6339eac9e8a742bd0a44c3525cc750", + "signing_randomness": "f4ea973b229c69b772e8fd400091204dd9c4c453ef412830e0b9e3560f058b52", + "sha3_256_hash_of_signature": "2b27d29cea1aa40d82d15ec2287ed9dd530a9f01d508d0f7ab9ac89a6210edca" + }, + { + "key_generation_seed": "8866693cee12b909e32a0c64381796633666417e1246b51a2643564b464b4113", + "sha3_256_hash_of_verification_key": "03592b7aa572dce92ea2fae453fb6835a6c461fe550b71f76d81519632973790", + "sha3_256_hash_of_signing_key": "bf1dd2711673098cddc2bc0f5af0b7792dd643609bbf7ba2265dfe17e3066326", + "message": "0998114c84f84080e7eebb47d248980fac9d28f1abb6dbab3dd59a5cfd2c7cff7f308372874dd5447c7b02e30165501c0c673128e4c543a414222bdf47e7f4e8dca757b0f4a3281c0d10c4f02ab52aaf5b9a715e012607ba310947a60a5f62d6b8cfa96386d27cfa709189202421c078934aa2d955468e550ad4d0d4acdd98b168a9568e232192e92789830317fbc959087fffe353b6c168f3efbe7164444f1d6cba5246e31658c65440a841dba78257e78502843ec1a6e9710229c8eeb85d6cddc7d543285624aa1f756a5dd4f1a5d4fa52db8c5c34880ed448fbb6d254509fbeea0fa022f276b6a66bef7abfea6049ff74291babe781f718683397077b29fa9e2b46bc6b09251e587cc5b182195dd4060cc4a319bfbe251a5b660a739dfe5d0e5b93f3cb7e440194f1c8bda922cb1a3ee3d27edfd61c1d31a7f4534e84889ec83b51f1641892766434", + "signing_randomness": "b640be365c75e15331d37fbe6188f4136af1fde332edb2394f8c4b35718c34f1", + "sha3_256_hash_of_signature": "eea37c2121a678582c06a4d7595b9a0b09e9e47247e74fa9a4805ddef1dc3c90" + }, + { + "key_generation_seed": "d6dad5b2746422f4487b72536d70df88af4b2f9040aa45999f8d7784ef696da0", + "sha3_256_hash_of_verification_key": "cc0d1772485c481aa39b8ab7d714544c867502a4524e34fd1ee6e3a23c9b24d0", + "sha3_256_hash_of_signing_key": "948a8265a1966218ae074cf1fcb4120ac0d069c842e78574f4773a63d268cfc7", + "message": "4cca95cb9f254c2eaa7dcffef662ee03320d5fc626a6484304bf62fc20f341fbe26e1537d7bd20e95440f7cc95ee84e1297c807a0bc9006dfcd5c22a5c1fc0865f5d70e5d63ad677fffdea52bf85d1a4f159f7ed16a745b4d971b620048b5f518eb2dc672ca35022578059e1adad7c07fe910a5d566b8321d9a12f34c250be35ce964dddea23c90ea77c9c1bbe3532feefda3637157786ec7d37775ae5cb0bb92eab45a0fb1e833e8a6f3d06b85946e31a79b64a02b31fa640ed514a85882c89f693a06354dfddb0b5e23e7792134c69c1d3908882df3a7694a05b241b87fb2dbd1a4d9f26943b69f3cdf730301663089d1ebfc23299da21300f735cedf7b109f3e0bbe273776e6aafa7054a6cd9682b967eb7903de549e9558e62dcf3ac444dd7042fea362efb555bb97fb464ad7faeaba3197c14a6740477db50ce3fb8b762f48f880381d510fcc836e5880b48f08bd6333202e838ab73f2e106cfbfb218aab802da8a00f13f78ffb70c", + "signing_randomness": "3e747db13e9a2e367e467c1ac4b72a39854a56a11f040088fb007ec7e1f2ecf1", + "sha3_256_hash_of_signature": "40bbb409f85fb401d994799a3debcc87c4a54acf6246be78a82aeb480b368bf9" + }, + { + "key_generation_seed": "68e7818f33b97ba6166768c395bd010cef7bce9995891d164303b53c1123a991", + "sha3_256_hash_of_verification_key": "9692b0716270b196639f94face2326e8d7ee33cb410e1b49994aeb530c41ce95", + "sha3_256_hash_of_signing_key": "11c96ce0e7108cda3d8cc3f0d943b13902379da9e7d582d7376fd703ea9a3332", + "message": "5c4b2e1a344da1418b0f4be3fd99505fc30f2a1e5b696e943bee2451d7b268f722e04f8e00fdd9e1a470f8c977a6d45a5f621b8815e352fa14f64977d1fa08082a48af495719ea6ac1c0b3d898603b4cf7ec88e68dd7190884382896d953d612cc21abecfb01a04a1bb1bbe8986d34625756396ccd84bd1a6b5454dda98824cd4844d98f356ab485eeb19f9196abb1c3088c0c3c5846c88760b696d91a232d6f4cffc85bff33de1a3433a27a209a461fcf37f2289f98bea7ccf183db1fc42a7edf958e7913f8711dc375e43f09be7c7a2c2b1318ae2a9cf5988fbc2ce0735a2cd9fb6c8496c34406c538c01bd494193240bff947fed47b7cce99a1747973f1faa5223ac564bba0ca8973d1310b5bfa1452cace9110bc22a8d4080a8baaa8adfa3cfb6685679b648484e3a43f9b1b2531949bbb8fae1846f6d45d9272fc2caa2913b5d9f8d322e9b18a685122d74634c60730c101578bef2480711feffe02123e76d6c846559e2ea99a98923ef095630102a5573ef027e0ab6e52555a9ede0d15a73c8b2fef87ca6fd9f903f0", + "signing_randomness": "4e180cb95a825f6dbb010d597cfb10eaa4c03e51001d9de7bb75e87e4d7f36e2", + "sha3_256_hash_of_signature": "e93f9d54c156f766e116ce02304d540f929dd7e3879fc46a66b44abd81cbc963" + }, + { + "key_generation_seed": "35b153a7706109d4a13d7c4b26aa5b56d9e3fac53b47e91b0c10bd4e0eaafc19", + "sha3_256_hash_of_verification_key": "e5b6e0aea435d3e79a1020de078aaa906d7af00740971c587df711349ad293f3", + "sha3_256_hash_of_signing_key": "9ec460261b2df68b95310c40193974ef1d7a4c8fd8ecedfba5412ece63ad1af2", + "message": "49755a7b1a7cdc5c9bdf5149968061d3c95ee67bfbaf02750c45094303a9d9cd23a08f19b9c768adc63ffd1527186d09ca4e0356bb882e263bf015cbe3716c05b31a69dddb790ba82c341ac9b6be68a81b8bef8d882304baf0020d761a0db04412033dc369961a5213b04e81736a580f1162780599cc029e262d67f31b2773afb457a1adaaa292163144f17de384234f3303111fcd89bcb30333c6c6486f775ed099043c34e6c86450b650f1a02d03781b1d20691b767d166dadf1dcc4d8604d976efdc9168373a7316dda9b9fb02a4a321218d9f54e287b7167a08bc0153843bd6355aea1310824dd5d5ec458be694af176119d9e588a29c650ff5500293659ea478b39a62149f819cdb7e7cb32e1d7b1284f159e2ab1b1ea41af4d0ac94ff3111fc1ccd818f9b2cc7a259701405fdf6a51d2d3ef62789297bd16a659f14968ef902c4a23da409bf13a4913467b5c991854b2ca6cc006d3f4197a6aa58bd5dd95c36928da9583332c3fb134fa3890fe7e299f1c17205366c4f4230724c43e4803912e72b816658bbb1b63780865a1f66a2a49b96e93711b1be97b827d12173402828b1a065b94310d5bd6098d", + "signing_randomness": "de9dbae947be3b65b9a827c65b99260c6a17d9cd8c2bef48ce0573f555de0f33", + "sha3_256_hash_of_signature": "8c31497e152c9abc4be1963bb2997e218c95cbec9e45f0e85ffe72775ec29733" + }, + { + "key_generation_seed": "0e1a1634fb2396e187cd8980ef29663c42dc3ef963ccd491f817a84283a11fa0", + "sha3_256_hash_of_verification_key": "41368830bd7a21526204f0fb6151ea80521867946c2b494790f0fd843509a24f", + "sha3_256_hash_of_signing_key": "be13549fbebb9e6938847609d5920b7a8cf1d24678a12a926d4b8a05c8e39997", + "message": "439529df1864297e33956afee00a60099b658a67830a6a6abddc329e87831d9f9b647917fedf1ae182a40402143285516fcab83f447354c72fae81ac26e7005c2aa561763c152e66bd80f14565f47defa440dbb491e7994ab9fe35995d5fbb3800ca030b43df611141637a5246ab9d9cac02efe14af60736b6bdb2babb97cf21e831e5d04d41c00f090b154977900efadd3a9313389a3f84cb3ac38e8b57b70a43dd08a8243f8154013fd5cf29de5a8df0b197c12b17e0610fcfe3625cc94067e01e23d23a243ad1c1f805cc50e1447d1df93c25b8d76396bb7199e64129522462c5fc8b30c132d4ee9e0bf6f52961fce7ecf650647e7064aa5a6574649a323e144d7c5491de4c0a1a76d08f93f87a2fc7f6955fef86991e62e2cb42908e83b0c0a8bc180b7453ced293f1e20f300431ec1d395e8a537f0bc36a673d491f14381dea90d8f176d06031b0a7afb40ea8f76d37fa82e2572b9799a5fc7cf4c49bc20ad78efa8cd989a84d72ed680ac3c0f64155c56acbfd7c7d628b418a489f961357f77bd62204adb079dd3106485a37fee535c9cf82e832d8aadcbf686976b806b02ae733db46db0bf162e973931c3e338cc86db38c66262d1b2ebc7691b8281e0b20bf36305fba996d20ecfdc695", + "signing_randomness": "95a169a6821bc4b7a221c54caf7c9411ae44cbe89ade05cf95fa6d20ccf2d086", + "sha3_256_hash_of_signature": "f918475ba45bdfee3a35567719734c13976b6fee6223a5e37be23f55bcf40405" + }, + { + "key_generation_seed": "b0bfa060f1c1a70f1ac55e321e6186a6613605dd732574b5fe6e14f0ff6f7a82", + "sha3_256_hash_of_verification_key": "ff8dbd7deb3fe2442fc3e32e140bf8873131f217a38202160e784f86381daa28", + "sha3_256_hash_of_signing_key": "edff87bcbfd6c0ed6f816eabda1816ec18330c3125c99f0a1c50539a61dd8cbc", + "message": "8cb18850e27d8416b88a9a71f4a66bdf447814db6c82098c371b53f61600ef5dfd88e4fb34200207c3f6f55166af4878d38fca7e2dc18fe662e3ea491b58a86246cae16090fb7ada53b9a67b3d0e3787d3323ea921274c60cffb19a889bcf0300fe10e242aae025f374dd83fbe9d007c8b9d9d75574c74146331ddec6f0e49c10dbaf15654897e33e2b4780dba484224aa6fac79015d5792faa2d532bb7d239b11d91420b98690b1fbde9632223927e0804bfb284368a426c414c3db8ea82f0d246413861475ed2dca9e80fb4f3c34fef7528069ae1975afc52ac5ad2cdbca1459e140f655556093210d7905a1a1e6ceeaef0194a0b2eab2c1ee853484e715d2a1db551fdc620d5331164c74ca4848b61d408d2f2a943fa09efeb63d524691c99dcc0b22cc61b98e6fb8039e5e0b2d7de2caaa900a44184bd56c9f02141a3ae8afc661e3e898ecd3004fdb0704272ba780cd5de35153b6fe223843024273642dcf8e4b58be2ab1f61668680084aa0b75a32e766c8ae5eb30d4e02a12e6798dea40f80d8ddfad2041a52922701c689f46f49f84cfc05eca6d7d4c356d50b6a0ba61966245d45134d6a1f5197540a1c39c36bb0b78831af3f5156e669fd9213b64e0cf1c5a31e88ae79ad61757ec67b551b9f0a760f646bf81f6b92403a62840cc29fa4f3949b3a9f0a9a4286ee7808a", + "signing_randomness": "9cddf8ceb8c94c72c136072d09d7adc8ed40affe4eb1a5fb3fd7877571975ef1", + "sha3_256_hash_of_signature": "f1efd761729df8d010af617dff49bd8163c04ac7e101bc1f67ff348cdbad0e3e" + }, + { + "key_generation_seed": "a33bc0a7a08c13c0d4c1174ddd886aac4c5666e1f4831f006c9519d36b2ce882", + "sha3_256_hash_of_verification_key": "c6d89daa46ad4689f682e1e96c43458dc0c462a379fad2299f5765e986fe80ee", + "sha3_256_hash_of_signing_key": "0f706c7f7a833dd73e35d06c2d37f6ca03e15da277618707b25662872b31bfbb", + "message": "9b64813c058f07a09a796fd764604eaf58ce144363702896df0ab5ff26d5de000d14bb8fd358ff5532d3b909ab62c18ac30f1900f84ebd3f4f18bd532d16c7b3470f0f8bdf72938c916db18bcf1429dc1635b1c152c5f89a9edb17116c11815a6c06273a889132923da908ff39f4940a840d3cb575dc4d637aafd37968ec61fc4ea04b4c320491a73ecfbdd8e10f1dfe902fccef93dd287ed872f67146bb8ca5a6adcf0350e8bba7f2f9762c4aa748fce19748eb17334146c152fd63fae3dfbb1a2c2b3c78960369551fdac5d54643beeaa59c1feb0c21dbbb19977d848cd82a7ae0005f45956e0fe4700f14fbaa0c12fb8c65a6aec95c5a5c8e79a6da9c4e446872575c06ae49a31b82245e1757c7ce84d6d5df3f642d3434b7e1a15a8b8a9db460826b6cdca69022dbf87595b582ddbb90a81e09a13c2ab1c125e4435ff30abc9c56a00edfa979f79d9c895e800d2dd6372fae5faacd83adf8a6d55279d52df547e9bab39d99076ad7d297371344d35bd584e0fb5932f92fd5183b9250cd180fc645bef6028c405b0ef35daf783428173f1f2482aa1363640f66af0fe8ecacc0dab84abd2a1fb53af44445698cf1ddf4c2ea214dd339be004e75bf76e95ca5c16981aba5540689c1c1f1daf4d0f89d62ccb3496340d61e7d5f5156fd3edd02edfec8fcdd0b231697b0e66f4a3aaf46117532f5ee2cb4d2b3b82b0beae0a45a482ce9a976cc99aa82beb0fe08cb68c4", + "signing_randomness": "86978657e78a20a881689d75650d01083209a9c6a41092aad3eee15e4846260e", + "sha3_256_hash_of_signature": "e1d918049bcd97342ba0067308fd413e9538e73c8a7293d93a173d469921ef72" + }, + { + "key_generation_seed": "c7e33fa5329142b668ccdde1057eb7a8619397537f2b4c6d6755b3b9ff936441", + "sha3_256_hash_of_verification_key": "af5790dfdef40ada2b1e6dad68845b07b90d3ef1e102c97bede1c350a6fd0bba", + "sha3_256_hash_of_signing_key": "3be725aea3273c7792080a19ed1c1551bbca6d23db32c77bc2b76306e6ea1943", + "message": "922320f7439e492f13c272a5738ff7122dd7a6b2832632e1f7a653fef3b8639bcb9e84f482f22a948ea17dde6958489593d2cb268bb52df8ed612f2317bd6847d1622cf0532cb499adc432233b93b6f7b1866b38975ac87859ac49f91e8d235846775f9e6e6d052339c741ef6178016edb3d0b1e3f3536667b3ea2d489f88d254b8582421a31461374f465d7ad62e896be0857134707a70477fabc09fe0a5cc3b3f32911f5ff3806b878205525af69007f50535df05c33af3b0d00e297ac7eaa012e1d863dd5dd5fa47fb09467dbad8bc42edbab42a9625bfdb9fe578343297506a3b71cdc8d5919955af4605fcb0c7164d96a187aff65d0f6210fef2d11ba08d90c4458542be72e084577be9e451b8b6f4909884bcc5d25316adccd0925664d4d91c2e56433c1b68c632b0ca56d856df1edd5e113d1f026b30dac4fd648a504f8f6809c701c97bcac2b99286cef5c1c923200b1bf6141ee1cfc51c5e14554bc02d7e058970254d2c02948360abc4dfb439e66946a8ad615147bd8a6cb0886211e8b15dff3c72b6f8908ce56bbc1b40e838103202e9f188d98e07555db61778f895f76fbd838b6d14209d28eb393668924ac0e61072cbd9f93b864904ff4302dcea131b2ca16bb04959acee096b1963ce07f59ab505fcc8d89fe08fc58751965f2f5ca753d76d58705652d3b1505e0f720ede3142de9776ffe4aa0c8a25e76c7a04843377c59f1002844e89189e22f621467b813a98bf07540a1649264f14a6844d65692617f7a4d93fa9a23829e256626", + "signing_randomness": "d969c4147e8353c80d83ce2b665934ea1f9ff040946cd3f16533143b129b5804", + "sha3_256_hash_of_signature": "c823a18b9b08fa1f54ce2f3a30a0f3590dd955a25f71743e0ae009af7412e73a" + }, + { + "key_generation_seed": "7611b5b7d4195d5f8b97244b6811748efea929ea272e66435a36d0bd16e3bf21", + "sha3_256_hash_of_verification_key": "94ffb0acdf8ff4992e39be475a04a1745d4863e6f405a40da8c4aaedb836dba7", + "sha3_256_hash_of_signing_key": "35fa8d453d41884df503d69c46d1fcbdba116c9ac55e69cb8cf85d5834a6e8e9", + "message": "576289d10ab03d5699eac322d349f55c547101e4424bfa43bbba3747b79f075ae1153a7a0ac8bb51d24fc46b7604e42efe4343fa34aa4eb16d918f25e8a4d67c860cca3f7480e1221ed3ae13a138f079fc252c6d7bebc55cb81b86e74f339614bebcf7e8f4440df8678b01a4a41b3afb1d112fe1c4c8d8c6bfe9d3ee2a335d477c60fbf43b2e5fffe1546f5172ef51cffb2a772e1575eac79b24d49fd77f0be351233e57ee6dcc7e2e29994873abd434d34ace83400c026e27e27888ea0bdd1bde5a3e55aa8b5f2feb57b8b0a96cd831906297c8169d04f15843a3249c50523cf56a4e19492ea16927dba8759b88a99e0d20820e51fc9b6a6863115cf05c5bc3f4c869eb5a87124df5db102d737f3899cfaa5fea4dd62dc4fedb1aaff67906adaf8968020efa5b10190f70e5f2c0f0457e4341bd449201d3a80aeb791254ec1c46ddcebc3896c6df702509ba62cd446d275806438eb4c03132b2e6bd01bd2f832d1d3c053c48c5a9db1c4a22b130c4c9e96a2bf4c2a8f7de0217a52d9aa5aeee5e6a49708237eab60b4019a51390c3ef10572a73d436875bb8d7d78543f96376e4bf3bcaabb92f89215e8d1093f3b287945708b5514bd7e62654d3bdf34b29009c64829a0cbf33c54d7ab0e81b81bdda93028b341ab1dff3d752dc4a1e5f9636a5c46e137ea35919d99e6571c5370c6e804bd2e2abf566f035d65cf8f97e3e8f2ecafa153bc6d8ec2831667a37fc96d1c2da40ba84d0fb041def32aadaef3f98cafa957f6552f79d28a36b8ba20a9452671de1be8af5d66714232507edb9ff657f3d7e5fa7320fc0359a5f99280d446283bc", + "signing_randomness": "a54ac9b7a0a8c85861a188726990e518d287f7c53c8b96ddf7d01c4fc4a6b9c9", + "sha3_256_hash_of_signature": "b72596a0d7ce6b01cec65167704ccfc6628047f2bea350dc20de644d18cc165e" + }, + { + "key_generation_seed": "5a1e3e05c72cef1a73ef98840da035e4fd2552912db8dae28a79011de4bbc1a4", + "sha3_256_hash_of_verification_key": "72a57e21f15f93554710aa4b9ece99f4cbbab0bdc680d58bab44b8ca384c3846", + "sha3_256_hash_of_signing_key": "aa6e90d41282de571f2f41bb422563379f8d959664c81a722d8f415340158af9", + "message": "021e9c06a2e4ef63d1a61958620c40016783879080d44311e04f2a446bcaee5a486d17ff0f356ba70ff1c2b55bf957a59202903ae349878cb822e04275e0afaabc0803bb6cde3741e0bf9fce0c5d5c814977474533dc63f9ed4f32ac3477a3ec9893ef55186728c85b03f4c2e61ca7733e1706766aeb8fea80e233e8761b57fd5a3cef700196674b34a3a55f68b3368b688fb1ddc976ff48ba6a98e2d66023f291a3c617a56ccbdb8732b8c34369ed11f4ccea8fc8f673ad9fa0fd8990bef70af44c617fdfa096695d0c94ea8e17554f4461dc776db2f416448b17680fe4d29b09e57603d8ebf55771af84d8d4b9097302901c25cb6d73932e67c323d12c8acb0e74cb89755f7eb3999d4eab5e1b775e6b5c29d9733697030a26f3b93b3f286db0f2dbda71e1f103878063e77919d8892eb6a34f821b603ed4a898a9f30d00feef20985fef1a7b7af70dd29c269e88687f005d551ef05eb0603fd38745aed4f5bf4c2fc09f0604c98ae3a89e46bbfe907b87a1672de547d651f035f392a8d4db5e7260f43953028e312b95b9f25fff2c0c579218390411d13d9a25f22de4c7aa05fd11781db08977160d48e02372c7d826f5cac37d1a9b4230be99a2d13cc2e9b2b17f0a1044eb9e0a2fba376d35cdd2bc05f57dce4bbc3bf07a09bcde369929e6250efdc61689466b040aea376b09453a2c16813bbb685b54a225c49008ba6811e8bb5b3627f8c281244fdf5533216d126ed0e64fdabec533424bff77fe722cc438ca7587c19d965f0bf085d8692c27c5c84a9dee53256d978948d89abdf9842e0b765be6a507d8630cbc5ca7fa0fbca1cecc78d2e536aa7b2b902c4379777ac0920d69c57cc4e6032252bde99e1a555e80d4", + "signing_randomness": "4ba7fa7a5623bb71d33a6bfdd38828ce60d91e75de165367e31007a10e0b8352", + "sha3_256_hash_of_signature": "9da53a31c89066723f2bb974c25869a53840c2ac63366a8b2bcf9dbdd9c44af2" + }, + { + "key_generation_seed": "8f3920a235eec3659cfcfe62931474204eae264959702f901d461b66d9bb563d", + "sha3_256_hash_of_verification_key": "971476ea189bde159fe70c5876af7a9779ca13dbe15fa9a508afbfae2b644a70", + "sha3_256_hash_of_signing_key": "27bac82c81b64d2c8c3c32be9384b59203509b26f99db4063c690c87494c2082", + "message": "7bedafebabbbfb863ce496475f54e69a905afa45899c3d7c16cfc73e31597d2404ae7014612e4cbfa238efaf5b396b0b7435ada5de817e013188c280423c68924e1fa2a33ca56e6b85b7cca7f00d3a6151f0629c1b92a13573320e0025863bba7f3eeb987ee1b1a6230b10765dfc1feea498ae4b83521188e7503b506259103cefb370e3651b06dd4f08013ff3ab9e2430626b0bd584232948462d85c0f82da07b96fc65f62a43cd2f132d1a1d691c085980dad8796cce2fa0b268395eac3da2cc400f30f75be87316216980ce213b48651ddb9e294f8cdb2ca05d3f2a507e4a03e2849aa8062918afb5bce9e4c3abf2ffd4751dddcf08ab09e36a29b830f3bac6feebea084575472e6f4b239af89965a72954769a83e391de467934237b07d8884a6b14cad034fbf9bd7531d50d742e234e227e1a2daf77a2ffacc579525134b15186d81ae6e5538871024bd2897475d6ee5b11bc51edbb928d98475073785a75b331bf3d2297165ae6cf95c3a05f06df747498462054f58a5ac736f96014b1a8cdb319d030d06dad9cab2b913f35fc392e1fc4b027cdbe775d64b04f1076a7c8f44c360745f98e87b84c18ab76f84f373f635af4c8a87df08dd4507899bad892ff8cc1ee534d3277b5b82095628b84a7d5582149cf46c50aa963b56b4b91966b106b4b2eaa45d83a10993e8f933370ab29c6606b7ccfc41b21c6b99f2b9ac643e24300b350fa199ec10e64e4af19181f78e8c43b2fa796241dc42cc8992bdfcdc39e7bc41be68cdce4fbc47c996db42e8249eedc146c216b514430c705fc939b9eef677ad87f9cee3398551fa0daf774302324a410f4a4f4fc035cfbe960b38c390441e92d9e5624a8745976bc88fa538e398712361b77ad4ca5ff038d9f6ce157eb8a6137420d4e57018275dceebc4e480a5d", + "signing_randomness": "943c364002f410be37f11bcfb79ec1700133d441c7c1e37359bc9559d256d56e", + "sha3_256_hash_of_signature": "c80d73fc568ecc382b7676e79f021a5e13a11909c8d0acba2d29da33035ea585" + }, + { + "key_generation_seed": "0b2b3eb50681403a0b9a99b25041a489c6d45d2a49de0ec83e1fd10922abe2d5", + "sha3_256_hash_of_verification_key": "88eafa02e04fb27f6e031b15f32c7e82e761524b24f5004b54a8e89f88a48bf5", + "sha3_256_hash_of_signing_key": "26f77952c6ea93333e2e7c3fd27884fc8bc1a03980ae9383aba58e681c7cdd18", + "message": "a86ee95388df139f9c5a84108d1e63f7a7842909b818e9a0425c257649abf125386fb5286031e7e6d0eeb85c452e254da39bbda51f0d2167ec0a51992753ddfa76874aa80804e705cf8bbadf3b82b6d7fba3d1cad130abcc0b44d6d893356f3e94bf8e82ac532ef8c5e5f4200207bcf6b754f14e57a889ffb753f516ef8de2a647fad8e449264f0bbb4cf48bd01501736da49509c3426a3d4108b98e6a4aa6c4430e8ee76540051fbd1dfbfc01750e26547f8718ef7d897a0342bb000fb99aa63b781c9a4b831da798c014e58725e03d2f8b1a029c3337f4099239244aa320965b2cb5075052d901b6077a18c1ecfa5f272850a475b5f6bbc83f3c09a27072f80743b23ec6a9870913ee2805b4d296b2f81a9d733e5c8d5c0b477e51f9328af3af8abed960408afecd27fbdd08fef50f4b07959646e0a02104a69674294a79de0b25b65f4dbfa797e5fa56d66e8bc07d5e2e7c7d2e845699acea3bfac60b2c0b988cbab949a5b598d8e2f1aec66196e115ad7f237a1c7fcfb95a1bbd6939a250e7bb0f4a02c23cb1bd81090cb770e3a70cb081d121bd0bd5ed1dc06d61282b98bf2dd7b13d2c6cf833891c67951d7d0f429ebde3f1da943adb8ad285e6f13f798d6cd9a0a06bcd6125ebaa48f8f3bd5100a122f617817e3c42ebc3c3b154258fa26b9fd886ebfad42dedc6a2c4f9986bad88a2a79d7ee603554e9cfc5fe33a3a171cf7ba94fd43228019b2f6ff96a8abbc58d2098ad95a95442f6858eb69e131d7bcadad81b9bb69d7682a978279b631e22927decffbefbe8fb2e51d46a3fca66225d30451cef9953ef94f30b99f2b26ea75b84935ea4fb257dbe5734454b8087b3a4e115c6d31e72709303e9f0bb8c86fc6b11b93b53f9781bb92851a5cb5dc00d0b4e15683dbe4edbe986966fe1f711f24de9a0e1beaea8e835c70cddc589773d31191b74af780eb69867829abed6d3ffa94d577", + "signing_randomness": "8b7b9628988a0842ed6f7fbb4289a23a746df20188f74fd55ced9eae99889c61", + "sha3_256_hash_of_signature": "2ae8d6810b406b4bcb125a0510f0d5f6383a864e353f71c3e3e6a9c1f487e97a" + }, + { + "key_generation_seed": "8217d32cd15658d39cdca92c41b59f5780869a68838a3579dea48b5e3ea768aa", + "sha3_256_hash_of_verification_key": "c7c26c3ec50c34396df916306f25e177b50dc37f5c0387558dfaa8d614f65e34", + "sha3_256_hash_of_signing_key": "bdf1f051441cb0a5bcab303eed4c93840dfc3a76c1298a3cddce26bbcc40ae58", + "message": "f5abe373ce1f6fb14f2014f5bc0071b17ab2c84e8845fcbf4b15c79fbf2e5e06cffe6cad9a283014a975f81c9216b261cbc79edcd58d0e20c586d7c641e0ee97221befe54dbcc56a594df103ec24b52ddbb6052d1644972640f39deb98997fee7a252a65070798b7e46707fa440375b1ba705b3ecc7eac56d9c45297e585299c7d747b430f0d01e82081c70b4a87846f90267d5163181ded63e089a00afd33b0e2b3ace91182d8cc899223ce65a5d84b86bb3e8b34b13949bc800f2145468ba5411eacd6a6c331c340d4442d28efa0da959a2797c7181bd4bbe6e6dffd134cef373ecb0ec08590f06be0ce292d3718e2c0efc7cb40f1db26f5f38fdc82a72f81afbbc16591ee02dc818d63cae69ff0a28f942f7e07f6b0a741f3f0ebe3d0ea5859024aa408462d3d268c23f95d717c0a685a4ca73ad90ee923db57cd6cdd828b7ab0d4afa6a9ad7e32d407a44d7515c0a6af52a66ad72119ba1daec6514de3f8b462ec473072226aad61135b0f5ec646ba9a127c9894e51fdd1b2d38011a2a6d7497a55283133695d0af9b3ff7c5a8fd667231f9e511e3b8c4c3adc44d02de08c47b2382de67b32826754c6be5231ce0fc657341e20247cc6ce574f3d1a9376ac8237b49e5030e877a4e33cde25d838ead659eb1678706c759707fc66ce84cc968a8334c18f1632348824a6985a0331a93b59497b70c1a03a6848f18f5992972bc79f07f4222d2612797f495463836ae6cd3858d5b9bdf744a1cf361b5d454d41ac899a4fa61081b937cbabbf0ffec1b31c162224ea36ca2cd7fce54ec1a504932acc5bd0b17a156da7488f7017e4916a687fde7fcebb2901813b07964084ab0447a94dac3a0d3fda05b9f497cc1555a8c74838e29cb8ce89d304debe419d26ba7f3dc6e9526bd895495a5ff1d7ec83f70d045e306e7c2487a52cd7553f062d31888ef7fd27f667fcffa984afe0b9a4c4e85ca943812cdc157c5486b0b5ea6da05e4bb8697113190321a976d1806da129101e60a28b7", + "signing_randomness": "022e7bdfb6918b065c56e2abafdeabe6de1c76919b7f004ec141cf7a2813ffea", + "sha3_256_hash_of_signature": "70cd691ed6c8fed9753da53f2530d2bdbadd7b24b90a0dc0ecf0509740dbe9e6" + }, + { + "key_generation_seed": "cc625322c9d52898e7f60ae47bc2847e20f3722794de41e30fdb20ca1a093208", + "sha3_256_hash_of_verification_key": "a5f69a437a2ff244c44cd991c5cfa7ca950a5c4336b9a5947d6b0b6976583a74", + "sha3_256_hash_of_signing_key": "6d146994f8fe5032f6be944ddc6b208ed441862978afd013b77b778d3065080e", + "message": "4c4697a7d8195bc7d4b8f2fcf3a7e9419e8fc9ac6bafc5d658260511c697286bfe44e2ce98c21c98be42e5af0fceef8aa54c5770af287a81c7481fe3391a6111ae6243d545b2a651599b45931d7640579f8659a8bd6f77260f235f71476ed64714fddb70c549cbe089322130f7b0a21f530508970d55cba55baeacbedf684c7979078102ecffc2c3f182f710280cabc2decd3d3b5d3ce908cb2307b00fcc0c5412a12aecd041b5f70cc0149390312b9c81592bb0e2ece83d4495944e29aa798de67fd69e2bd0695dc573f78d8bb48e6b8679e1c50d1e6e58e218b77ee51597eb43ecf7301d86f457353d60e98cedc95b4a76844e889bf7e9d03503757569e40d55ab43d63293eddbb579fe981ffd4dab056f85006ffb5e759b9c16f5f6b235d7dd78458a73ef37118edf599aa504e9db9ab5dbc90b8e478f3dc1f35a7c4604a383bbbb410cfb2c5f746f83ef94bdb2f244d421818c26827d5b7d665b8a802181eb7a9ce95b6633e24d914feca7e969f64038acc3009b15168426edb67af2ccf4e859f5c616891d355f7910acfa599c396bbb2d2782cbf1432e6259faa77730b6b86fe0d67730152cd2ae0f9b0314048ccd25772c01fc9773ebf06618a8ce1e940f48663427775990cdc41c4dd3e9ac6eda1ea50e04f1d329e64c8532a7ae32238c131753d60a25810a5ffbeaa9007a6984ef69eed92b777e079ce0ff48c2aee9c18d1db9f49b5419ec6c0e2212ddd2e2fdeaf0fe9f2b84d9c50dde86a70fc28bbf8918a973cc67a36e97ce3027d73891e7aeb24baf4b12a9dc8aab5d6afa380bfac3703d2d32f1e40fbb532fd6d7d710dc0741dfc7eabfe55ba5c311a00e3be55c2ee74155e3a06685071a962d7532ac76d59fc187eff01f8d339f74323732168fa5d14f4b2a72c9164a04a6ef14bf5deb1833e4baa19a55ae590f542d4448e0eaff0e0afd2fb30fd671631b9325f4a0bac9a43dcd2840185a2f601117a625b0dad5503578537be2a535d2f556f371536bcf68c0e01c96301f08e1567dbf9d8504096a8fd89c086db695da191099fd1e8ea94035276d1d", + "signing_randomness": "230612372c450898499f3e23372b3454a7785f330a70700ee4546fcd99619d78", + "sha3_256_hash_of_signature": "ea12d2cdf0099513a000f67a228c09f1614d92170b2090d19f778b799fe36726" + }, + { + "key_generation_seed": "950226d6ab0b774c5f439afcfd0113b5dbf5905960c445f5e6e03e5d5c687a9a", + "sha3_256_hash_of_verification_key": "c1ff649ed22ece99714a9df5cdafab630ac2ace9d89debaf48a3697365fa5c86", + "sha3_256_hash_of_signing_key": "354b8fc29773fc7386c91ee9d0b8c7dfe7fc24d0837c2ca8804d9df8406a8a3f", + "message": "72713ea55f1e5ccd5787f172657c6f6c74081de2d70816e8531497965df02dac04d91c4d09dcf8904cb152e2138f829386f4351015da253a5b5eb92d96e537dae3ce809443ea90332d9c754eb11f4de586a83b5dee7b1b9bd547ee7107530249b14279baa04683d74b69d7bfc8bbcd447fe7706593c01188fe6ad8d0e2572d49f83e93986b380d4169bdd94e3311941dd2b041dfabc5aea1297c65bb5c8352c99ff838d46b93b3e5f79e3cc5be5408fe5e59a10d488dd65a997b086fdd96cefb0247b2baf7b490317e34330a879d04e374c92ada33ee243d84da015fddec243b00bd7488aefe373e8ab1890273a7a2285988e9daf9c4e7c5a17f54ad6195ede2c79657e1bcced0641e20f7ee26eaf53dd8c82827f2d2783d44fb030c95791f41653e628062267a5cf534df00116c1ed1de9f360b97555c65cdd80724104fb1bd4da5785b5d9c24438557e48aee58d57a03e06d553b05b67e1c8d10085c2f153647f174f7922fb8d2210454f7014bddbc627756eb7cdef99b6e3a2779f82088e3f2da14c2dcb5b185aeb5d6acbfad43e286aae8f84a58e8df6abc64e4a8efd69fea18dbfa6808f25fd418de8ba923500b74e34dda3ca6ad8dc208102dc4a876d8b8cd2926aea4b3ae11a546f6235abea152dbdf43e0bcdfcdc83299207f294a707c8b4d1f56aa64a205c718aca69b862afe7489f11b324e7af6be68380d2ca6e0af0e2e20f890f2cf98907a9d43135c03e85e86c9ee417140efee9054b46c110a84f1841ae3cfafe5b4a95d6b2b606d8d0a70baea85c9412bc2d54146e9f866800e8e8615a0d64d1d595677e8c88699e3ca6097d47e9fe64050fb55033fad4d5f226da8eb5ddf99369acc7552927ed3ac7368b9efea2443926df26d1c172858fd8a5d4e1d7d39e7f7df047385d39131184087cdc45b299bd1f7048e918223da3f960608e853ee49ea667465dbbd889cbda20ffbb540c9ebba5c2cd16a22a57b561e01331d6ea6bdadbd6a5d2bd1441ef4e1d9dd11cc62a0fa5bbffcbed0d27b6acaf0889eaa5863dd9bb35920707b71a0805630d1769fea320516e71cb2b125ac274f16f7a6876f4b922c7c006f38ae1f7183ca768715d2af", + "signing_randomness": "3e4e79432e2a2762b04cb428062cfb41a4c410ae490701f19ebc0455924aeaf3", + "sha3_256_hash_of_signature": "3716ce23d886362f2f432bab6f59fcfa8880b15edab6e47f10b53cfd24f25ac5" + }, + { + "key_generation_seed": "a6b534767a6d839fd19075ae0ba10147c46862bf7bbcbe83f2b72f72f1368a1f", + "sha3_256_hash_of_verification_key": "e174509401f8e7850bfe8e1838772cd86f9022865b82fafca922e0e125430bd5", + "sha3_256_hash_of_signing_key": "7edeefddeb452fe7257b1ddca4915a1479e43ecde8f9296b1c8c88eb63625c81", + "message": "209658cd1d801079ffe8e950bafd70a028cfcc35b9fb00d232c5603a1d51ba13e5de59e0277962c4474e9f3f60fcd99c9b79665b3839d5c037b921a4de8e144fa1d38182fbdeecda6934e814d9186591f01c5e23349b34f4439b4d402c4072cb4d702966ab473d2c39443f41fbdd0c48e566d33e076422ee72fb47b2ffd661f367e9efddc988bca02382ef93590d4fe3ece8b1d9d8b3a653219c7d131b43e2fde2851541f467c31129e6f9b9d124221cd52610b9f138eac1d01f193148fa0415b29f5c86d15067eb1e26c9d51f05655e8545f734f8f244854ad76c6b04c230898bea33efdceef100d79f8e3b894ba583466749b82007067806e3a7b3ba954f6fc5abff0e099a24d14d865f6f4538736124acc5ead4169ddf2144ad558da3c74cdabec147d2afa113edfd1e2280766b18792310fb6b4fe5d0d9f65906b1cc43655bb3d6178ef9093ac9c8f1a91bf49008179394eee79e1d8e3228f567770c1ba1e30ba4bce2465ab68f53ce21c0d8ab2f6e535828f211d4db957dc3af8b7e00dabd8f1f74c959b2aff45121c5b5abd3136c6f55d5f5ffdbcebc3cd7a430ff3813d23bcdc1254fe6949da4e7694028b7fcb876099e91b92c65d85c39d4be9325afe81703e5b18cbd7bd9eb59a9bb9408abd966ade9a60303807ad1b2c14c04cdf8fae6950a55b21c9ebb5e94713bf8c2890215c5da94b59cb31edc671093b15ff5014db4cd3ea8060260dc1612e9fd6e5ab40f0656121f689c8e94212269a7b24305c83bf0583418755ce690913cb081f2893fb42bc4750f2c053c48c1552430793cdde1a49ac9e21913210d727c4beb5640ab9b7505ea4e59af417a085394181784bf1bb0bc32bd71cc57ce77541581f14b8ba4b758500694796262b561a38c72893c77b548d779a3833eeb064cddba5471cbffbc769e139946155bf376a56415ab743de568cd21895ed6951b5bfe1b1629dd6510dcd4483f206954964e0517546dd96900a2540a51835818d1730b0c9123e7fd8b28e6843bffb659945a273cea944ff6e83c234b3e43db4630614e0b67778ea760ee341fe68c525e90475a1560821ae6b2a85015292c36eaa2e041ac04fb55922c48204525187c7e0476a9fed04efbba96f369d8ae709506620127fd399613a9796c4ff96d7e", + "signing_randomness": "6e3210335aef4b760e5a4cc0eb4763a8d8e6a6172d4221fe966222d64152cf4a", + "sha3_256_hash_of_signature": "42046ad144f10b95fe452e49db56738e428393156846eef704be7383760f9eca" + }, + { + "key_generation_seed": "103164ed522df0db131c15e139c0f83d9b1b7a1b6ecf7f89a5248cad7e68de8c", + "sha3_256_hash_of_verification_key": "63faac086c60e2949bb3e2b6ab4fdcafdd62b5e982209ef79797077987721702", + "sha3_256_hash_of_signing_key": "e20a4d5c1bc803c496e2678cb97f446aa33dd57d76e9e6b3a329ab5ce4a12d19", + "message": "8f37a065dd696ad437ec82909261b842ec0a3e66f8ac574105a3c82ec8b4926f2466fa550f8ea1b6a9a142c00afa44be6512a85350930dffc99b95aa21012057051b68c48581ae439b9290a163aa4b6afcf80ffb91a3321c7b9abad56d5dc1be4e67e5576c9f3a7db96071859b94eb22a73dd96c66ae67ab11d1ab62a86d826c682dfb8cca3259dcb5b34be635421cd4206e7d92147f14c36424eaa407b441f58e5c187e58a26b2ae144888a3cc1387ac7d0a681eeddc3b7781ab282e8185ccf33fb27500cfd119e0415db1e45237520a868c8457c88a1d3ee97ec9451da35d7e74924f8902949e7eb14ba87c8ac672d7e4f3bec1b2814dfa67a8dd2e2d4ff4661d64bc4c6d6a78d4e489689b6063cdff5a3f1554501b424284a9f4b8fe777fe4e6afb83a85e36200a9ab40b9c18678454b2a3f50a4862ba1e36f0c57ad004ff90192b5619614e37dbb38a1b8a65ac613f7796c70772128377065b84f122540106d1b4f9123c4e009b4c0a85d59b35f72debddd154abec7f3fb25fd1fa04367386098de610b26fa3ecb031a6072d14607e92ffbe195abff71e586a984131af24e18ae94dbab0544fd2ad217960f337111bfbd4046809ea03c7c47b7177757a4a43e1fd0134859ba735a8fc17597e593bb58322136602954d3a21096b0d1dee5cf0ad17a5fcf561ffa21caa70d33998840e4cfa18ba481704a8b82d2cc1c110fc9a6704751365ae9f338afe4cf9c811697dddfa8635a2f3cd02dd1845251014bf2f2d6c02a907bd783207c4773a937048a07c500d7c424b5f65a2c376523740df9a0b60437cb8ae17d64dd51dd4e433af83b20c4b6b890b97976df09e3a86ac19006c229d59fc7a2923245b7b1f0acf7c42e486d41ca1ac1d7051aeef6003ce94182f97d099c74317f61eb47ae18c2bed6a3cb253c21ec835e435123e0a657ed926f880ce8e5de3155272328a467278f52ac50a1121ae818a3ea3a2e1f7401ce23aaf66a4ac289748a7e98a5124c586d8957bb4edd3f091492bb1a64d75efcd45ad51ca420f15da848b20dc6bb765e7b71359b3a9e95e121266ae4a40dc2e9a3d81ea1b1a643594b3d4e6abb7d1202201de92bdf0cc1ed977e2d5851822a01f48a6f23180822888ce345ac9be0cc69bc448d41ca20b79c35b1dad73e6c683e70c4439b404cbf07fcc39b0e5a1d33f3717a6bad28a6da4f091bc7a", + "signing_randomness": "9af4e56c2162c6f7e78be0487f6e2d9a08e228641ce3b1b84ddb00d7e17ba098", + "sha3_256_hash_of_signature": "ed50a5fd6da8786a35ebd325116f84a20d802c0b30a9b54141abfa665c540088" + }, + { + "key_generation_seed": "bc962d978f38881085c1b813bc90eee44ad9e7651681c20ba46402f557c454de", + "sha3_256_hash_of_verification_key": "6370e84bab742ccf7d4a3c8db77a62f947c726cd1aec5a5d937823241016cf46", + "sha3_256_hash_of_signing_key": "a7e0c4b44962821e336cc59271cb45f3339d6192a67a3c9d303023af44a0bb32", + "message": "30d61c6fbd64113fced8c5205026ebac0d9f3522182617cb00b6e70c8da62ecc1bbc8e1fdaf17cc61dd01ce85a9072cc1d9d34fdadba5b93e0aab4c9c4c9e26d3f7f145fcb23673b6e0b373c0fd1a58f52486b72624ef91a539519ee5305772a006e49521744912bcf3cdbad424f00428aa96ccc21d000efb09da5ce652e361a6fb649a060835e3b9dc9cbec660c7531620115ec905dca6ee2a1ce36554c0fc1d6dd6863b8f3843508ed5c214b6923e7f5c0304e9b0d5e5e433bd029116a33a60cb980737ac950577d0594bfe0ad2225cb8d3fa42f192b0ec05a49391632a32fa931c0fbd83a7b6ea24301ad0906e7911f9d900d19ae1247ababb1c0e9b9bd165185d9d7413ea068fe8824cce5b3ad51fe8e2bb2c4022c61b002c1df4852e4910f38613787ca12371038b6364d920e07b4b417401253451ddc25624b5d038b2dfe29b8494ec960f87803caa256a95c9868af819747e4bf26faaba6ddbaed93a7815c795ad5eb7fb4592df678ac1375388cc7ed3a6230cbe80abbb113c80b70c789cf0c66b943e67ce814f12d3d83f3b90a4320feb7fb81dc93b05d7fe2d36584399214d3d7c71aef322a5d04b5470703b3660bf86b0b17ba9ff23e45f7befec3758786d2111c81ba4d81b83feea35a0668e5eb3694963bb4db3acce4fcba6f3f6fed9627580dd2d2dc103ef7e52bb9745bd42a7fbdb459b5c8aaeba67686eb899e3177faf0897c61b008ace3304c41b4c79e2ef9c865e9958d8716bddb69154fb33187d927b5296c1589fb1ae3d553f116ff6cae56910ce6717c446b9947ab2a981a8f5999c1c6e517eb3fe584f5d10059910e22f40fbddb709c9f686f51abf7d7206a8bab4a346b51523c362d749238d7ef6671a89cd86a8540604f134d760267e91eb92fc0fc275cab69c776ef81dbad35027e5307f1d34ebf5d6e4df424d709666a1e649c044c4930098b2e6e3782a93976b55073c504563c7e052b6816c07f0fd54a759d2bc189fac3ff54549fc4de192efb58a9e301863a77380967735910f63d35ef5fdbd8751de4bc6bf2e3095628dc7f67c1f5571d17aa342593b2c7f953c3f0f22da1862122031bbeaf0d00a029c043304e3e2609c4fed8a7404fa10e2ec846a70eb0e37c5be61e698cf2296ec1fbe6fed75f6fe3113c23b29afb5a6d7e3a9e46e2d89d8c06450cea11492c1a97f7d6be8ff6c014930043022b264fd32593952bc606f779598631e48eed86ec2a013d8eb866f311a400", + "signing_randomness": "1f00e4c1b7706d8f575d69cd0a0520a2be98d897bc8249e95d08efeb68bae7e8", + "sha3_256_hash_of_signature": "74a0266e71c9880685d712f6d90e2968fa0dd6055a48e449e0e8e4008752cf5d" + }, + { + "key_generation_seed": "c3de54854a4060ea09ed92a363f71c7863eba64195e9ac79e7ad7eb6a183cfac", + "sha3_256_hash_of_verification_key": "c941ffe05bb1060a8cc1cc24c471e49bc9c37e91010b78375b30c7836c7452a5", + "sha3_256_hash_of_signing_key": "10445d2fa5cff8d1f1403cfb9c54bb6619fe4b54fb2b08b40cc03598894cb593", + "message": "c83441b16b39bd7993766e7260d07751af2f19a41e70689b0eeed0c118d9ef109866aaef31b2d2962a25a3d1ca999214cdf0eb54598382eead64435b7122d275ea8879bd47b41eb64ea908867fd78ecfbe8e992a2636aa7477de5058179565d3a2ceb8ace5c0302018043c411d89975a64927b48cb622a13f1ed85cc1113897a68488161afa1e636ec786a0aa37b928ba88a50164a9ec372523aa9ec8885aa9c95b29f7ca1bbf0652bac195ba94e976d336b69a9f5346b4c7c81457f802dc9757c7a2435a617317340f764c1a2ae131a716318f00af0efa89d3b57d8f31e155598b3944d950d6a1d6485b509358efb3745b95edc30dcff02574f54dfb2d31b259d132d18897df868115679f06d41102cd4eed4ea290f711148b99b647b8555a4c0dca1d2d0871c59ab1382a2d6417e6236d71e2bfa1a75cda54f93e6c087d611878ac7670a04fd7d8cb0993f456e3bc1c3b5898076e22d2d9e0eebc7d7bb8d142bd2b5f6fa42b40bf676fb69c532d7520a4a105ef0c1337f53d6e9b4ba17f1e76af4cfdf08f794752d2bf71e8777e2a209f8891b1a53d7bf2a5786b00b9a0cd0fce79408f26befa2535be188a68201b1514074cd70660971f86e8d3e92790ae7ac591aa7a996149bcdf060c615209ffab82e6000f41b2a5606fdaf4cd08cab0c2f1103b2436b1fd7dec477c6233fbca3b07a0ca01bf3476bfe5334e32aaa2ed35d5747d673e7bb622e1aa7901c77f28a3ab2197c8b8253a1d28c969eee73d17ad71c7919e7f217ba2badbd1ebf986cfe981024fc347028c1109cd4204c7d53535a9b677e39a43193e054d0fd68104d88934dc7ba6cb3e942aec744b935cdcfeef4221784f96798e650ffb0febf2715d75339d0cb6c2e57c1e9d10f13e6786b7f041ab307b8cfa51a2f10b622995230fba54b70d94ae278ec224d9d0950ba97beba7eeb0e2fbc4093e548d9ec09ca1a08e5f0483024d7c1927ff8dc270900d42d31b81b13a29839bd746cbb3591bc33817741a31dea308f549a74f3a4e5478844183b8d7363ac1f4d4a5e907d9ed98afd08fb8baa84c324563495387a4f12c239fb63f0810447131311b2d2ca302c7da2da57c94c3b5e844f537886fb766ec0e977254dbca8fc84ad77430428f0692e55d8e2cab294b857ab51a2ce4a725433df28d9caba86c770743ad987bba58c0565bd18590931e283292889294b607a5f19d9e905aa3940836e2a74a2e94ff3062e85a5c6c978b5eb2b254bbcde128280e6cf02c11a0c2066f349e3c6c083965d5b8a9c000e15ff36c5bf3a6d42", + "signing_randomness": "b1120b7ab8fcb266fad775c13d6bd5e9ec64da2309bdb637f5decb141b377743", + "sha3_256_hash_of_signature": "ce41e5d597dfd12f47cecb41c3b80ed6c12eb0c0a4102d59fc5042fcc2729901" + }, + { + "key_generation_seed": "828b9804524bdd17d0eb387368b01b0e95b4960057ed63fc2289d858201e207e", + "sha3_256_hash_of_verification_key": "f7f17d0dd65f6e426839b47075356160ed5818814448bd52ec19683781d61f73", + "sha3_256_hash_of_signing_key": "88efbe0b661242d9e40438fe040287932c18f5070e1a559ec638b1c2758cd93a", + "message": "86d27c1fcdb8164f8909073f590d0a280e5ef193b0c42863ba518bc8a51e625658dbe2184c3353faeb674c991eed3f1b0fe3bbe50a21ec70e9f57b97c38d6e436d3dd577d7056b07a401ff0ebbbefaf8212b993a39281190e309ed0c50b269e4852dea85432a5941269fdf63766b21d25d8816de5e87ffa051009d232d6b258c5f43f45f2d48be09b2ccd8fc963fad81fb368502057afa7c865d62d932f652802a299295b29411439dcf832e8367a749b4d7adf7e8abde3ebfb844a9b1d32f77b2bf96b5d29fc15dae83ea80a990aef6590776ce1cb81587ada80b9a7b45aca3bbc54dbe67df090104fa196701280b97607a333a9b56a728710cc1cbb7569b79ff034572495181a92d2380a7ee5e9cd1b0f758c2bfbcc4e11464f1cc7d91f117319c30ccbf4c11e60b5dec724225b8d77b71aa58f5fbd498a3f49115687d58393be648805ba1737bb921a08d738243920c3834f8782a8256b7dd22ccd5f4ece86b8a0860bff21c5c8f0be987f2d510ed4df9cf94bf698680b7cfa22a575a3d1b5b431734b59a4b31913019c1f42dcb76a9ff32bfbc6e16d2fade26e3c17bae49cc415e4b370d1fb43ff652be62d18b0affdf286765f4f30fc8d6f2c4a58cd17b3bdfa013bb2daa075be5f522ef9bfc2e1506cc1c4d381b3342edc19c955a5fe48a712af5ace66a028d03fc859711c9d33231e48d41e58a2c2ad81da77529ad5e6b73e1ac96f0c8e53f153faea7903f917492a1d2b1203174a08551ff0f9f91e32bd0f31d606c80a505d5eb55265542db3653c2621e7eb3fd677f49534f261205f834eef1645af419ef6be5cfc16d54c7eeea12d2eb9458831f77fa558e4d5c7fe446ddaac3e1d502c941c95f572ad545ecc7cad21f0dd50845cbdedf589505fd34cd8c00d57243c3aa3615d84c39b0a72c28f40ac72da25ebc6987df5a7e390399463786e75d524ffb6c961bbc9301264bfe3c699101d18ada4a72d193971d54089e6fffa684cd3d77570ce0bb9179a156d3e2dcf266358499bfc158ac9a6913f622ca861c968ebba0a59a12674bfe39389a2125a02563b082259483e80c89a3763c0a9c3db485aebf22c844539edaa28a3fbc0053eec475679b741d9afc16b5fa109399fdd1fc3574df8a1292b8d7401aac1be452d38f97d531813369ee4c50f36736b95ae9c3e4f91ae85e2d664337daa40f75cced2f4a4d210bb4ee25a56dc217dd176db5aca43c002afd63ed8712d89e266674d9736fe4a9f202a81d177970411dccd289b25798272d2647ce6451906a4f7d46e87a46cf6cd048b6bdb62488a24f48d1ebd61ffa474321b929e0a7b6f9d0f6d777acc14815f343e1", + "signing_randomness": "34f2a1e37ff2d2d8bdaa7a828b98fa44211d5c16b783abc86dcd399011ef2864", + "sha3_256_hash_of_signature": "993158efe19fcb7b6b27ade3135453c99a04c2b36b52270e8c00bbaabd413f12" + }, + { + "key_generation_seed": "4a84ca5c3954faafa11ae87fcbe701ebb5afbcc5f8ecae7786d10821e01ada5a", + "sha3_256_hash_of_verification_key": "26f031c2b9cbd810175ca6079e242b53b9108c21e44fc571a998eaff4635079a", + "sha3_256_hash_of_signing_key": "d77b13ae05c363c4f74158bd86a70a184fb9c18d9a7cfd681cc8085553f7640f", + "message": "56ed7708f98432fbc623424c2a3634780470a01784becff01bea5ba192d02c33675084263c4315420a009579ef80dd15eccbb812652421872a9577ef7d07896a727a64141bae7173426dd5a3925159bfa927ff1039e70f729847b48365b4d3551476206aa049ba5ae8f605847aa03965f058fcfd478961ebeed06530abe900042321059c297dacfe76cc12d52311b2ff8ee1231c77049e232d9fdb751fb27eb7eb6a373b4b1c06bd0ff46b1b208072c873e6f938e689839079e48c6d18f678769f5f28a903467f2ff2a8b02cb19df675a8fc7560a7d38a918ab8be083ec4e0ea148517ab90f38394833304f245bffc47f9eca771fb80b9c71ccd05fc3b0d66eb06d24b914b63d9f16ad2f2bc454b591d01ecfc527277ae71e3dc683161a53f129743f3428fb82a89dbd5d42f3eed237cd2f8d76de2e56a2143ac6b2ba811f745cc72132028eecd4412b76fdd87a2e396adce72dc69b8fe053042e798b220974587af96ba419da6888b13ffe217c9d01434347f4162fd554b760883e8eb1aee46c4c26b990c6ba10d2d939f513bf0eecade8b5deb8de2bc8c8894aca51e65aa696e390c11689f1c2cfbb70bc5f72c1872d99babe8de8fe2dbb446a8129af0ab8d9613f0cbf3cfa6ea3cc409f4a97581d5012707756994b6c8d4fe7f64e0f0b85a85d0a5fe23224dfd7abeba8e3fb2e97ad87fa8dd477adf48f64faf486d0df11ae9c3bd3a04abc962c5b02cda02d48f0b52d84d4920c116c22455df291a96e6adff91e3cd35cb8b5b4e70e3da8b87cdc969643a32b1f97131c5e0bae7f6dfbfac32218eaa596d444574ee85ef7c9998dc1088e5813d50a4377d29506817e4234f68b32ad68e00adbf6462f8d4e215f15a19dfde452f0a65360f7c1f20e11c42eec55565ccb23ce248bd62e9dbe8a7d6639028a92b422ab444c5688b5d191a4ba8956f358d131e2ff6dfc607accc5d31af9678f1a226530078ff9a73d681deb697670ddc3e9096ab0fedab664473dcffedf9be62a5c7c54fa2eb5059e9a1d38413b1a4fe6d531b799453bc7185abaf78cabcf65f365b00827cec5f29c4737047e3b2932a78757e9626a958486d1740ecf1ec17a01aae6adec5104eb934f432207ce31d7096acb3a0fe2f5dd7890c021892fe7d3f34596cf20b6b12fd55911acb46d7386f99a9e9ee067a45c6a1fbb463e63d69cb582da6ebd6330f4f80a1fa72f2ed24ce9bbcd967118cfc7e21f6bfb68a905f532bcf8b8befa03295d362b41d25cdccfc9b41767858f651bc56ab2bb4a8675513c5d6f1c943a20a27dd29f941ad141debaad219e056510bc984063fa0f389090d434157438bb1759690c453a2f55f72c033797a4b0c534ea2ea084b3b6f8966ac56b106fcc11ef08902f2ed", + "signing_randomness": "ad050b9fc35d0851c155c9caa3428967c1268e0a3d19319314a91df98c56cfde", + "sha3_256_hash_of_signature": "ce826412ae953cdbc6655eda5f10c6c9dbaec97130b610e8f40f7605804283c4" + }, + { + "key_generation_seed": "3e74ae2b1d49ee6f149076f0bae2d26a5cadfd5de7bef66dfcae6b588a1f4067", + "sha3_256_hash_of_verification_key": "ea696c483ef4fbf33551d4c524fc8a782eea63b0536ae3d56fb02ed3ba30c5b0", + "sha3_256_hash_of_signing_key": "bc3ab2ebd287493c2c4c72371f80dca9f150d41f450fb642fe3bc9c42bfd39d0", + "message": "e42c006f144b0b4e188febc82d63d3d37096deec9d3dfc3b421635dddb73c76f6260ff1c53222a50d30b26e2de3d16e3aa64c78604e1191bbc0e2553117a441159b2a35fc8889499a2efbdd2f30b8b4c6cea38eb5b2575926e6f22ab96ddb4b0c5c6d78c3754a1b6deba49ffbcfa7477be9a0f74ec379d1c9aa59247c091611573af765ae698d78152187b291717a9f03fe767bcbb12f52311215579352e7ceaa8654b5403f18ce82e0a73bfd5fec1063b506f44eb1c9c5a03697d03dcb2ae15c5095f292b4bcb130b55c19ab728b3232ef77d1594611573cc6bdaa254f05934a329dc27cfa6cd8c02cb51c3c295c964c40502fe2b1a81a51c866f7c7380bfbe339b39c8f51f73722a05b5d1e9cb6313557b3656863803c9dc99bb1905d7f729b2db8da23d88200032f36ffd04da11ffdf6277acc69c5407289d00fdc3c56b32d54877f4a8dc70abd37ec532b8617d9f3c535b8e962fb389e976b4d1aa12de5c1c2ffacd50acfff65201104648e0c04cf7c1f880e8bda1d68404ba67c4bf64c9d2aceef81b35fabce58645e0f2f61eb4ccfefde7239be408710d349987d849d40b3ad294b9d815a91848f9ed53b69f78d9e955f6d1fd7e38ec291664d54c2bc359fba241ba6abcbf5fc2502d93760d9f6b1f7fb766040e98bdc23a6047134a35327fe128ae24b4c7d0cdcf1801947a1821ddd7424892df50e2dd5c1e2e6c5bfb4467524fb45c7d977604e7e0f1f98eb8c03eee1d9a5796c8a801f082678940f076bf44d3496730c9a640fefce385865899fc33b5dd34d036f2fd5d07fdc0a40fb725e84ce403b46de712b4b44ca8801a1ccf58233c5da06719769823b5945849ddabca56b0b4ef9327c8b5e5a445e6853e5b66b8d590759d6b2db722c22f8c741cf3c6325a76d93f4fde5872d5732fb19aaadeb7c18094727ed43b305b87ae2dbaad67f90feb86498cf65cc57ea635340f27ae5c5cd60ad3c763223af877e65a005c488aa4af9309e1aa02002b01df8865fd481ea254015796985969997a53b06df0355a6ab3c8219b652b09e1f86a6ca12d27c4bcb9e8d35e6889198c8fed71ad5642f5f9f7ce1df270d68aa05467ef9acd9a51347af1ee9ca7c4a5d78189042900c6d561f68d410a77e79726dc123b196c78829f02cae7d0623bfe9e7b0d8bf84033086295992b77acf027489d51bc7ff006a8d4ab8079d494413a565e7f687af40dd18b86aa4274edb8845df114c0146de3199cb55f773a87ffb126b3a4d00d38835cfd2d6652c07f572f39d0397fcd62acf6ed9f3e8951348ae7e52a669fa4e2bfcda548abb1989a1d74a27b73103770290e6ecac87029359354ee4c87a77bcb5ceb10162dd54499905ac8ed442c173cacde068bc546720d1284015acb90ca19147694b53899395dc663d6683908f3cba29ad37f15cd3903c4c7f4bd73", + "signing_randomness": "fe7b70da3b78360a10c14cae7eef4db2906329d5ed4bd1ec418b43bdec7b3eec", + "sha3_256_hash_of_signature": "374ae07f998c6d40ac1a008f41c2acf2a889396035ae977d32d26a896712be81" + }, + { + "key_generation_seed": "39550bd2782d66fa95380f5f101d827377b11410f8bf3bccfbe0e504fc09ae38", + "sha3_256_hash_of_verification_key": "6081b7615e6208de080fe75f2d132619c48718acb450baa2807eb63a5b57491b", + "sha3_256_hash_of_signing_key": "e4cda47abe2c14a33a032780b2a89c74cb1b6e09e5bdc6cf8e7450c480539821", + "message": "9c311ff20f574cd9b7bce1df705ae7dce6e7a621c935a6e57a59eb31fc443ab1e014ad332fa784583260aa6153c464565c4568108d60cc126f6e8ec3bc9120e5659c86cda8a31a7131936de7b3db39a4692808dc3d2bee8a99880ff9d1d5eff1e825a0f043d908d62a99779e013845ac0c21abe8e4df0ee901e4c6beb8bb36b30228b7756d617a8f30c16351d8ff91786f7406f75d9fb648830f88ea4537f42ead62e8790e9cf11f72c31d718221049c9aa35376ad8fb065f4809f4383a23c2b29425836c2dbce4680450896eeadee6b83539adfdf59aa4fce709d601640eb9a22dc3b41108a8ee1fccde9945ebb1d3f676ec8395255e125e62a32149c73451f597e1c32ad979e5be914ffc7c548d6ae92ed08501831e9007770a0233e5778f22adf7f1aaadf9c9a7c82d2f42989bf21627d3ef8bd0377a5be5c9f5a585a246a73de4340e6b43b36db775b34033962646c16f26a2b7179c40a721fea54805b9ec42177b42160b1a67341235b5af9f30b2703bff8cdeee5bd7ce506b0707a69f84225b6e5a92e80edfa235803dbe2cec47cfef0d9fac95c3379816a39f4550bdbfb45609c76d0351ddf8d61724bd5e8be94673b3013eebe172cace247d79925b12b5dba2f6fb72e797b2da849b79dee3db76775f5f1dd4595678671c7b18bb3749fbb0c6a7135d639f16b3864b5a251114de7e9f8cb02b4cc69902ec8d7d544d98e24a05f8accb182e2eb44bde868b077b1fac4726e8b01cdd0d024405665f7adb60a23fdbacf421246354e824cb74dfb35e57902794e459493905400d0a0bad51d8eb94efad55c67cd0c7cefe7a1b055f06371aec7f490fa685c611d553d8430992ee7b1855a9cb305b5ce53154345d7def6110ddbdb5cb59559eb664c6439e057dc022f8686f2aa0ca81552428437b0ceb5fbb5df254036bd2bae7290d947c963046771a39d2656312236569e775e7d2a041b7eeccec99c1b9d2757c7370e474012ae707ae00ac37b73ed9c8e1a2774e54baceb42e8b31bea734463cc15576bd4f7a33430b1987d62e47473391938312f2481838f286c4dfaf701ecbc6eab1a9f074c1f8d8963457dfaac9a9a8eea70c50ce70d1ba1006760ad3887605ec38861dc1a777d21e46ea169537057cdfe256cc08699d73b1ac4fbc62f863353581cad358b9c573d77585df6544e5d55048d66a352828cd1adf5f42310ffac022a25824430f741371027b2dc14717dc87342a74f0038674187e478d8eceffc16474a4aa8bda0c8d41962ef2a4b64a036c888ccf4ea628e1cb9ee0f9a918fb1b22b9367feeee0218c83cc7e27c5cb2ac64dc7e111e3c85ca0e6bd4f685e5ddd428e028d192142ccee3f0c8337bdf43ce4b62704aa53c703ec334fb56ffdfb81d7d4419535d17e5fcc0e6f558ad82149c591fe0357da15660f61544b4041128218b6de2b75d3801510669a3977e2983bcaf957ee2942e504c29890a81542ea208e1cec", + "signing_randomness": "7fdd2cf4e1e5d5ad2a80c4075ed07b30eb59a4b4d96477f25716ad9549346da5", + "sha3_256_hash_of_signature": "80cb8850112df3fbfb44cfa741ff539c074caac87a33f9fd526bccd94957d7c8" + }, + { + "key_generation_seed": "b18f0fdf9dc4f514107f88cc43fb29190608ebc5a2cd00b49fe20631761038df", + "sha3_256_hash_of_verification_key": "50371586ebee9ca16672f75c6721263a45c783e2cf8f43a7e02273961be39451", + "sha3_256_hash_of_signing_key": "644337ea3bfbc8f9ccc6fe89285375e348511677b55ec7622ff350b4c394f8e9", + "message": "7ff38725f35312d75e58845fbc33e112dd95d5c1cf78119cb413ac839377c7051bf5f17add1484f5ee12f42b0587ab41df487ba5e4d8836777b614a9931a5fefdc4ac451662b342d675c940061c4ff01f747b69cff585fc5317636e2a830140c0007f73c76fcab96195c86db98e5e65c733825db0325407e5bb059490f2e9133f9b4aa328976256eaaed2fbc59d00288d4830d99731a3aef36e5bf5239f2899c500f942b80b00c3b33307450ff0c105bedb7df84231c5d24c3c3475ae2f46336582de93aadbfd385c824f21362c19b1c6a75f56b69297fb3084b6164204e2348cb1d7cd3ab494bfa7ec8fe346251c874085f803bd7f4dde1995f0d3d17033c461d06b49ecceee0d5312c3a435af5bec9808acc524599668aacd95ecea7ef07c4ca3fab1cf964fdba987c345046e6507ac3d372bf07d72cab816ba627c2bd452ab8dc3044a7f0a01d8c0ea47904a5dd66c6b7ef9130d628a4f2cea5a0d05aeab7daf2729c1041fbdb3c2d17bd66ae293c03e77a0837419471c29691edfb20cf69bc6260975089aa437628f140a44fa2e2967357ac1bf1345e4208c33cffede6cd634b371e7745143ff848f77e5130d1e0f51868585509f9cd3b906ee0a5072ca2e908d6765c74d9b5c35b6ba784a3ea59d808acbb1c24d6c088ca6c9e17bceb18337a4da0c1daeb5d51efb35712a475d6c5a2ea51e93fd79f7deb127f3418f354df06489e10b42bc1f20651660caea17f67f306f48e15db7e67a1b56578ba7be6c229fed9567e128d48551e6eefa17af5b95a716555571f44fbc41ab29208db7c1846e130866d5c9be6f73e601c55610dfd0f67d98933d252059daa1dec20ae0e5bed6568a6322322d8a40e6835fa66e317733e1b465434532eea8fa76886b600e06efc1da41f8dcec0a5e8ba8419f0b7879cc0a93bd14d99608b5bea931d8971da8d2d89053e1de40209e257e741bef48c17fa15467f1312a368d4a061bfc76c2b7bbd900b4a34da51b7cb5bd6e2fb08806a53c0d60273167d822fb6982785f2c3b0ec7d893b615724d0193928d0ea8ea2a1dec5abdcaa904c754cb7747449e87221b3d86bd5df26e11da753e768a8b481c306e485ec91074377dfc68be74a444906e420c2d8bccd84be13aa5ccd11115b669c89e9c0ce374bc4059c696e5f8344fee467ac8c8ade37daf614992914c763d971327b60946943847fb6b82672cc376b780953b6f4433df69ac61e110fbf1a35f6272561193d8652ebce3291333fdd4d84b9cfbc60a57e1f8b817e84ea15d440d4a4b4f7e19c08ddfc5949fe8cbddcd0296a62f12f53d48b1288b80e24c756fc38e2fae9c7a3315d1c6da42ae838afbbf5569f633a68289eb7073babcb210f4e08856fa65057bfabc70ad3b58c2c870dfb5e1b0d11b6fa6d5bbb68285d8f9c21bd89669781c9f4dc32eb1ef58b80b1d371334d36fa66a2b3dd4b3e4dedba7aa9fb7e0245f5fdbb66cda653c5232a131ec1f0c21db1c47b990a64a24dc8c4da951f419f57c03ff506e0147c22e99461", + "signing_randomness": "c1ff0e9e3f024036d0b0c1b7db341485685def89b0cbfe051fd31d50401ce1bf", + "sha3_256_hash_of_signature": "c82ba635b60ae1ef454de7d2e6dd10caf80351e874c9600969379bf0d19fd489" + }, + { + "key_generation_seed": "d4fa14da39548392300a41be413ebd53bd7bcbd045b4d3c8ca44abc9599e269d", + "sha3_256_hash_of_verification_key": "bd47c435ae70dc135f8261bec00e540c011caf3bc711ce64029970ae34b7fce8", + "sha3_256_hash_of_signing_key": "b3a9f17fe4f3fa5d24075bc9545610ff31c460702b1796873678c4b16e3a3aa6", + "message": "789518ee21dc99cac94dd5298b2f3eb8f6ab8d0705d24d9aa3012f217464e7f203e08e5cea9e44f54a6f73e88d81592826e243b7f0b2a1b3a06e5afde23a2985183a0e430e01c3fa90e9f1db7e69dd8e7dc6fb802933e04a18834c091ecd46f0dd423f532668cee8a12a06bbc7e5ff3b9488b8f4a87a92bb8d6f313269ad95c574245e06563bb58bff6169b8f4c333033bc128b91cb81dd41b831df5103b295f744ede95fc3a0c72f1134a9321836afcfd563192c343040b943f69c0e98e8d740c06ccf840cbfc6bf777c9561065916f13d116d758a151e8ff4c355363aae8e4f49d2a2e062a2bb213aff25662d95549b4b025e70aa3363b50d25af84a3e5b0ffa598ce074733ad191c86c351592299c26c0a4933573ef436b73dfd0c4eacf93d361afe5f824b91bc178ee8381b9efd52302ab8cad6c08c7e090393b9b8abc78af374fac6e60bd104baaba524e68d75a759b94176105a9cff2e5b9c3984ff61c5afbf22b8e1b9e4f9bdffec0b19c2a5c8db3b8b2c02115d101805c1bd6652f738f02600e38998ca41ba8955094fad5bdc34133d4b523ede66cf483f1cd5acd9efaa69703807410939974d6dc033bc696541357da9881a4fd1385671b6e4bb889c68b544175c1e2ec1395dff4cc87e037087c615caf40804d5f44a2de301961a59818173730a45cf4c2df172614aff7199a40c9ffb9957242a89ff86b36a4f4d60f15db569c2fefaf677b35fe5f12ad5a323397714286e338ff6b9080fca50b657db477a52a93b243bf28ce2743794c361f443ad81ebaaeab2b237ebbc572d8586c3eab1f42baec1c985d28bc58b296a11d96a04b0e1f7f6790b92e450248804f3f62b5865941bfd444a910f31e1d6b79d8906e7e9828618f960ec14124fbeed28e1f58a8bc9d31773442fedc5a220f3912d0b41267d427c0c15bb76f9200c54b5f050307e13f1eb3de92b864c994a3df4cebd1bca634710fa342e23d7c8a5bac1b58aa321e215e4418428206f05232e2bcd1b5ee1bb7e34e7d4c93088991ee9dd643fd08b0185a2f0aeffb0ef0eea3acb4ce234bd5479a4f4296001305826f23083cc9dc99011864f250e77e42a0de26ab09ff6e3f32552f6f913256729b357cbf5dfc825e91bb5d3fac1f729803d431d339955960ead69b1e54536cfd774341cdfde1d1f527da4e738b2e292bdc884687d1016dc193edf34a37d284d026d33698295e864196e0bf16fa83a35f65ff2b38b7030e9e63eaaf594f272e07941313d538546bc84671739af822391ca4dbe6a579a81f45ff51fa5b7ef49beee7beba4ae07452c13366668f02752923ea3653043b26c883799fe6352f95144283d946ca87143b74c8a009c024d073baab9bc4da6c87d35fffd753e1eec7f01944639e566fe17a6f715f4197d1cba58d3d153bda37d7d2d5e19620ff0842527d109333fa2ba8bfc491689f4551bee6c9d13bb9e69ee4f44b782bb05d1e48d293bc15b9fc706d52b021c7159ff7df80e55627dd7555795f1fc616830a4ba2c02fe1a19dabe088e460bf3c5a88313c443179c593458467faa468791ca74e9b1e759847b6939f", + "signing_randomness": "35c3848bb8ed68520a67de0a06f41c58d38104eefba7204a7cffcf76891c46c5", + "sha3_256_hash_of_signature": "d9fa2fc455087db09f03052c6fe447fbf37b9da62895212a7621b70c8b830567" + }, + { + "key_generation_seed": "c796fd12d1feb1df46b162c38292684c09059e4463cb95dbdbf498a4dd4f7f00", + "sha3_256_hash_of_verification_key": "c830762b3410c292ddbaf907b93362e4f40d91bde3e2f220cf139339085c6461", + "sha3_256_hash_of_signing_key": "4bf931e2a3d8a9300f8f1f211af1d022efdffa78008adcb8b6c32ce6f2055a37", + "message": "a4117808d9d05b702483924e99623e778e7a3b7623739ab7ac488ed93e711ebddec383bfb7e06086fd0c374f4668ab744ad99b8af1c75309b60f55dc03ff7be6f23187ffd5cb224068568ce2d06abe441557b04a5a0c2858c416f6f7aa89a96adfc2afc54e0f31416ceed005b7b140b342652dac7bf401fed4d94d475784936fceb4b4f334bb14ba55b1ea9a36e2b0591287eaf4aced997162691a96e7f59853e609eca9a225f615a49a12763d80b5dfe6f8638923c39bd652936b19b944d5116f790e866a61947eb60cd1f3a1f319710d0f40e487efbef51fb4d00f5dbb94810128215f72b1aedd74a1b1d237088de3098417714eeb67d6a3e6bb647b6b0ac6d0ba3089d4cf6252b69c414e2bd6614429b6fceabeba50a4b53c7394652acf7dd9403ae14436ed5fd4d1c9e238a8399a763806fef5c3742c55b7159ebf5a13b271428f91229c191d617808a26af9190f9d445bfd3b273702bc3e7f610854c8e86066be7757960a880cb6727cef19dc7b464c464a7dac9ae85b799747b8488a4123b6bc7f0f7c2a8e53fd4f8687075b4e25660f5107acf22ca688057dae0496ff15a3eb9379a9f6e22fa43c932f137e389478c05db86060686afeafbcb9ed79ae194c4146a48ce5e07eaf585279313851cb864a50075ae46c1aab3b3cb920dee2652f5afa0138051c7c980946e8d5e18c16789cd184dc5598f65875ef43418dd56e11defb5a4a6afbce041bb292e0e2ec563296ba4ea6cbfdcca32a18c8aa395515a83d0fb7819413e5ae056ff0ec2f63f1d52a8be0b334a628d00995bec7e46a34bcd2dca0e9c5a88e0fc8c43843d6ae074c699276293fd8db2be48885155688428c2f5a6c6c91bd4a03cde2126205f9ebafe319d1b4f80277fe99211a09628ad840046eb9aa568ec71252ce9f69827b677d9c0d99546df5a48a8d253ac0036ddaf4d045a70f94ec54bf5f06296b2c2617f2b0ec0b8374dd28de269faf739b1e55ae1846f548fb6c0403c5ecee3cf9d1927e317f0d07e11aeba01c240fe17c6660f7cb32305af1eb6de4312fdea6990da4e9135dbc0b88ad0ae0847e1576f3c2711b785b846c7a4b823688e4218596caed583a90dc46bb9b27e00e4c1110b65f77e602f043a8441563667691c07162e52a53cd76e2d74dcaaa2983bf2e8f02cc30b05bd4f9ac731931c59f9ebc038fafb09fbc886f4c4191352206bb49adaef9d74bd08a5b780ff0fa301343f5ea81d36912eccb0ff24bbf0be6a8283ebdeca79cfb22639da38c9c639c4bd66fe5a75f0414fcc1455702856e6fc58344bf02998e17e967183ae920b7e04f58aa09145d6da79b65efcd18ec55bb9cfd53914f80d73c2b08bb754ac63e4c82d44b72376a544d97394b7c99678758b15cb94e71f9fccf674b29ed5afdce452959be5af510d57f9e5395a576eaa1fa7ba9aa4122a779727071fa485c005b447760410dee20b7c2299b4a0d5d9e5e4e038a19c87806c3fb875ea5bd7f47d034d7d5fec4bf132b04e47574172d392ea7b371516190ab81c67b45fef6332848a51b6c7dba90c410a44e9a88ac082fe296a7435e7d2ddfc645d5aebbc29620525757dad1b0222159d658c7225d02374ee6af479fcf1aa28cd91b", + "signing_randomness": "e23d6768de6e3ab32855028cfb7ae2d7598584cedaa314c70759b608c86edaed", + "sha3_256_hash_of_signature": "dbca4bf5c037e9130a32e26202e654f251372f76831d47145c78d09aeacb1167" + }, + { + "key_generation_seed": "a18a366a5ecacae4732dc9e954333ead153203013bac4e3c50bee15269f983fb", + "sha3_256_hash_of_verification_key": "2439e55fa69a1a3abdd862206e148cd7e7031a6dbfa8f742bb9c09bc494c5a54", + "sha3_256_hash_of_signing_key": "ec7ada37fd4fad0887463890581e35c097a8607a60c1614953f606dfccef3ba3", + "message": "e82f5acc7c1a326d430475357629d568ea3d0dbe131114781d5bf8daa32fde9f3cecd288acd14445678c5ea6d3afafce48ea3957a6af8d8f23f78d84130fb6419f706eadd430cc85aff48283f15602265059abb075e011e3941834ebe70787cdd55f1e604c6b86f761d94c4f5e525791333df6d43869d6f36b212a8f35583d38a21d0947cbe26fbe6a36e189c73137f2f2d89f48566d04d2dd9125d2ea4e0b2a7e5c1e9d2ea036cfadcf7bb28f6df3b7d6395230c9d39d1e7558ea25340252708be23ec6c0c9a0946c5c5af0fe037c254d1a5b2b70b8f916cf37945bef76bdfdfb19a0daac5a83a6357e986b3155cff31024121634c3700ca99e5ecef1f2e411c6621fed6092c1ab59860271ac7f431e568075d59f71aa18096195f30bbeb1a6bac20e034f83c72be0536315879f1d1b7f31d38c12dd8e97819b4803d02becd436b61d1296ceb78ebf857e34087ec8ae8395269b5b0770b3423b39638910d2a3ddfec8502389fd8b5b09ffd10caad1a5c86e7e39629ab09a4abcdd00fbb9821f92e7dd24dda83d1d9762f52a89bed6c20648ea04fbad4233e5920ae83ffec28fdb5e432929a41db782b2cea8feb40cad0b27903050b650477e5d9443a536ecdfdac673952810596f1985427359d9e4797cabccd2fa0c0a2394d853b4e6f8e150b3e3ab5136cf476605ff5ffa9067c0fe58a143b50b18b09256657cf091132d449a6e7ee79aa870e9dbe46bf840edcb983f585ec2856c059808e72b8c901a25d6afd5372f168d533052a6d26418e035d87d0bf818adea19915047c8d824a425a8c7915756673e0f5fccb1b4fe7c1fdfce505f7e18f023fdd32a605906ec48e0fa755b6d87e47711e158d672c5fb4cd3b8d1d13fe9eece58453987cfcdd87b621b870f3aa27e73b6fb7fc0a6757893b978c63b7723c49d1005a1e5b1a4d60c4a2fef392df7ef97f149b499164455633fa485bdf92f804a47c8703d124522d73887a2b032f10f45343993ffb009d69e80fb54b6999a5bdb2760f8bcca648f3c52bfa1d887ae49862db4cbccc7213acbfdc48a57c3da1f1ebbea828182432aa1c593c3e5591c825e5706a5f9503311e91ec3d8f4a9554c3df915b5fbe0516a7a5597ecf8862a8df286ada96c90c9f2783f7f947a18ebbc64c1baf24b29f77521a9ebe09becffdb902efcd024046fd3e6182bf0c84bd3a0a5410eedbabfc60114e5db28b0943d79f58f766e2edb16759850d4cc3a9a57ae073cf6f3b24d36a4365e2bc64674259170b6d11dff63d0deed085b6321c45f218e09351aa0d4155189cc98de5627a03396a067ab3fea2c133062e3823fb1cafa5d592070c8e82abe812979dbdcb6d2e595f33830ad0e8e2f9e6cdc4d9c74b8026ead1815de36772769c4e00806f79950a40c979c14a4bdbfdb79df1de01fdfcaaebc93ddbad62ba166843a121d2b144559064e9de9e310dfc93d624c1061bad3195d6c9f46db64c65a31e90371f9b644e2a15e01c262395269a9ae83f50776f852903f86e5518bd008cf1b35e78f910d48c0b7bbaaad5dff2375c55d56b8f65b922229d5f494edccd2d676361619fedfe6bf0bfd7e4c77fc459f181120c4430c409ba89d2e5a8c36cc6200497611d9d705da6ae1aca4e16b389d632a982e017e1dad95dffbc7a7d7191e7b8fa1c0ed", + "signing_randomness": "77389d1b21d40a49d3c39ada885422bfd31059e24ed26c549293171568c7cc21", + "sha3_256_hash_of_signature": "878eb1cb3c153fde9f51649cd6942f2b4a0e3b6de5c9f2665f64b21d4694fcbc" + }, + { + "key_generation_seed": "585e714d565aa66078bc2b12699f1e86c6ff30a1abc8cbd19563bcddd2f1f6d2", + "sha3_256_hash_of_verification_key": "fee9bd70e05122a8c27d156a5ed98eb4754731013e1944f0f7a30bc64e7ebf1e", + "sha3_256_hash_of_signing_key": "8158739b3c87a4dfb09fa59835121a2e2415e19a44080f56edb7535682362d03", + "message": "743e5d96b9b4c1469e7ad2b3703f711faf60ca335358ff3efc8fcff02cd020a443243b4169f9123351b6c36762b85be5e5eddf8d4b43d82caa615788406a31cdf4f7087d42db21ae48a069aa23a8f6d20a1c0762f973e526f011dec737e986cc324724bc5336d0362525757410e21046a12ac54f2237e68da036a5c1389e46a53ed8c21774906948d4c9e14f40519c54dbd02b7a4acaabd24ffd7f6ca4d6d582ef48940296d2893415e811fe7ef0801b35f1c594e6fea2c293869bbd45618b6f04fc26b55d55a0ae99445aea12f851b7e58a49cc6a0044f28e3eb838cfa6bac5df53b0db78be2ca2bea1bf2deffebd673a783c91a6c9ee710b12042ec2863a9b52eada5b0d32101bba8338f7c75cdae7b7fd6797b25f96abd53a24a7647a1c91610306ffc72a8da4d46b1778146a98bd59cea3173d41d5a53f9a7f9e282b5fda1afb062d8afb63cb19b0e76df782feb9f7fd50902133529cfdd7c51af297895ef6e1871afd4c3de93defa8fcf1fe67bd27b7eeb0cf37a6a8e09af1203922bd9b62672d4756519cd09dd9271ecd0285f92030a9fc81c09bf2fae86f5f50596c628e0be673571cbc2fd76c563e113004529b234fb50e9e3d6d1f814cb8e5b5cc3ea365d0bc7602b146cc0361397d9bee9246fba3a724c462e177d27836093ec009741abfa28379aebcf5ef09bbce00ce449fec3a3302fb9ad0f010ca338363539da545f159fbcd3d6a0482454023587a324f5132fb6f4ca602fab2cf6cd59104427264cc9ede8d10cd9dd7fa6133e65693dbf744443ae920994226e21d98634bc7f0710dbc37c18203efa5adb467b523322e21e4e686b6b85b00cb501ed84153baecd4d6cac9d1183e38b510f7b1dbbe5995bcb717529b83fbbe969dfd8de21183762fcded692b16502834fe8e7a7c46f84acdcd2c9975098cf0cde8ac0efafa449dc26840180dcd9353a2f1b06962677c808b07345e8abe95b8d24f21d751a4edcfa0e02ff077de64e6b992e8c8822682dcc7f03ca7582fe7c74e0a9822a02d888fdde1fc9e73c2ededdf32001e918771e5f511ef8f88ac19b76fac0c812f56938f814d712d99269d7802e47634e541b54e00f9eaf78a421506a88b4bf7332dfc7d79e8c41835031fb449507d19d5a8a512a5c527c95b6f21ee3e41fa43591dd9bd2e4293701bdafb624e0ea290da4b7a173003867c4cc3fd814e117b4eee283c58f5fb33d653e410f68c8962155b8c4fbc13bb750a0343737d1fab36ebc618a6a7c8e6f93855cb24937b01c438fa713d334df335d0745582f680627d8b94cbc25f0d12e3b1c27a3ed72e2558b800c19dc6b719b961e0fee43bfc34e999027ca1969aba4c45fdab9af01b955e948de951f5a1088beda43ac930fe99d8cbb3473475c444f43e928e1a44966265b38fadf9b1183700a95a81f85ea43e5c61dd9b2d67701c95583e8e3f15083717e1722d764b6e624505347c30e5e70163ed9a046c504ff534956e911294d2b9097bbeef8740377ef0d6c4cc8086422902bf63556ce6da8e33e68fcfb42707c00693a995d17680b76293194db217eb5a928303dcf1814e4a881b057baf2553ac4faac8e4bf23fd4074154cd4ae189ff7e204eedb8edd594cdc21b5b7d73a712b511d068f4d217c0f91f9d84c524d973d67aa741eb13fe922afabf79cd2396181143783030fd2d0cfefc877934d8037a4c32ae8e15b50a6fa4269", + "signing_randomness": "151110d1cb8e5e42a3917527ba7a5cec33036cac5d0a84bf0f1b7b0e860bd0a0", + "sha3_256_hash_of_signature": "0349a57130aace120320ed0e208a37f73897d0aa70d64df6b42a5d82e9d80263" + }, + { + "key_generation_seed": "662cf70d3d5e95a9c6a33bd7c6abf0e8cd23ab2d2d9420878c4835de14a6c606", + "sha3_256_hash_of_verification_key": "69dd361b7e64ea895374635e3391080eed8f82f8b27c43254f37996bb6e120df", + "sha3_256_hash_of_signing_key": "4dca9f181c0dde7fe5bca09a42c4caa85adbc1199e18ef0eafdeecc02b1fd95f", + "message": "3382e87ba70ea986a044b0cba2eafc3316c1ac95a5f16f6368c210dbeadfae6cf2382ddf5078ad594cde3bd1a837c517b1a20a2099d938df6aa02b6c0e62fe6147c904bcf3ede51ddda60de7887dfeb2866db402d23e5934a74c9ce4852d4b2f53cc9bcdda312964a548f6f7c8320af1d1bdba7fd32ec6c86bc3fcb4205ed3db092fdcad9ac4d2b8575883e13f69d8c16cb18d1b9284b31823ece917c905c5c8b9d180c1bd87975871014f773fb57d402b8fe16ee312692665824cf0bce4509326a31957319364cd421e9b21bbc1dff663ed850858a2450c2ffe64b65e009a3999ce4504ba5313ba0ee4a8843349c30fa6e59fd3aceca130a37c04f9b64722608768973996112684b64d0c87bf95e5dd60661935831a6a1a9575ebcb2f64a15296be788c775d80523d6bb4267d91b0c71ba5f90ddf1933de898e79fc7e39d0a3d146f185214468da50aeb47402ab542e52ceb768a70cb1f749e4164cf20e549b674ce965ffbb98d874d34b5b7851e575e6c1e4de9c170a10dab84940af055a951260b0119f5acba320b55cdce4f16346905a2073cd9fefba95734e4f4dfdb7a33f292d45698831f1d3e9fbf56d9692c14a8f9887265cbb4441ab331d977e3a68a1bc9f406ae0fb1c6e91205670641b9868e2a987baceee2364fdb089a63b53976d600bd7a8ae88a02872e46927269d281cefa385c98ccdfa6609394943fac32237368c6203aafabde072054ab5a14a91391d5a943f4ed4a4407f275ccfd15fd28f1ae0eb6edcc6612e3436572919e4dfb57c049bd77b344d8e04152863efd4fae8fe3a7230aeaaaf82870820085f4b3eb5215111b6b8952cf2ff468b3d10f3af849f16e190e9560f40b05e6e2204591b58a850e2710f7043aee2a44a6d4a108ceedeb2d216e51102dd08751925de6a7f67bca1980f0789b34e2f86729621f2285c5d3a036cd87c76102e9d607c37ccdac8062ceb961053f3195b5abd88bc64fc65f8be34166841683f1eed291938f75dfdb3af4fd2aa98ce95382acfb5d5dfe6ef243c8a0b19b80584fc0cd533e38bd485d1c52e0eb5bff90c0a947d9b9095ac1c0ce9754eabfc860990206b981235c7b612db61c9fdefc0f14dbf68a8a0ea4986cdc4aabad6c218559e11cceecd804eb98446fb33eae47c0388bd8972ddac02ce807b707d6d188cb31a1d76d44323e93dac4f8ecf77e7896c052ef16009ce4d1147df84fd5785d95d77310783f9aeff1dda693f4bed26457ed82a1cea19d9c4919257e3050b25a7d1ce7561740ddac3fd93a607c79875e050e40498bfbcca95bdb3d0fe639dc7cea80e3dab3ad73a4265f012451c1bcc2fda1e1aebb7fb18407f31e7496e2a18d2c686b47120688240a2fb134a3c314d4cb422811e850524684ec485e061f7365494a6403af170da461a3bc32ffaf9143d5e9b17b2285c56977aecaf880cdd34f26120dac4c950198233a50654efaca6ea97333d2bbc024a5e668821d20333df0b712510100aecab6b484ccb7814178f851a3e6ba0b76f16c4685d5ac8ba48558d382abecbdcf0b919c1acae46ebeb5011dd0b3c22b539810720cfbe4cbadb111e100c09c811e724a67c66a1b89eed1e7218861f55a4dc55e236c6e3521dcb374437a14e8000dbebf0f7f9bf409af952888675c11326d9e3e8a8828bf50caecff96075cf29446cada373529d310660cbd60c042c143e1736fe7afaf6fbe42791a8db01ec0475145257fe2df766d4ea972b14ae5110b8f8f42d659383e9bd76", + "signing_randomness": "7ad0ab708452cee65cd6b0d46ae27bc92b52753064161b4069ad82a50e65da4b", + "sha3_256_hash_of_signature": "205a52c01ee78eab71cc1cf1777386574065714ce81f24105f8a32762ed15398" + }, + { + "key_generation_seed": "1924a71628292aa3d2d34ea72e2bfc2520864205f54ec6f19f7714733aa34cc9", + "sha3_256_hash_of_verification_key": "3702fda95d3d73c71345e1b5aa2f0f920b880f3761fb68d871f34552ee603fef", + "sha3_256_hash_of_signing_key": "4adc19e8d79694b5245a279d56fb45669cfa67ef945c565eb8cc104c6df94924", + "message": "67109894c579974373ca0054ed5f7c373b7aeb810721c3d9cefa02eb244ef6b17507300370adb24ae0173c6d114c51e05f822a770318033c082b6502f70012283eda2a9dc0a1381f145470e5d3729d201773d2aa63c18885a92c962bcd3628835391d70dc36273dfaa4966f65ad40eb51fb4b416a8d0b1ddf39cb932ec4503bea23e3d9d3b4501db426c6ad99c28d415fb565f62eb5c22bb043c8cafc42ebd1c7190dd32a5b14b571644471453740c081f3e3305f9ae70a5bd505874382ec0f6e2188563e763bb8d1bb8b16587ae25a6252f51e4ad02d0483c4a6e8aa2849c44629cf4b7c6dd6a5fecdab0f9b2f0b35e306c7532b64bd5a3ce67a0247d97024aafe5cbc13e375aa69b8287bba9ddc9aaac2bcf41a71e373ee36b13df9f829bbee8f48802dd9e03be42a5e290251bb130e0e2abcc4e096dd0f264e5d29f8c2388a0c3010e78f2a03f5ba1be13aa5e50f2ba67a031ce3f787754b8276ea1af62bc5fb4dd9a9b9bb84217a37eb9fc7aafb517337b30454200d6aae491e50d5007eac2150f60f640a5c4624ce6d8112119413731322bad9762bcf72349ee38e2a41102bc5461d72033072a90e82d105e6fcdaed9c223a4142cd55920196d7b1b9278c84b67a2e35bde3c9ceebb8e9007ba8758bd35c875dd5fa0a8fdaaaa9a09629b9df69afaab456e105dabf2ac5834b8d223b0a406e0d1295c876c447e8e09c93fb09ed1b3ef6e1f3b7fcb029f576a45a12620567e05f218bc3753109dd29ae0ade1370c0f871ab5ad8a9dbaa277fb869ee552e8733e73886d6dfeace6b35e481f37a516ebe191daa6f83e4ff453cf9cc9ddea8ee507af0e62ef3cb8c22949cb828e21c6aaf3fa9ac301e2257b0a054ff0a237f527d53eb757820af637ffc9f983a2b5aff0b4cc493e610314432c9c2f0ff73c4240d520d1d73721b429ce41807b7424b14f5eb1cd23d5562263fe1d58cb1d52e5175414800cb090242e240c3a7acad4c84dbd8abc2731fa2b1d9820da60fdb6baa7ea849b6a146e07af7fc201b3a98e5194bb5826945faca3690209e5726f070a71ee07ae76adb7e6199fccc81c8af7a463633a58873b4f7e65f522fda409979de41cf54f659e66cd5950a3a3e01570526c46417a00ec2e8821dc380abfa21384d141d259cbb9722f267e46272adc5cc4bce382b554226996f4a6a1605287276c18a48c8ff1a92ecd2815ca5452fd6157fc27532680022993535549bf9ab064052e6db4e9f83b5d0d885b94a90f59e67b9df0c321eb0f95ac07007e4ee33ba89aabeeeea01fd1172eca4e31fb02c507ffe43cd0d6c8570769a180e68a70bd344b4c992e7d3a6bfb96ac4d69c2d4f5efaca1d348dc1988de44b30da76babc307a88124f96f26737a85fe6047e7e485c7e4b6b99b575faedc9baca3e080e2b074cffce1f716c6a1d08234c45706d2883c6e5a001d02596cfe5b260de6134c75df3ac8bcf1919759e15576ca147cebe041d04e369bde70cc64157aeda311c8da520eae907c33e30dd89013e24b7b02e66c9f285bf7d5c3fd65bae24ab20d40addb451ab4bc4b9772d0b9039461bca8d3d2a4d71a2e6bfbe7f02325fd571fcae1fb47f855612f382188a5fa3d61c3e8e59ef016db0149c52e1c7dc84030e6c93c4f32da6ce5f3b8196affde834d2adc26cfa05940055401891519386bcd33d85584d74b2f16d8e19556c272aee8397a1741effc283dbad317740c1b67f8f4b7d2d1edd68d6615eac3f8e3cd26ac4f8058667fb388b19c654711b5b2eda75a9ab55174157cbe08c186a3d0963bb3011a9567bd499ad2a8", + "signing_randomness": "c873b18e32e373e33b6299c960eb6db2fe8d9274aac0d9252bcb5394a8242a68", + "sha3_256_hash_of_signature": "545fcde74e9aa94a01368fd3fa7824b0b307a6a11b9c3218b1b959c598c9a6bd" + }, + { + "key_generation_seed": "ef7ba21809ae7e0bc3230b6061c5fee206d805572cf1345198e1ef22a8fe7322", + "sha3_256_hash_of_verification_key": "ba4386390e11f40ddd2d2d3eaab253de08ed1e8e9ef2a9498790f08cb44d4b23", + "sha3_256_hash_of_signing_key": "3ae0de9ccf612c588eda9304d387842f4c4a7f9ef8a3745e3b4b5679cb472d11", + "message": "061934748c6758ecdeddf3a2df78574a470621496ce3f12e5e4555febccc1a46a772fcbadeba8b2eb5231b5b15deda5a38076c737e5d091a8ca8482f84ec4a20a51ddda391088f2c3926f8e1d8b77dd0abd606e9ac25a17a86a5c75adc215c5030355c4a1b307c1cc80a3bc4a7d4b4044fd35d173a2c7c081318f707828a3438dabe0836c2d6c14e1643f05ef8405531d5594411ae4dac6f3992279cae379d7c1762b122037301d3ffe8efd1beb4e027e055527d485d0871f2013e7b25cc26531c2ca6ddb98b31f0ac2c3bdf400a0bae942c9d4c4003f9952b67af67e85f572edc3345a84b6dc3cebbaadb7e3c876ab2da16ed0eacf4858033bf5a4f739f9e083a345c2bb5d8611dae90d25ac45d8b3d39b4de584cbeaccc6f5b6e61524349b50e818bb6b03c7e5b86795d49324ce6b1603791f20b3500a1b8ade82359263470d777b35dba38276096445842ba5d5e960fb2ab58730f970a15aa42d9737c33be700127a7ce7cade024d3abca59ca49f9a7edf44db62ccc07a595016868aa97a140178dc92530eff864c24954464ba886db7d74be7b540baaf807f1aebd014680ff4a51e16e1391e32069ee823f3d23db72244d657233578cb7d29a33e6ec31df1fdd43b51742cc30efc54be83149177e7bcde4450dcd142eb2cb745f8865dfd99dc84ab92750f1cfb0f3944e4e4eaa41261a1e8c58d9b230add792dce20d2612823c0ff9f82e04b61e48dbb83f1a6dd5cc7f92bcd0a37ab3053803d1188029aa1fed9ba04f4c961588c9ad2ba7ef1cfbc50fa69b799898eb0dfe9668260ca5680f91a10d2bef8f108ab28fcab693ecdb942070d2b9b8bbb22609c8395c23d7482c31b69b0f555b7c079d3defaa5fb302ed92619c058adf334e845eb1c6edd903c0de2aedd3d9830943f8bcc5954b65df37c901a17ef13fa75b0f2c8c1d2e38681874aebfe90b463f2cc7831958fdc0de0446991eb3c3612cc00188dfc1078fe458d2e5b80efa7bfce800c6b4ca0e570fa5858859633551da28f36f1ff418a9b7ad18aa89b4612f9d676d5fd98bce6f144cd7458ca9f2bc732a36a4d186ea290a009a870da3c1f60617d56ea7554062367121f3e5e569503aa573b172c6278dde5aa4ccda79d9d8faf41c6c9040c1d1d3cb78b41ffa8a0180395439f0d1b72e42471a9100973ab3bc7aec559d94d2d6402374ba5a584de168395a156324e1e4149abd35c72ae0f79863cb59ee6ba22145e36e0d85d3caf8a427d38c96ce489cd0aea20d7960608c074ce3cd0494b6d6d5ec8895f0f03ce78982ad8fd6784bcf16825286c51325662f34726ba66d3a91eeb598124d6755da090ef863fa31ccd5b08909a3279a35cfdce24d2ba16f42ad280b029a0e27137a671c862b0e6f73ff4a1de320c4daffb5cd4ac3522ef1c10e8a918005535f355ce6366b43a757938594366831dbf7ee72f311be4953edd1ea1c598960745d3dbb7f1e2d882cc063bc0791d18c6376a8497f2f91389a13aa96dab78feca081d761479848a5b4cc2e3d015f343b9000583e95e785a45a06842d7c6c0fe9ac4d70f085503d7ac954516953c497635ac8b7698bb784f73fe6e7f9d0ab9473e828168df4ec142cc1fe18fa067525915adf0764e44292a0316ef3c0a443683c92c4661409589eabd7b4dbd43f54317ae0e3d1c69c35a7868991fa0bc2f83430d89821b91a08ddc2d314a717f5bc6f3d89daf163af73e10c61630139e3feda723feb2edffe6c7f364fba22e6aab75e267065b5e7575946c56265743816b2cf12a106ae21921e3e92bfb7ff80e105468f8409d6698e8660b5b05f3f4bb19a0bd4be3569d24f51795752be74c429aeca5be737de8c01", + "signing_randomness": "12d9e81275b7aaa3ac53c5bb1b67de272495ba5b24285814595bd050cc6bdbb4", + "sha3_256_hash_of_signature": "f982e8ac9ae9a80ecfdadb19272e3a3c97ff15018af0ce31baf43831df965dc5" + }, + { + "key_generation_seed": "cb0b305fb54e1cb23b63ec1f6f4689137e5048d095fb3eadc854c852ca86be93", + "sha3_256_hash_of_verification_key": "2bc31fe5b600a15c06f445318d77af2e48d6ea9ec6c255fffeba40b7b5f8c00d", + "sha3_256_hash_of_signing_key": "5e3f152ddb1b26c546a5bd821a66e8e29840f9f68c397ca01341adaa331a729e", + "message": "ae2638d944822298959f47b2173de7d1e58aaa622296ad4a4cb67ec7ead8220ac2f171605ba2d08af3d6ff5849566eaf96209e9e00cc28eb9a517cf5061545aad24cce143a2ee1ab7cfa259ad9c01860b33b0036f2cb3a5086861212f408c5f055d226ccc77cc884452b2670d89548ec1c6e98fb311df03979cabf725e78956af185447287bca2517f554e9f25e19d93790318efc5d2602fabf262e5c7fc307e5a991e0122e332a803ac4a91b318b30d79394248521190d2be326037a89fe918d139f763dc8daa2c3bbce53f04809f0d97303f2f1b88b572b3086acaf38eef36b4c0791b4918204b0e1e923bce9e3bb1e7baa07135b176e266af174d5df26c44842ceac4ae4c1cff05557da3db8651261be78d766699b1891cb825fa9a418c45bb9f7f2d347f3f92f9529ca6db94e2ffcc69337fb3690f556c5a44cbbd9d79f60aff063de68b14bd2f4b7e8cdf94f6c2f40219d27f71e8ab3d4d6872a5d4b82eaf8e3943a6d425ed04fbc5c7596ae929ad680b245e3d6a7c5ccd7fdfa1d14ef0f72b9baaef05b7b84adc02913ddbc76d5fe80de30527ffad1825ccba34f8587c5b0291471d6957ad99c5fbcf3669b4ae5930c8af68305c2d3e84e714cb9049a9560a3c94aeb95a252f69b68f755dc0e0aab52dd054b670a275bd2bad7ff8ec0cde6224e9a0eb537e95dab992c382d6b03fa045da402ce7c5b55138fb400d9e86afe30923afee82c4528d1b38ce16d33beb47a96c18428d919ba98c9782806d6f4a40b52f7f0989337c724be24e9a5430cfea470d02ea36ca479faead94a74049898d1f1be53d5ab8cc0cdd5438a7c55827131de264aecd18e5f5f2f9fd60e8d2d6f55beb27eb77aeeac2a15432a5f1467483be6073243d0165a6c242fe1bd7b7aa701a0827f286ecb51e4c2626dcbe95466bc94a7e2a09ab334fee3959ca31974b6286e2a2051653341623cf3aca65637df657280b6025db0c0377ec09e6e32010f0f59711a30496695d23728319dfd0ab5f3aa69025276e68808130659d912a53693584188e310b1cacc41af4b19fad8da95d4b35e2569053f553a9dfcbb8fdee1455dfa0e4f5e94324c86a24288ae27f3576ae15fbc8bed49bfd8521d77a61fb523badf0e3cee53799016c6ee4e1e5defc19c7717a5c41ed8fa6bf0e5811baea76676de03767a607735c2a48bede511012eaf1f79e4d2c3566042ff2c63bb82fbb399ce20e1f268d3844bb473ad7366ef86d064c5ba080fc0c01bdd2ad343c5367d80d2a058cf40725268cd34123c219d9109780335611b008ee3f8848ea9d174d7b96bd2fd9a04fa2b550dcf0b301d64c0764299d317dcd0ca05718a1ac008d86fea330095e81567e83bde31a0d635098d7b86176ce6cc4025e8628c73b394d9a45b09b64bfd3a424162b16e1adaa1ab60006847c6d5ca5733237a330147cfe6b9170d7b88834bb79f1fddefcc0ebb1d4fef326e28c41c919607bf12ad112807bf8582933ddb096f1f3e2bcd6bcbd844da317cea2a7688a5fbba14d84c537814ec2b171ade28acf83ea481631b968c26f8d2bf2c5af7d61a93378e1e23fc756e2f0ee79199475ab4ba1fbc55d9adc2b05888b2910049bca98defefe96cdcb67ca9d4aa5bbfc6ca0ecbb78bf29035d158de2a1708d98beb85c70ad1c64b39b387516073e2fe85bd9efa25cb048c224e0ef76547dca67fd66485a97eb5e56c06c78ffa08ec1c9c6f2380912a2585cbcba2cd702cd2b51022f63ec920412989bd743a8a8beb07241e3e8eb38ca14cd400c83dbfa6fc8e04f58529007a1477e9613291af877692e4ca9ae118a1902ae7b4ae7dc2e992a6495cd19df32ce64131a8d8c41969a8bae1d870dd5f1360ba9278d5b76e746faf99d526199e87a4b1d3a5c48a33989f103cfb2", + "signing_randomness": "b2f1c85588d0220312b9c2050408076301ef1442e150d199a6634e34d5bd2c42", + "sha3_256_hash_of_signature": "2c36e6292f8bce8c1d4ea6c1555fa941ea61ee49997b4bf4bfda8da045c8ee7d" + }, + { + "key_generation_seed": "f92ffa3a36f43f9177763ad320fd651d9357c6d99f09549fe6af12943b58be90", + "sha3_256_hash_of_verification_key": "d88a063be84705e8a9031df5741d866fb0547f80631492d52fe8259ae3fae571", + "sha3_256_hash_of_signing_key": "86311ebd6de825936767e9312cc1b39088b1d9e66a49c2f7d8355f7496f284e0", + "message": "9d84e1dd28c513987d5587a4427853762b7d7af668ff9ec2e90211d6cf5c0de6c7e54b298c1a6c67ea9a693cedc4fca1a6adc2c6dd0e5bbcee7266b9c6ac8fa8af5e50078a6151f938161f1feacde4d8079b5a9d563423258cf3ae9e47d8e75740314f2ffa63865a8b30743f773a53e1aedeac45caae01993b75c8116fb0b431631ac001aa8bd02e5b83de627af0ccb3a3d86f66a7e5fb658f9226df31095780a6e8262a247d70f4e7c971d108567ffbd7fed0e16b7ffddd93f5764c3e02a61998c32146564d46589538b2e071af86a26321a3523354f4f0c396b863fc8e9e2e3a173901d0d178a9d2828d0e0974b72cedfb17937d6054f185a81d4f853787e6c3681a74fe25faa6c256a9f9e9a9253f98b9ae4b8fa0068dc28bc7e8d5785cfad20f7ddd643dae6a2ddb02713c9cafc2eb2fd18efdeced05cc24913061bdc38e932db5e8181fc0d3de26a94e2138800b3c01e07e83b3b0be187edc75da576af1cc7b7122367effd6ebf05f4c2eeb0ab6e9f91201a4237910a87de9fef777981d48fba28ab8d64d76380911f2a6621335dfa96b331ae8b3242ea1f2a260260244196b0b9596c411218a17d0a58d3b5735b9ad7b6259655cf6e2d0fe5b37d0a0b02e67951f5d3fb277b6e1ec87528b08229ab0ebd895cba2d075a47cc8100e9dd17de7d951bf0a68d710aac21c8226d8ca95ac49fcbe9d493a8d3c7f93fa61685be57ff422fad036304f317a3dbcfee7a4610c8c1ddaa79e37c19d6414f47230e01ef1cd5c7c2ffc319a29ae6a9c95b06c603f2cfc1d1fc914b036cda6cf9a876946983b06123c2e5c7d09bc190647cdc0512f35db9e214c77d3d7d0234c3f2590941236a367700f9c04d3afb949dca2067571bf28e78ed35fc026bd801c4afee9bf31c97580953950d2e81ee6426e78d6f8134ed19707473f0874367c86c9be170be63405a9bf7c46a420724b6ccff9c21b015e21bb02c5a7aeabca873b46571530de56e47288c3424da398517abb6502a9a6a65d4983d97e479941c44cf0136d225991226f70837e2a7d1e9cb1226f40bf59d52c66549bf8e360096954f5875c466160a0c75a252e5fe6b8f1841fe210bf08520ce74d77b69692086ef50bb64732f19d1a49e5800f077700553290635d418168a6b9e3ae980112afb9d58a18b94f972845c309e86fec7e456191d8760a1c2106036e44c5c9a5f2cfbc67d741e8e937e99ed7820ab0787e39c385356ef0f05cd3e31c44115a8892224197b1d1f554d5098b72058fad49c665f716a266cb4db6204666e1dc07b6cfde0ea00345661e0f94a5025d2ec98483cf482058d2eddb018cec11d91eb46b63971ab29367db46137cd7690d5782e3a3ddc8cabd545fc1aad8a9a0a39542aec55cc3d58a5bb5e4a559db1fcd2932eff6e81c8b8e5ad5b4e0424a444bc55d96df63c8971a5890310fe19dff8acba72d96fd3f32d67d41a2f3d0b343489c7fdee7556012c2d88e2ba9d512b71e7d04f92e6be3a9386565271d755bed752c853e4539f95c3287a275004f76b9a93837c6efc6760be4a39b8aa92c7605ac369472fb29e11acad98fc91b1b9bb3505638d4d46a3ae3c10c8dc115c35725f06649bfb00ba1ef214b9f2fe98be2da99ab23e7b9f014f5c5d0248a9e0e088ac175c8048c6beb5108da59dc234e9edfbe603ba912bea22505c2a9eaae766ff55aac8392aea5c722df25bc6c9fcf9b0275df71206a4e5290fc5e71d79928e357400dcb04efd7cc9bd0b86e04bfed9bdbce5787e40fcd6041adda615b5ecf03c30ab9b2809e3514e9ac87226c55f259c5f157945b0073431715e1740dcb319edddd1b5f2763f0439cc0d6ed5867d9d98c227ca3008f30d1b2aea40dc73ff8289e4a21586eff519520f888e7e2f6d29a269c12607d13d398f437cd7f0a07c94ee1e1e3d8518d0c97be1e250d79c5ae1709ad8a638f55", + "signing_randomness": "048add9ddb845f46a4c1e3338dc78aac49fb30623f649fe4fabe6b9fe23f5b2c", + "sha3_256_hash_of_signature": "0e92d2dc8d0cf1be1d91907b71cc46e40f123e7d2accba9817169ef0b93a9841" + }, + { + "key_generation_seed": "5d3cce926a795abc5f6632cabff8bf66275dcc7e4a4ab3b8399d23e62a28bd16", + "sha3_256_hash_of_verification_key": "21a9129b09c980e2353e83579b038c40b7be141f4a894df6879129280df098d6", + "sha3_256_hash_of_signing_key": "a542cc04e067a41bfc55bd45763edd6cd49cb5469daa693d15d10343c6ea6b32", + "message": "af2860129c08a1a9c7a7bb3120b3e40afa1a4a09050c8483e7511fabf3285544d4ce3f41401dab8c17da547f6777a72519f6eeaac83016fa0e0fb0b33329dd02ab8eb1f291758074ebb5b7c4c102b75ba422821e6755b37b914d689d84808a89cf88f69a446f489a260ba03ca52a4aa14e8bcf4bfe5134dd2918a88d67329b9badc6ada4a3071fd21cfc45235fa0a1b82d91c5877f10ae087464251c8899732aa7fc8f6c0a5beaf4fa41e64ca97932925a06e218272500249577705804c6dd9f0f61dee6aae096be0ae5e67923137933fe4d61e9a88dfd5b3bd75aeeaf5018a5153985e2837ad1aad5eed91620d935eb9982dd2364b5413f490bf251fc783503fa146300e6adae0682e0597c3839c645dbe855919bb1cb80c3dc6e233909017bb31f5adaee05ce442eef594fc15fec3a2b4b81ecaad1340b0677f27009290ab3ab8788556389047f63c2ce9390658e151ca85baae45ed2fe12b6667967f6b772ee683ac2e7347c7b0efa332b3354b5043cb86200f8e4249f68030844d00a86faa7b79a4129ad676d1e9d58828a1af4c6bd68c29cc23002e0a0313500ba717b8756d4a18e41e381df8d7a999a153876db876ca4a508486a4f331cac9cb3e7c416c6329713cab76e1c8b63a8cad46f8eb1e65116f89a3b4eb8faa14a73097ca71aea3220be7fb7fe64919893930445d962c309e23332e4b3ed8ca768ef0ed46eaab199827ad628a1bc20ccd9f61bef67f7fcb017300ebc7493a7ccdaedbfca5f91e80b80decbfd9ead9bf22fe16b563512c7383d34801c504202d7a0e19821ec8495016362edac165904d2bbac484de1d4112c3a3e6ea56a78785b7caf2a44b5bc8becbc50bf4b521c1d086086feb009c06acb8fa0f53e7654fb02ad7898e35e5f3a7dcfc50124ba1f30178c707f4d36e4e7758c4cf82747753cc30a836311794a6a9017f53abd17a1c9647ab38ba56aac83c1812dee8a5a75c5cc958780a3e9c3c1f39729bd365948f7fcd8104cf09660060fbad2be9b8d8e5bdd22286eb0bfd4010681ae7928d0fc008e21c8f877d97b5b9c7a06c02530fbc6a9d6fcedfedf68a9682177757cdddffa6cb9086b8330e61851e2761d84da37635ea8441e3b23fd165ccea562b0a3616b30ee5fae00f76d6801b22f2215d80829e01db2c0743e3074cf26c96b0eddf97d79fb9c7ffe9b5cdb891f9e61fefe7e1cbd28fe25b7858921c8c99c45a84b50a8233037dacc20beeebb9b22089ddaf2ebf0698498da694f75ed2463d09ba2c757a986b8ca556cdf46cbcdf288c078041d497242f66411f47f35a21918855f105f24686076fa21bc1283f17245a7122a848b4bc10d996b2c5161fce0336b2ec747a4a07fa9851ac5423d1efc4b524e795b2e4bffd1c5cd21f5fec954824dcc53bc3883a7f571a9323dfdd2682c4a4c54e8862f347c9a8897779170b257ad26d90121dde722a3f214a44cf6c5a5ddb2452a2471ebe7fc8d0ef7f1edc7920cb42a71e4db49a0168d51843f47d17bade50dcb340e5f7b7e5b6a6c3afe0fb26b5ea172a4011eee838e5634e521483c6edbe9994b0658406ed8f4998c7b4e869845cd16cc4368da3bc1b025a6ffafbf540133c372d452dd831dcad39d61cced0a0ad193fa9886eac749001e3bead5a7962275fc62298a1bd054f4bd97acab2bbfdc355c73509d98b6de5b4cd774bdcaf1398532bb3db56524cc047abde6880c3b282fce0fb2ad7e4c5f7bc138b48d194e8c8036df4b9f3949e912afe5d2734662f27583193d0fba2b73c1a0d012db853bbbe4383f6c391f3220e1b5761c337a054fc9fdf09c01864b87324a90c776efbf5d34a68dee38ebaaccbb61b4c79a58cc848184f605d43cf9d40be90c1fbcf6735270132b59a636b16ed28111246270af32ea2cb7a42a084005aebb6161002e65b37217361bc269f5ed12f7d50613c82934a6d1d98d1308ac82827b7504f3fd351e0aca1c62843c9219023fd092692ba4b83be198ea", + "signing_randomness": "7d9a08d9689af9f8f89166e66d981740376a98d7d38c2ab0997050201319cd4d", + "sha3_256_hash_of_signature": "165b64d8e344bdf333584b14d20b59b39720540604ca1273339c320e6007ab60" + }, + { + "key_generation_seed": "ba2386ba92aa89049c64ecfe60fddbe136815d3874527414b63ed32215f2e06f", + "sha3_256_hash_of_verification_key": "17c2a3bc7d0d621926de8f811696e11865d2cfaaca1df6b00ed72c585ca3d557", + "sha3_256_hash_of_signing_key": "de225aac2513942ec4c81d74ca2db3e30dd914e51c649ebbb965b5c32431dfac", + "message": "eca4505d43235f274d902464f4e763312bd11060f908621a063409eb42faa6bb5e20facd87b8ff41767c20f69b1f7e05d5f3a957f48dea57dcc91824fa48da6ddbde7e3327a0a8d46a47606eda01e67cea1f29bdc5fba446de60541dbed6f73d1fc5f49bd77d45285d3d8ca93f6df25aeef9324bedb40e800acb49794ab05e6d0aeb11a5994fba36dabb9559cd93cf522174061c116cf31874a18c46689fb8c075079dfaf73ea0ea7faadd47ad8ef68c06af9738b41be771020fedb79ca3d0165427b58e547105fcf82a12b67579d1d3aab29968817068732cdbc5a2e9e8d55d17468d03f38d564f5ac6efe1538e4a680e9e15e35ab54d07b6b58ec9ea7815ccf29f4f880cbf1946f39556bdc2bbc78a5134fa7a086ddc146ad9d503a4ca837e0823bf0728453f6b053788c69eff8d11acdf5f07282a75cbd17f2aed58e39d862ff056df17178625234ca7e03d22aaafc4c07e3fb08f4297b511b10579934d2761fbb600c9454ac05fff80cfb93de3b9e0ddd0ab1e494de477da2b5635e48d5bed5ce359e66a3ac845826be2b4bbfa6d825373bb2a4e93aa417648d1cea755aa4978784d6d9489f6738b4da03faedc659408d9395c934af774749a498b1406522351f86838865f53cb0157247484fd37ea59ba72ff3226aff1eee353abd34ddd63fcc89387b947027e04a6f4ecca1ee5f6bd1ca758aa4f796fe839338164b58d8e5d71e6d5cdeef6b279ef15a7bad873b12f7c5b3e2817c37bf00802d2534d425d52d0bd5935bf8658e5bd39b5268cc45d0f27cee5a57300f497e77af5268970782030e6928281379cb14bb56d2acd963d189c078c7a60e98a782f9483ece7b4871a061277186a01e878087381704bd72c63c32cbf2470a561c22a5dd3a1988b7ed0d274182e1b075af277920b362d612dc7ed82057ebfe51a3ca5a9a9a45de015c460be6a48cf67c820813048a1cea0fc3d7307f802b4fb7e523e7c8555fa56dcf66237f176d3d973c47f55af93fc4bc92b98b7de89829b1471dff53b649cb03b719db58daf824daa2de570df6314dcaf5b705557f9d783559277a754f3cd5b783d5a577ebe4a065d320284b01f71540f1986bcd443cf4fd480dbe06ef7710387cb5185deacb5c2a612bca275950b8988f247c4b773d8983d87f47d60f5bf80e6e7baedeb14b5ffbc46893a81c63f99f511d3e24fa8f7b1ba66a7db0c1d9acc6b5010ad725bdc2282d8a24018c975c8b12ed3326f48194d4ff93ebf051204cd224ea39f27d63fe07cfd0162358b412dbfd4715ad049ee5a31638d3111af2db7952f3a973646612712a607ea35826249d14cbde4380d8bc986067b1cc27503449fb128767986a406585c3d40daca75c27bd36117d2487bae82cf639ed1fa016add279d109b8cdae59eb31e1f006cb7af000a267e8582e55375cf6f06d1a47be9bfa21c8428045b9df96808ad74d054820a4d0873257eb318a3dc9b6d9585d973e26d435345b4d699a952c3092eeddd975fb59474212080d03ec489c695f19cba4d1cab1ae8d2e2c730b06e657d33722d24222ff7b613b6e8608e8a6003e11c80239ff431b5d8fa52b84b867a581798833590524c7b84eaf6cda9ca94c5ab8ef55a1262eec5c37467807c89ff7d075606a3902e7247e9c6646839c18493584d33db65d6dfc0f23e68c9d13fd57faf4836c28926693dc3ee372de27a9d3e4ab4229425ef48cc410f1792a51c9f6fa5316a1d9a7c99979884ef350b4882f6045921ca88d4e44b435c69c1aac11660971c2a3f6480c79e6e146c0b5cd2371bf5e7486ad7d0be88d62a2ae8f0d73c17cbac86ff6bda55a880b182a5237498e9cb343a9cd82d7784b72473d222e688d13cb81b2908bba854b9624a11dbe8cee9c3825c1bfba476b4d23d0b0c325f1c498a65a3589ea8e8df8dd9030b279ede30443cf80367ceea4a122dc8329e5ad42491cf57ef47ae2b15f9c54120966b95acd727a4a2b686b00626bc808f43d82d20deebca79b074a7bff38d2531ab2f726ac7087236eb3fb4bec8a2d4207dc84c", + "signing_randomness": "d4eb2f8d476734c94dc74d41d4bef21b3b2d9830db37d326b43de0843e1bd51e", + "sha3_256_hash_of_signature": "5897ffd0bc1e98934e3aa016c880a28499efef12ff3e0be34a7567ba7fcae003" + }, + { + "key_generation_seed": "b4e1af25e8dc6934ba391a89984a358702bdd36838babebd982638703f20eef8", + "sha3_256_hash_of_verification_key": "e69a39a21e4fd3c3a7afa7dc2a38e8824045b268aca4414365228ad631a025b2", + "sha3_256_hash_of_signing_key": "6b175e89bf8e1522a3ee1a3c3f3354b54e4ea797db7880753dd86a743c22720f", + "message": "96e2865a0e602ea4e3c5657a7f761a6f771007989ff885261f5638c14c1bf80aade34cb956d2b5fa1ce38fde831423201d3692e8e6f40e68a68c085dbe3c4cd8e35394f74072f44de98a74e42c9176a86ac06bed8c0ca937db4c3bf92371106b7a68ea8fde1d1e082ccf522a397401ad0f8da6c82bf76eab8afe101c7ff023a0fcf015b40ada0073363e7cb25260c18662d651222a4ccf1b290ee6f7b111b9a963211d67d7674b499449f760352feeb9fb7265a5f2f7f20c0174802c7f48226d92620d3e009e85b104230c21ba2fb0012dac4bdf9fd184e09cb3e593eb1f3eeb418a8bf3173e6cb91fd8080c7e80dbe6730833a4a9f22c52716731c7cea4f70cde0f81d2d9aafb6b60820598a7f6aa1b963b7686528e6e7885ae085c3d26c4acbf9fc15080d972ca841175b343e59fed79ae3cb4dbb4f0d7d463bd3e0c4b2090139145b8d7db5db10abfa51dc909c5cf7809030d72a5090cdc765eecade2b365f719127548ca601ae0d21e402e18050acaed30ee13cddadacc9373a87a218787b585319a7e66fbb13851f7ad0d2bbc1efe6efe4f7ed248d844f58b6a5a21fa9295e0044982af6286de296550f72b5e416373f1dac006687ded1e7d40961e5177c207579f25e77be808a6ba33dce8a2a6f88e97ae98ecfbee5296d4a170e3574d9ba592a384cb0545bcfc32b3831c0b736ab77440722299f192dcad519523995f71f2983ba87aad2261e6e01c19dccae00f8d6914501d1ac3d4aff0c12fa125ecdca34dcdd8407f0045f8e8be0763e19eb007ed4dae36e30afb07f8daa7431b72f4a0a8017b3fde27123ac3e8ee575f8be310f68f81b696db1fe63ccb8d32b899b209b2205956d209bd6e48166bbb4372a607e83c47698db5ac8f9b40d05f38efc4a4a1309d999d5ce1e1a5828d56eda4666995897c8e6362d0b5054f04bccf79d03852d1003c80ccd55e9f4578d8bb2c8e220a4d7a4e2190024c85c718654ccf174ac96c1bc50ea49f961ee7697c88e6bb718679f1d1f1118376b31a4b8c0471f6d7aefc5ab426515d1b2cf0eae66246b3c4132a63c63d7e33eb9df8d8807215d58f46ee832ad3ec893d74e00c73510b9625f62d4eb5b500eecdbc7d088d3d318077a4a0f7d64adb13220232c08da75d23ca7b20cb109c972b7c159863991c32508339558b9383ddfe7e7dda740e5bed0ebd14ed300c634db01f359f81a7133669183eb187c17a2c8ab855bfce73e34a1f59adb0ec39ec0c7573ad3620a819333ee79d5e09cb8449f91923ef4c5e21549eb7f56075c014e1c3ad2805e682f07ba8aa265745cb600a460069678745fb9638f6709d62d2dad8defdd5a4d0c2ae7401292bd1da5f40d4cf5d59a403932ffb677237ad74691cae29fa31b955172efc5e83c225f2dc0430ab0c909a97bfb468ae182ecf91e9026de819f3440fbe69b9de26f812ff3f3ce8037f124ab368b1153c1cc127d140f754c525d4799e1a19d93b90460e6518f0b6936dc6310b7e9e6534b595e00225978214ee5aeb12a6f45b5c73fe86771818843ff7a6b88379c37165d9dad48affd6fbabd11b1fb90aa5a78918b317c5f9b2ced6b9647f130da9f91e1b1ceb84f6e1618248f06d654e159f71033072f1517064bd96a5c138402771abe7f39f53a798c2423b748eb7f310485d6376722e204fa33b9740e7fa68364289a677c5c78a19a7707d2549bf9329334478c64351fea1634388acd4be57e4abe9374a0e999b770cd81b1bf4a8ff300c297b116ceda1a4a1c1bd5a2275581a0589a46142139fc596a1406d16293076527cdf9aea2d0919f9678423b7d95b153dd1d9d62b72a12f6491a36604d19e7bb83c476d232769425557d3480623d40b7ac27c0f67d4ed5ca4d487be915a68352dcb03a3929a4bb795248ebe2fbe0612833d9305a0a31d195718bac193fc59b880042a7f61358104a919c7e7c210f02a856b8b1057dd8527fd4ae1ea81f9e1bf7c614ed8a312c95154873f86632cbd60c65176f13cac695bb4c23675331058397d6e96e4f9deeb859e3937553d94bede3c2b9a5ebf00964a49ab294bccee09e5a97381d2375941aa775a47f726e9", + "signing_randomness": "aadb9c7f9de8a127c541254c2b2b0108175d9b51c50b0547a980f235906bd895", + "sha3_256_hash_of_signature": "ee08c6fddb2c76326b9fc1fdcb523034c193ca1c0ef4bbc4caf2c309bcc48b03" + }, + { + "key_generation_seed": "a62875a3a6d305e120dc7975962552126cd844554857c2943872a4e524a6eeb5", + "sha3_256_hash_of_verification_key": "5a4815df3c49b45ccb607532b7d2891540f4a01e90d9378ac5c9ab9f8522bd90", + "sha3_256_hash_of_signing_key": "7664c97f41c410f865b9f02eb30d90124c4ad54b1a2b8e0ea591c265a0ad81f1", + "message": "047e2d484d798b3829ca6037d6c1588a2349de09c5ddfbec987652cfda01454ed791dbffa3d9da13a35230adbe1b39b042e3c70589658a03f75447c1cf3970dc10fe5a4a9e980f2a33b642b42e5e66e9ac4e7a56888fcd72913a79489b5b163bd37b8c3c8d242ffeb37d0c1ece21034be9e3685798c2ebc6b809defc02c6f0c2a3ad70ec0bad12d57add63ec3584ca98e680267fa514b34de4147c9d901b59914d49ce9e0f885855ed0ce7973f3307b675408f90b51c6a4d38a414d970eec989cc7900d7723e19acc4ef743f6d39eb1b563b8c13d42c0056b6c49732854925b606467f7bc662d17b924fc65e9c3cdc2ae73ff73040011a152b05ed7f96b2ff4cc39a22484af72812ef02b08ef4dcb64c8936e74549afdd5d876027fe2b431e61e52e8793888473f4c1e5c1bed2c4aef8e5e300a735b302474fc6f54869984f1a62dae29c7c9a0ccdecaa55fe137ba14b5c5c121e0c5eb33b035e01f3415529e0826b27498d7a71b0c086bacd140c02a5948aa54799d0dd0ffd384c7e68578247fa28d205b18adac94f7d3c8acb7daf71aee347b577d97ee8e7e865cf4fc1c16640ad1e9d0192aa13ae81a71118408e145b6121abb75b4bffd1d403057d4ad5cc730452475a7f067690bb81e81e17ba8dbc31059969b20d387ba59ca8ce499e59a65c8583f29cd539f4f75ddcc68c7bbbc43c849802d8347143e2fe78c1ab6d7ab6ba9917301c88386b294aac995c24ad680a8c3bdd7aebef21e84f5a1909a2d83a8dfe46a75f4b2b47614cd39bf3ca3460de9bb5c37eb7349a17ab32214d031ce927806fa394470f407673b0cdc3d9a7e3749f09ca895d464a4269682ce6ddcb8fa0ec2f05372c73dc3d06fa6f58090efbbc6d619a7a565d4efe441ad7e018a7f5e1384b88eb4506fc54e0ab0a8b9ee3641760ffc08f6bda78c12396473d1243baaf6ae10316213115441c0b65c7e475b4e1578d066a47d9c6e92fa32d0f2c365fd15f5a2e88a81691f039dc642ecedb6652d08acbe64625b46083ce758fa96c142eb34477e065aea04a45ff4fcc3e3d146acd7041f5f7e4c6b26c8205be7b66db46da55556ce02b48af55a4710bb28b8ce102cb15c1a4af59d9a17a2dda6e2d1e96987f6aa9f4216d8d5e5cbff7e2cb775e83a776063a4aaf937bf0ec84149ec1a7ee21f735d21625e85831b80dc11ebf04f30b13e3a7e4d4784c5f8c61c679e0b6863958f42ed31deaffb4c272a3731c1407445ca7673d225eb6509469dc6c1f0af43eb00f18b3a210aa57d51169f2a9fc251bb338ed4e9ddb19282dce871211d26482e13a8d533dee00d36ff5cea98dea72d9f0b32dc398a3d5537a3373058faaa3926c127a1ec739faf3d57cc1a05d578074a3a72c3f2b1692c2ba1f1ffed943e7bfcbf1e664c4f52f7bf8d86174ca8910c290c06804a7748db21008ac43e653d7fd7e0c982eda9356f68ddec26473956dff281f7b767010c57f4ad09a05063a6b3ce078dd32f3de1f40526c06a2d60e36e2c70502d5bebfd2f3bfcacf8720cde1657b9892406baa3df01e59313eb655b6a545331eba01bcdb9c99e4ad7fef7438ae8715fbe589a2f99cb9ca34b9610b3ce5be38fcf979240698174348417420aab069b8ad5f646f82958a136dc9f2f81e601056bb4ab5e10f4ebc4a00e18924c51d0fd104078471c6805c49d92c78c832ec3f10d8966e19add3d3b4516e12daf4f63fe6bbd228062db743d1f867800854f7bb7ffc2caa0d01a0bb683e368673a8e664bbaa17a8c0c04bcff05246f9c4f3020510a992ef26fd0933bbfde9d042862dffd33a6465f590a2287d8154777a89724fc3df9f2f1b1ed8765e7c7b761ca4781006822065703ade07a6e874e70928e1aba29ee490690d24f6e73d96b85fb53abfd1c1fde439279e08fa232043b2344b267cfe5901c60e7ca14b0c85edcfa2ab90f341821d2b4e25fe23129f2432db932f23b5957706a433b308fb918d1c8d81eeb399babe95e7229ad41f30460cf28671a4508b0bd1c61f48cdc23587bb9bdc6f565e76c86547cb71396661bec8c7fc2223751f765c91c45c674c36b49aedef3df2537f888904b507edcd89155d40cb81dda74376bc9cdcaff8a368f1086c99ede25526bc53f95f4017", + "signing_randomness": "84603efb642ef6f9acf327a4ce66eaecfe39dbfc124e3f73496c21f57996ebb7", + "sha3_256_hash_of_signature": "e9e9592041e57b1e6bdec6a8b55c31b0b77c79818f3523327751c86919c7a141" + }, + { + "key_generation_seed": "76ae71ded1f9e73af77a2feae4eef80f87414dfb7580fb4ae0325bff20d74a5d", + "sha3_256_hash_of_verification_key": "bbaba5b104df1e29135802cedcf4c7ae21de038e2facfb4273d12cbc5a7cf5e2", + "sha3_256_hash_of_signing_key": "13dc73a968379ce5cb4f0870e629cee05476ea0efd31d64a4be5a47d802d4ac8", + "message": "6a58aa820275a2f43d0f05dd0ee484af42b665ffb8f21db322abd256a5c753bc8ff6a2c71467922e09726655f1a7218e736752065c871221c0b9dee6a9d56b78a1c3b7357774396f6980226dca1f91ba828e06bbf324d5cce8d584d9d298261c7149899fc9f74d501e920f22aa34706a79213e35914dbf57b9642a42ef0d8226e31adf89d18c5f3163adecc79172c95650d764e3729edaa08c207d930c26df8ee1291c1cf889283b70af00c0489175f799273c837b281a5d1284e4447ed72598efae23b523274644da19bc0359ba59e5be9e5828ff587c335e136c1d789257864d2648ef9c03d1c4b9809dd07ceabd865254d3d8d597587d71e374fc2dde89c22c2330e8904f6b53f637348434a21aceab9892d5df8ff84cc58229782bed739bfb13448896f7b1064b499087f7547cfc0a49272c2a670a9431b1b5a07284b6749ef834510a3ec0c61a43d5d0eb48c8f487947c4fccefcc49deccb6111d617407c76a1b4a849c9a190310711b102f142f9e9cbb29f46447265e2c8ddb9174b780eb4a51003fb68483a265f2475d5bf6ece18af0cf31bf24cdd56583e777c4340086917b78068dfd380466f43d020e285ceed97a467db96bfaec22d80b4a6ec0dbb98cfc44436a41cadc85a90b214f00990d7b7010bbe4ac94809a0450c9abee5aa4037a44b0b4debd264120e762086b8d6f17afd37086c93a8a368be97e0f7546af16d731c21878063e38df3dcf3ade6dd2daa43c198f49b5d9ff5362333f29ec2f13cbb90dbe4e703edae9a4f7334a1c5ac60d5972c4af2ba61b63c93bf719854e615d16ba4f704c55260a8838679815fa59be08c4243cacc1a584cc1b4e777fcdc6e5a167c4cc9093749ace4836ae058be89cca3221a3f63f07089006e4c44e40653bf262945a640d8c2a24e7cc3529e4be76286c86ca2089cb8d4684508d1fab81eae7d8c731b65a22700bf9009a3190f5ed837ec22f9112383422027aed838f16a7740cf79ec101865d320e380d4aba745acc8eed376dc5b3aabe58debc35f8e983c92906aa2e3d8fbbe237325302e2a23cb1312ea7f532d64e79b9815996d28e0183eb728a37e19cb219987576c142f4b2f66ac6c7c77028ed59a8df27f78acd3910ddfceb88888b4a604e5d07ae1b53ea6df6ec2163ddc4bab422d2438ffa543b22441e50e4087fde4bee6d79d90a2f72548ddc41c5ae07dcc87666ea3c4b89a0b14afe03b585e7ca507e5f29997f2368b0c68c6ab6e344c082bd06ae922cd8089634918d9132df9cbd665a4149c59bf76b0e94f66481766fd79054aa80c02e0ae04a6e2be090582171b2a9af455cd9fc302ca9d1ec837ee26e0e4d0ac8f0692cb9abac979b58ca92e5194ebe46b520125bd0b3ed1ac2bd817d3510e33cfd17058f865dbc64e9b99352b6caf10f0a5a47449bf927a8eba06d34c80d77a0b00b88b25a4c8747aadbb11ba15adf9c959b05c4371cd8439fe5028e004a2e1d2f21190466fc7fd56e9ba0599a0eedd98246aeb4b85994787b7604cb52f5515b42c2fbd4b5e9e372a36cc4e66483dd884dfe42aaa5ee7fab200d8ec6e3556dde0f9e9c7346f9967f8f3cebe1e4d1cd8e6046e5e94bbc74ad3d51db0dc704f4a4025383f0391b9da37bca8ec59e807593a4f040fbb186607280967e5048cab92215dc783d9045f7a0922008628c771778661e97e9f88ea84bdaa8ba61126f71d193a2a564e3acde7adf2c0b3d5b022eb6e0c629782b0025c9079d4545d88aa2ba27d10c5dcbcfb7cf648939155066518878cc54a4f611aac21bd3a1ec628d3352f049915fca55234b9146ece5f78fbe7cffb35695363202edb9ec3501a93b4b6fc81b3dfdb5245feec8aa54195262c2467e15506b7d42a7ff61d75998722d0208bbfea05ce7d2e66900a9b34f44c2a21257c220c03f9d6d7f0312a36f5c12da20fb5290d5cfbc1dec7d05c44820885c479063ca88783c5aa128829417ec4dd41cf83a1d991df2efdfefe375e93f0371695e353ef737f4a75106211a5f70c82b4f360abcd078c9e829c82a6b7a36d22b8d1f6e3101ba009c759fc83999d52e29b387a8dc1658a43ec4c4d9330a4ed2138e035ebeae6343a76a82849e37141fce34e9a41eb5ef88bbb9257017ad8696c3847fd77ae103a082ed1a05de9420984c147aff927e1950244912079bdbe5cc07", + "signing_randomness": "9676de1c72b3c9aad4e68e465639a7e20862a243daff96802342dd24ceb53d23", + "sha3_256_hash_of_signature": "f428f2e3fd70d39011f3f8451058233bd604528f782cfcf6c5d14d769db912c3" + }, + { + "key_generation_seed": "a8f65be046001a6814f537915be3f03f3670e1169e4aaa6d7e726174acaec77c", + "sha3_256_hash_of_verification_key": "bcde9c05c5b9e449df233ad7af639849976e7f0fc58707d54b0175a77a758fe4", + "sha3_256_hash_of_signing_key": "5399fd108d7ae97ae2456bc455bb3a154958567978ca8555c1af1356fd92555f", + "message": "139ba17ed7b476dbb1cdfe3c42b3a57af5bbcb3be19ed04d6c3072fdfe917ecb9272d59ee89ef83522531d83aff8b9934a8423315c350d1481a4b02980dc29e1cb83b76623869649ac40ef297b153b679c327bb251c6e6bc169c48aba2a439f9ea24ef94656a415c3e86d7bcb43cb3717d54d773f1937dc8b0e02d4e6abbb1c83fe73f1b221c9a359e454c19de5e71ea4cb8c560eabf1da133ff20d81785d2ecd935b99f24840761446c324df81484c5c05045c0949df8d0f10f942e1b5b79074b358c25b6ec2b0b42df65d998b666cf1bc568e7d737f22ff541807be95ed85a9980e940e24d2c506bb0f9bee32effd85a2017de694f61bcc2b292595c97ff4c2145e48af8f0f3d71763b4db433ed7bdb8dbf8643475fb2b9155f0cc6a0048c5546900792bc01eba4b06c83a0c447ea0cf05410de55acb8e5521829c89bfbc084cd86e7ca3d701283b70f78e1ce9c3888ad2689e0ef5593d656285066f319e155f86c0a71256484f42a0c40e7cf13af0cf77c6d1cc7231a48538e9060a7863b774c9cc65e321e45aacc002c0170eddd18cc1424159d46bf99d08a28d2dea8917d28d91a1d6c409d945a5eea19413a1adca40de9458fa6bdf1e5308ef9e67e1e90e9d92bf19b5351fc49dff0a31e035038aaec651c0f20f276e4ef0ee35c14bb625eb34205516d95abeaa06a7a3bb3af2f12236406689bfab11e65fc63ebc5b944818dd1d53c0e7b88ce7aebae581d995ae7d8423778dfe20d6cea7ac0b1b4efe2b9d571de77bd8f71e89d9f6a2dc89103b73625887ab376bd12ce89a65e6280515a44a80d6c32799669260167da0a214ad0fb803930ab1952d93360b54433ce8220b29339dcf2702581e88952a5a1549dba11f4ccdb6fefd6d24522f3207796c8d5ba9d1582f888f2500964f2b975aed5d5af83409ff9720edcf5ce3fe9b6b586b08de21956e7970d8dc28f6208a80f5378ecbc506333a1d98c58eb0e2eb0cdece0f5d16a069ffd742d1e589f546c4f2ea3da0a56f984cfd93f5f2912fb1d068f2bd7c1b5e979abcc62e3a0164445398f5c0208e82b99aed1200d36289b1fdbbf03e43995341aed3ad712cc7c7530c751b40b765073ee4e4cdd411ae543ad5e2793f294320e9791ab35ae1697f23ebfa0280b8041859909b0089c101d7cc429408fabd2e073fca7f2c2886031e9f6a32f2b596a799967ba8a47e87dcc8854d45ddb6de39160600eb4235f4e3424d75ddc8ccf041aa05b25b5a3811540ea5b77cd8d7d611a63bef5c26d57475b28e961645aee0b9c8d47954faf634017787a21a671493e7c5f1a4c553e0a68ddd726db1ded4321dc735332fefdf2a84c22097ab3552f878e304598ec40eb349e1c1ae416f94112a2cf8e8702a4c3bde2f58245166550fc238e153d10f90652518b1d84ccd3ed836f150f1ff103976e743137da5a97a61276dfb0c11d071b240069582265a9cae4987b6c6b017dcd1594024d7b1336ff141e59936ec4ce5410e1b73ba6fb42d35f8999225cb1a135260967f4f6ef2172d53fa6ab6d1a2e3174b46c24bc103baf69c2128f093aeceebe8753eb352e2804ee64ae5140df1acdacd8f225b3c9a61264245b8e5cf759cddd75e25e2d790ffae8421515e0cd6f279d0080a3f80bb2e0729c0d2626b6ace31ce20bcda490c7660d04d1d82e6403000578926c52d8f9a4be7103d64e0f03e8f148bb2236781ec30f6d8bc827c107fcc40f26ddad485e6135bdc3bb331be139a07891717b692e23312d0e5b1c41f30c3b4b4700effb481a835ab54340269fff365ff87f58245621acfd83b7fcc6ff108132d8966f9836544354f7e216fbbb851f390dce8a72362f0454730b90d35ab3859763aee35668310fd501c7501f4599563006aaee9b636b676f3dbb6787317885b0f4a64171bf19cbf2ea7a625e1563032c196e1292d82c7484817dbf78d8e9e478fdc4c92cbef48d4cb4f0e6dcdca6682dc0a56c3e45ea0350d9ff88073748305fd7df3a3be8c055cb1c55167560d5c99345ba80c21ce791c4a511e384a02833b78e8aa02b1b877a9b8d806978519d716c611df54ae8ea2691540e87c6e79eb006569e02745021bdc7852e1fa4177e2c3ec89257618b38719cb07b0ba68f600236167f019694959c2ab6fb39d5890cb176f6acc3b9656e495c07027e3d4de781f48c1f1a8aa1b41449689e191e495ff3f263ddaaa8de0df6f1a4aa3ef1f5edfe437bb74ba", + "signing_randomness": "3400c994f2f97d69e54a48514146f45fc88597ba63fd836a6fd9a6f56da3f9de", + "sha3_256_hash_of_signature": "e480c31d9034701c4c8d65eadcbdf9194f12fd6c71476c5e5242a563aaa1b4da" + }, + { + "key_generation_seed": "802e08c14f6e3446bbf7f4666c8ddf7755dc718c3e02b7865ff33e9d8290abec", + "sha3_256_hash_of_verification_key": "9be24d827070decf1580f7abb3c6d40c656e19b918e5ef8d114f3c0d71a14866", + "sha3_256_hash_of_signing_key": "9be567ea881c9d606698d8d5bfcf41f850a434c9e746ef589ef04052362ef84e", + "message": "edd4da833528b0511534f77857ffd16eafb1a2ac87e6844612dbb104b9f32025b7f54e993d65ce85a061b6ac6d70a15bb42bbbbb6e2e21aea55bb8a556120eb15ef35fd9774fc7b5c2894b747d3e4965b77dd8d5b26f38d413662783dcd332765b4de534d08d6514ca9dc6ed7f2bdb4b5c437178710b04491708836cf2cca08f28582107d27ac305ede6030b1f8aadc4a1d29ad16cb4d739d8f813d47da715cad6b5cde24ea95dff4415b527dd900442d9ed1ca712c58b206d6e79f8aefb882013358bc578638225be79b58fb677277f072aebcf8ccd6ab61a9d98a3b260e60aa625d78058fae6028e4c5562a0f3473c3ad530bc4471228f27502a8f8fe2d1f72022103c3a2dea363e68248ed8693b3b066b495561cf4468e8ebf32b454e54df1766468ad3831d56ef7eb9c231e999c4cc3a6b0ebbf2c4f22820e256f67497427f53ad22d42c9293dc8682d0be3517b63c6e871910adbb3406b6b3b1cad980aae47bf9686e80b6e5df2daccceaf9506b4667271779d00b4c1065951e21f2acf6cf3cccb8a633d1114ce9d531d94420e4ae496086638f031c0baab5722a41a66788d3885efc7fe1c3db54bc69e35b7489a0237a37afe5194b5f424f792cc1d696098bcf327d87ebc50429a95ed82105c4328d0095a9775589fdb6c262fa51ffee4d99c6d1a68fa661d1b6a0a2e0693d73b39218a6895bd83fc1d54831b7df146fe7bd2a91b979018787b9904285a35922e22a7f1761bea541eaf21d74e3a2f3c6f2247b042379ca4c553fd9256dd0c63e4c9dea60912d02fbe4ce7762069a86cde02a4e1e311b2afde435da0816aca659bd8c0650c1f118c0ea3622d72a5e96132f8b0ff8458c757648bd46e58195faa0fc4ff8fa44238e35a25c9807b6229000ee560d8e085f27375c2f659baa5fde302b9529bf4699505c28de33ab5dc2b8c02967947cd24c6a599acb5c2d1e7d6bf3bccea0253fbe11d8043fed532aafc9ee1151243bb80b92be239bc4fd1d1caff502951205f2e6393b704e67141e1218963f664fe0759c15e6c0a1b40602a73990f040502867a9eddbd4db0e554aea4bb9597949d5fb32c2e3af92cf7816bedad5ede1b769c823cabdefca1d1b85213c79eb03e065146b58e3bfbe80b4d4683b65ad1e0611372729b99a0b93934d52dde40c19fed5a2b3dc3030e0b5f26b66474a5cca6d741ab294bbba6be516105c08bdbabc97bdec2141d035bf6c3a71553d6f6350229ca2626b8b0b56a24f2d6eece436ecb77a70d747b6a6f830578b4792de533879b174353424e7d0eadf6bd5a74b36a4e6ea7e39a4215559557bce7a00faaf0d1f81016f913a10f3c9f406c7cb53282ca8fd5fe4f5fabb96f891583e0507912ba02709764694296a5248c340a1b9ec3db0f926f438ca96fecd40c4ad8daed9b8a29691601835fe14283762236ef2135443307e5f0082d1c2180ae96ed0dd99a6e9172088e8b94aa2952ba5e128b202b2cbc1966e69b6e6384820d9ab624bc71788ea84b4adfcfaa2efa1ddaa8855d1db3f58eef2d54fe11a8a5d78ed46b58460e6f2fba6cb70640700a4520aa1a2a9b336aefb17cde8ac78d67f194662642a0107ce38b74d731380a72ad4a0a068f09e0878e521f15ce8134780c3fd0cab2dc2473448654f88bf1fe2020901b90c0ed670866b1bc337881292fba885fe2bfef6fe74765ca12372c8cbd698ac41a4c337374587db15affb511d8c224f1743498d7173897ff5b8d070b89592bebe053d5c10dce67ca8542781ae749f3a42fad7e4a2004a565f81d5faecf11115c270155fb8af6aeda138b9c71458d6d2ff63441130ee9107c39260469521e020d2b42cb5a51098027f23890dae8b28bf722af9aba6224e02feb47e40112ccb164e8cf174bc9ac4c11af9b482df9c9f7f5f1b826428c21be395eb1f07de511e8258c84f5f035f4787ace18c190808efe99fcb455a54d366dde2e230b575ed5a4a75d57c9a38dde3d91d0d1a1c4de7f277caf23e0c5dd8e3b693dbc66b6bf1679b0af74a2b9065b64cf0978115cc456af685b22d85135727a8aad96338611dc109b36c85a92e4a0180aadd1d25c5b3d4c681a44bacb953e50f994fcf5281366cdec0cc50976074d91840b5079180cf643184adcf9e4ccb44328e7bb9eb2bd06dbb7a757c35ec3dcf795a5e05ed250159ec453a1692426f624cc0737f691e475804f155e44293151e42d3c0f115ecee53c6eeef69788f7e8e5c422bb102237499f2638244c0c080b3639a49ffc1730ebb0cfd8a46", + "signing_randomness": "64d6c65c750512a619a02bf3e98cba9073ee368195f22185a236fb9e3f713131", + "sha3_256_hash_of_signature": "a85d177e379a5ae401d71f87bf71aa292885458abfebfb19b001407c7a6acdf0" + }, + { + "key_generation_seed": "23d7a85a824df3d904a511281a973c979f67f5bfaf3ab0546e85d0597f91120f", + "sha3_256_hash_of_verification_key": "9a26ab8e0d673fc14470a393d26ddfc30a3aae5822ff890078c15f645f22e0cf", + "sha3_256_hash_of_signing_key": "b89bc9320ad1fff262956dc11e3f05eb5ae0db7c45a49421a9048a2328e3f7c8", + "message": "d868ec985f946f3c31b6cfe4811ba530eacd0ed061ec383c203b2481ac697b8b88bc0f72b635027e443ab1f54478440de16e596d30a0f1252e0af54c0f382bbf5655bea8c6b9a2f6382d003cc7e4d4f223f8e35ec87cc543ead52e0e1ed956cfb32e8075715c07ca4817c4b8dace68c8b0da459271746be41d6102b3fa5e49aee8d443e78ad3246d0b9bccf6ab7cb7cf72b8a847ca16b435f0618594400037179441f3bf524231f747d920e86506e84c61d4d038d42e82d52d97abff896c1db1c646807156324f7b68db620ee435c7b8c9ac8b193b7c892565c3631e297495bd3b59293f9a9cea5e29e23a242b81dd05c8dc9dd669424573298c85870b109c7b593bf864b56895d81386466ca5cb6071005781fb214f1eae9672d0d16351a627a3faac49be4e13d552340328323cdcb4703bbe07c2a39d75d7737d5c1bd04355b8694432dfb7cb4f1901550c7d6f41080c0f6a2cc49d63a69243d137a78260c06e7a53aaf4f4b086e0220ebc5361a6a78c9b2ec09c2ea4ec45a41065b4b2daa866d9babd71c8e6cb378595f068edb258b2ad1f420b304e5924ebe273ad6d00684f75b6a31dc5290a37d0f9a848b1fc4a67dd9a4fb1f9b4c6cd45e87fab4a09129c9ab95c44703b75b54c9ef9e825928aca56527d79b338c5ac639d0265010f3c085d2b09aef0e4f55d080fb5ff79f13e8e4e8db020f4c095140d46a93f2e4811bfbc1393ec24f6b7ef31f13623df0360b1e335fc42098ca1efcd0306c5fecce942f6e299ac9ed81054fe452d3f63991da42d5680eef749c02fcba78db5f4f7c734c6b4d99af79711a0bab723c24364ac85700242878cca93465f286d5f7adad7f68f1d38cd6c6e0575a36f1e5521e420d348d947e745c2355fb5fb0f12dc6fb5e9435cf8e552c174a617151af8d5e7d469ad5cd741e16eb88ea6d7c5806b08571697d22a525c2e30dff608c921b955d2a990d9466829385de0a81875be564942ae740d15ac0af46a876426ebbe481738be19be06f174d975ae8dfb52a94af9a77e56267c0bb62169165ace155041406caf507146a02fb760629cc4c0e7d29108cb7c779455a3ef359bb6198ac75e16148998c16c9410dff2dae5f3c79da61d371992d4a151ba91dae8814c81eea4f78d23871326bafaa349c8eb57231b590f1ac13f599df5b39df36455f05e53cdc4d025410e8f8f8bb74854fefe0c4f790f58434309d36c1e7f3935d4f896368c91af95ec2df292ae3166b83976abd95089b05b461d4e9171cbb4747f3cd9bab04e5a3b98095754021229b4b820ebde63e463f2ee479fbfd83cacc61878773b129cd4b3e9afbaedb27c7fedec2f2d405b99933fe2c203d9949c567a7752aef8a7788d2375900e70315823daccd4f2a674196835c35ef813826b310346abb16b0145cd70fd0a04611ed5ad0b8ddfca6eba6b93445038c3dd23d3d15e8899f9c889af417e5662d538e466447e514a8897c21fe0be2ef18948b66eb04051c0bc961fa485422a66d649dfa86d4b3dd504a89919a9928ef96fd467713dccc1f19ee69ce3935f0416d9c5752b7dcf9272d2db86c3eb6f4897d94ddbef7c483fcc66232e535a8b0a5aa4bd443493fe539a32d433d9e89f7758db5b0606a96455b39f92aa788fbbe43cec8f1d36fea3adfd0353ea5532b49a7286381d985e018e6534005f605bf67ab4aaafdcc499ac0882fcd9d90bd88053cfdadaf466e536f2ffa7f18b3dc254e42fffc777e0339181473e2b7fc844b687eccc0eb543a54211084b1ec06b0d9eb0a0c96b88d6585f414873c13ef7002af2d47d5859a23d12a7d401ffd4bcf642db96c70fdad0cb03a6098437795bc9c7c6c804a26225eaa53f52747f01db4e62471a21dbc1ded9c4de2508812ab11f61f6364fcfeed445ffba549e45e641a80fb4b58ee20677c7d6cf0526dbf4e26d9e5afac5429b4474dffe709d09d766542d65e668d59c836bdfd0f78b846bc412f29da00291871d94bb5e6557d833c8db3d9beb37888c3a70684adc6b063fec3d847c42e0ce20e05482db165ffac5d1f2c661b9db6d19fb3e8909587351b25f2c225cb26bb137bc52d04ad8157f7d634f29a3623b4eb53b4ef9a78945280bca8c5e1882fae373eac69ea366e2f13a9fea75a6b7eb5cd4d9eb14f68a231bac780f84200146ce7795282952382e2393f0c2a99de830d3aa517dac4ac97f2aad3f7f8e3b49b22b078e3708c9cdd1b2a2a129656066c0030d747edd646384611d4eccc5b0b9df4852af7bfa94f6dd7584f6285ca2ea7ed3f8decb534e6d31d7165c609fd9ad235f5af8e4e8e58fd3d248d822c202", + "signing_randomness": "30747c584e1b97911f9c202a319429d5f6e417b80be60ac63c4592d8ad891316", + "sha3_256_hash_of_signature": "bad5e3384909302e17b042eab64fe555f78f03fecf89cc6b98668202ae661abc" + }, + { + "key_generation_seed": "771cbb7c9fbd9fc5db93e3e4de6c034e58be9bade93748c42297142124696234", + "sha3_256_hash_of_verification_key": "e8d5010c507e69d6d2672da0d3546fe608f02acd0df10aedc9d343fb265237a2", + "sha3_256_hash_of_signing_key": "b567b597ad159577a9bd75a71f5631804f22164ef19691bdeae8acfbe7c107b5", + "message": "4beaf8cc3a7c393932cd37a2cd8ed790f05e4038adf1287e2acdcc0bed9bdbf92ce44aae95caf4eb142b858e1421610eafc47de566182835bdacd4c836f19bd686d53c3834efd928487a2ab3402c2e3ab3af97aa802b05223ca6927722c3bd1fe3f8c20f93c3951f907314896cd21cb99306fd7e5b6176945c2898b10c1df62fbb2680752cabc8980b5a0430be39d34bb7de9544bcccbfabab709c11bfff5c958c8763d8d5830235b49ead26c834e63c3f3f2d6ba944fd2688f6350ec99daf4cccc42c6be1cb19dd46514d71cb6e887dba80edb580b27f1142a20ea0d497e0336d55f1ffd4bb3d4b3521f0a01c7bb09258971d1ed4a98ec052b24776623d7b9a83c818795e3989eaeba8c9142a97afce855cc6ac0aba15f0546684ab5c2f48b23bb72a88b6af2ba9c73881103cb6fa99e3b03119eab03bc3b9bc365efcd7b9f49a8bab6a34a00aa8f2c88d7bebba808bd97111ebb192d82ad244e18bca732fe6f72fde5bd533e4bccd3f50332dad3a4169ea85c324d165413f10888ac3b21b91de09fcbb9b636ed00faaa669abf6429b78c3c04f239722f31fb0b1a20cb1a6b553908070ac13521df66772a6036e6695cf66b9a90e2111e499bcbf5dcd19744f43deb943445248a5e84f168e7bfea2dc4e1d0a87fb4140eb7c72d2dfcc27923206054cec870888a79938dacbaacf1f122b22ab5c9701d777bcf9809cebc9b7aac52468134fc4a92c2baa9b8c0f6249130a50337f460a42cb5364a5e7408caef8d12ba6934ab645de9832818f9db71f5eb0b158de6a76619e75245b56020e1664d8faf1c1782de4a688d4055e07d842410600e9454e28676d44357853ffa7740200c91eafa16bca21d0006f47fe8159a733e0e91549df434ef316e1df9bb97da6a2c2e2f20a65b3c00041a903270cbb55ae2432aee25c71ce73bc2322ccb8e5bd0e24820616a890b0851d825d79411c14948dcdf48776d72565422056fe75765e50736c82f71270bbcf229a7b7a45dc88aadf4f84238c896dab889e16c17db7be551ab24873fda82f102d0fcfc139c9febe9fa99819cef0e2684dfc5c843a6d496d8a595d33c51e1fde9a84059c7bc596d32d53e2fe046f23fefa51d13f9c28e227f5e24429b851addbf578922aeb0c5a61bbb666d11d127ba45c9e6378c70d75643de776483582e034e81fae0a3f029c47fb192cfa018ce1f68261d77cfc9e05ef19438e47f3de9a68c8dc09d07b1bdc6ced69592623750f72ec2fb8c5ca981dfb84b4bf0734377ee9dd8ef5ddcd96f438d30ab78f402ebff2163d43345ee8ca119f3208e21aa3a2185de967b475b9abfbc86465275f9a634fc22015e94a298e9c204e9786cb1ff14a5e99f942d42ab5df51ad09654083df0259aa1c26a760ccfdf4a276600c5fd3a54f210b20731941eb48a79435f1f86c45f8181d9758a1835721b87d36c725878375febcb8d48ed2ce8892db50965753a98f4e7110281db40ed64dd8eb51ab9ce41042589152d8cd5876ff30536f8955172a7a8f5c3f5ffd22c9954903136f781f0574f45f909bdf1657fc1cdcb9c4689f41e462c8d39108b10d78b6892c8775fdeb139258f8130bd1d2a1c72b5026506409f9862aa8729b35c652074494feb84a553cefbeed19d6ee94758e800f5fcbcaec19b6a00f33eb237aaa6fc0b3a08c1d8829c180bf95e7d05f919a929933b7a032cd20ace82aa5a45e5b2fb09812f36974b5eda1b387feb13bd49ac374f821341282c8fe2fb0cc5c075356833ff8cc6b648729a4298ecd73bd0ec73957077ac65722d0be23c1536b8db7b0506dae47c0070564e7d7f9444f47b22c679eb8aca4826f974a42043863e498e5301ea162c4e96684acc5ca26ccd083541bc4c1d2fd690e51f07fb08337450a204b0f4f2c17785e037424fd6e78746764584d5f19255496df1e524bff0aac31bde9254429565278a39ece4627c023edf18bc21bb523d44efc259742dee9ff7159d5f700d957ccbb505a88c2037629402c2a322d17647e430777b184ff7b4e8d6b94724abc36a5ccfac08e2479e8310bcb7a617a25fac6efd10d0a07248f7d4597f14309b8064fe3bc4a4479f905e832210d49363d1e5d58176dec9abcc0c5132fd6eccead2b05b56c96ecbbeb0b803e43db2f982ad9efe1e2a49649ed8e42707970c93615d54a3e673559b996e48a3b73143ba0884e918888156ca78f793dff990fd721de0c0b7916a5ced736e31292c5af062d7ccd83fe653294fac8c50cf6ba37b37d5a9bfd1e3b92d1825c1be0795f9b257cdab91ce99c0c51bdfcd6c0ab5a3bc6e30f884ecb4f1f61a3259cd279205b2c21cddb196360061758e67b1c3724f5cb6311eb4fb92e6c0d71e6d1ea45", + "signing_randomness": "b1a71602133377b68a905d8f67b2199dc11b63ef8ec1ca9fa35e7f0fa859d14d", + "sha3_256_hash_of_signature": "cbb5769c923f33c57d0446a801e7c98f6540cba5ec67fdf47d27df0a959e5894" + }, + { + "key_generation_seed": "fa812d8cc3a9631a0239474eb93ad3a2a3480f2d973d3324228ef92a3b043163", + "sha3_256_hash_of_verification_key": "cbd7da56852255a94bc1ff7c838bd871fe5ec7294d87e2c80b0778566e3d51b2", + "sha3_256_hash_of_signing_key": "97d18b1544fb3885ae77fcda278eaeb303f8e898e2ff65f470c9c432805a6063", + "message": "0bf9a7c0f63cdcf3f850ed7c5db6191eeefe29e498a19f9d89be4698821abd72edc34317b4f8ec2736dc83c24ac195bd55aff00e797a83dffadc7970fe53304f16f5dd92e6ec362b9e283e41ebf121fb2fa2a3f60124ef3ebf836ae51fdd55ca9f59b085ddd660724c072b86041b50a3a446cdb20a45ba65380adf007e005df2d9aa16a9d22b11dcf6f0b1964f04f45441a923691a15d80dc85003b9ae281f2b5983dd1a04d80a4d9c4372d9820bbfae3af7735e7c71e9f085c0a6e4bc107d9e4ba222b38fb236b2cc3a19dd6067beac460383ff2bcc771a7f1aaf092fc72c292fc1d5c6fc6b9715f1e1272eb22f8e0b33a2830e31bd6c531677902f6a95cabc3e9c1ae36f77037a785fea355137a581fc14e6bd5f1f7ad1a5dd19dedd448b47b558c22dd0fcbf296a812a726e7d1b57f4688d3f577104cfb15fc63c27f7b6051c7aed7d645186fca63ad9c2d68bff442466eff76bcf0e398d2bf54c2ca4cc614839e9bca48ab2cc53865803710a98d313aff1ddd06a65680eb83c640052db807eb2f38ed0cc211128044d331fec3e6b0b2f3b675c631fdade62c16d1719278413ea3f8e54ba34ede7e73f3d94802d2f9cb9794d257c46679a3f00015945903190b97071f8fb55f8696253aa3f39b3fad344fb88224f5313b43889b768171895f7aabeff25e21e525ea01a996c764a3acf12bffed08f3f751f5cc094b50b325f8b62c7a5b3256964d48543690538e634e5730354358534b65eddd44a526bb4b15e2042b6210f503eee06d00d615ccad10d73cdcbf5264b526674d85c0ed31ba5ee584f21fe6d13f883ace4b094768865e43099e54671240e8e2af8a7d7d22335b3974ce860e7238a7c1ca8a009eb51c8636f0659189ac8ef01c871e9008957cece0a367b63bd2852bde8690bd74c6d956435d0ab82f94a90cd00fc840dfc7036b84d51f1ff5076ca0974db6cf25af42ef7dc8c30c2b04ceb2510e86ffc510bf4c931639478fd1520ad571fa17958ccf8e37f5f6360030300ede3a33871e9582808bda2233996c5005fd0c23d99261f570ad9027767f6fc96d18ba98e8ddfc2b79ac12cda5f2367b4bb6b99a3e07b59882e49a92aece85339bbb18ab9644d20a3b2a795240492ce4eaf09d9ef728fb82b1de7b64b5d391251ffb0699335ced8c7ce642ff1a79f04c3ea0dc37ea101188361afad236eb218cfbd1d0ebd784ce27dcba0266ddeb87b59b66a4f75bb44665643fa358dd3d0b69b49f45a752b5c410e2299a62be4b57b32b0924a069a8e8c15d754cc34debb0d967e70693a6ffa58cf7099c2c2458b437c7b205cc7e815f6cb494080f9eaf3017e5ff918558dde415ff72e954ebc2ed4c20c8ece38cc916060d22e582d54f74c6c181c2601400110a683f4a365e45ff1387bce4e152a740136bb762b03a99fb68f6ab42620b2e3c00fa8d150944230a6330409b27e4aad1693e2c3dd12216c4e2ddbc5e9cba68b8b5417a7b2edae7eb67d25f4edecbb087f93dc9c927c33076b1c71a2b83b33870d602562ed378805a690dd2a427d86c2c46ba4741f3defeb91a05eace975c836e52868cffe52ca92f97de94768161a3e953bab6a28016782909ec53c02f35184aa9ccbd5b793b525204b72deb63e104376893b9452c3f2c492f423cbef1ec87c85788cf3073ffbbcd67ff79bd038672943ae4bc68da131dba8d7b41c83b4e9cfb6931987b270c74919bbd40612f823114e4bb148671f1aa62bd2bdfcc8b0b24010ec112e883aec9746d0f5de467addaf51f8c070a359108b1f91643071438f098233ad9a94d0faa665a39291a98d14a861905ecde4755d00e690429c57580dcb6d51bb6186ce72ebb1fa8413892cafb8713e89775013e546fda30aeb8af9f7155c08b25810c80ccaa5e700c124cff59fa32e0293adadbcc7b1a99f67e66b28da614c5a4ccd706afd05388c65ebce07a543d3dc1e5a5d1f307f675728d4c629a04e9e455b4da35236c677f26edc622c1fbf29568d509ea0690af4cb5dbb4e418b6162888e43b458774a31324bfd5ee8d2152e4ad43a3007d7d4af5fda172c2779837ad3a09e135de953ce966727a7183bf77adfc76430666b526692991d3c9db5bb377552a7801c548aa63f6931d3ee91b875cdbcbb7441a4ff81f86762332d7192fbc2f7b69a58db6ccd3558047f1940a1cacd6fa28a000b9795a2860394bf05f0120e6d85f96b1fe9de14e3ed66a31d747924b6ff2620778e0714aeb34b79a5d935a0306e55c36506a292c5dc568403551907e49a43a6263d2915108916f1e27cf3529d1b7bd1544af83a7cbe58547f192a93ce5c5bc6d652405ffcb95345f522b2d34e8ee0960bb85537a46121bd9a408d283a125eaa745bbab04e2231c19ae95e13901c69e5c9c4d70b104478f4a70d64f81269a8", + "signing_randomness": "331c19cae713f365f5d17110bdb0a1d64b2ee06e58693c60a02556bf4e53a580", + "sha3_256_hash_of_signature": "78018850dee985f16bc971ed19fc5cd20f3e3f2d1093ab709b8d6e2f7970a9b5" + }, + { + "key_generation_seed": "c660b84d558a7e6b4eac47c7b62135668e0ef0fbf74d514eaa3d0d428014282a", + "sha3_256_hash_of_verification_key": "bb4b91db60249a657553f18a13ce9f41c6840ac25b6328f3a38397cff4605a42", + "sha3_256_hash_of_signing_key": "33887036585ee0b590f4a982dfe52a1d94408fa96e3a739d30b930335758899e", + "message": "dbfc582ae98d8fd326fae96a1849efe729a1173339d90c48c3a2b867135f1dff5b497d05fd55130694b5f9c62d136647d767ae682a0f05c670ceecc03475ffd39e0bd4e45b720d9d7e8dd04e69c969627682ad83f48609f6e66d0be99064988e4654e3913b7caf1475622e211bc247b98e5baba1b804e2bf651713197d8a610cc111ba5fd98a053408ad155dcb756d28a283bf3b20e6f3785dd5f105f8d7d9f2956064860b097c675630edee1f17e2eb0b26b6c20e260f9a5915d63f1be2c74fb0b37013244481a2d0c581c4ee12516e0fd4701e9835c8526a490cb39e99fae07c40236808f9605a63a5106c19517c3711ca4b9e8eddc77b242575d904dbe64223cf14a8e39feeda9d6c5f9cd0d0719a7eb5efa71453636f78cab8262636ff1e136c787e38a43faf02699c1f260ec45b068edbeebbb8a0e08ce282bf47d27a33216856f0c59e743deb13397656ff17fc4b3c694b189c35e516be719cda6542260d1301df93a5d93ee118f7cb0ac94d0364c9ea66718a4bc7f3d7acffa60afb7100f7d97e98dffe167d1d8e46c912d41ea057362c13b078cb1d9c443c1a57ac18c4566f5f5388f47a40ca49cdaaf34bd4c9a597ffbf7ab20d7ce88dd76a639e09ada323c588b08140e9350268c1ff76079093a05ccf5e1613a70e6e37cd257875049a767332e5f7420f319f9ac78f97c0c4fa40b1eef8c8b48045c78f73584590fe41f9f274dea838de75dade66d04e9d9308cb0a9948320d28d9ca8f1f51e39ff3de20fd5a2a267d127c317acd51fb779e597a8dc7359d920548b8bcad761c6b8012304e12628a2652d12a8161e538c20d582bf567e9c2b46b4cfe2d2da31120c6df50df45c80513aa9eee9f2613a221aa1d23f861c7f26aac7813b7ed7278eb420a5c44f2a5879a2f1f9f11e14602762e3389b152c014ea9ddc9ddde9ed1d6f74e7526f690ef37e71d448342c012e032c00e480a699ade617434c12da0e69139d0d9036743b9e2b9134b5086fcb96b193330ace8e4f77148ad0f532e72e1792795080b54d7172fb9af1972d00ae24d0b3d86528675b3bc8c7b80598d855b95a77667ad0f671f00039c08cc99f5644bb006ba9356b9c02bc935212c43490c741b0845cd7b4247592374aeaa1b589e670ac62777293870963b5132dcc27088f5da5b831fa570766fa81c2a07b88bbd45b81992edfd2a7fe934219b1f648dd8a414fa03eafcd39e72bdf7d4f6b9c1f31a0a67df03f6709f2be0e7d1b1690c92ce7b8c6b1054270d796b16d6e445d24cb11229cb0f92dd81190a37838951ad28be2aeee6c5f63da60a911ae0a24b1d05ef2f814fb30aae8ca3bd9f01d4fabe5b279142af948b0e6bbccf7560107c161c816a0d8e61dd908445079baafb78c14f68b8b2bb241fb03c237a4cb250911142d0b460acc75e6b0f58bf28546a4779ea7342238826f636a510cc9cffee8bb0292a58a07694c05672b560b26158a8566d01d0eea0773e81f3f84376b29ce375fc56a0689a7ca5ce94b91814b62cbb61ea2efca0ce6712a941d612b0f700c56b46d464c2aaab3f64a89caa8561a1dab2869d79da1720274d031946c4c7715fb9c243dc95cca7aecff55eba4044467eb922e93f57e3e39b93876a03936dffdd2af48d055c6c188f2f229812ec94f3fbdf7d7db62e4274dc91718710eec2ce034aef266207c5ccba21552d6fb8ddbee8e931067010594a9e0cb37250f67281c0a369965367424d454cdd05d3c8f35a15f76b4c8c3fee42f4c9cad68849837ded3be58730b94ae3a5f9146f90e03b4c0836381b3f9ccb5de6bd2455d241be9132eb6d4937ff27663f4cadaa9cda193919f4cb0d0f727f6c7b26e831c3ac8decc234d79d1b3bd28305e3012a3733ad718fdab7dd1a6400bc47f47d20f627d2449dbff10e37a62299e22e408a28a806d403cbee19aff6fa9b1814b35b9573adc86f829a08893cfae4a0212293447d3086e21bba28049f3ed383519917b169e8a1b7dd64cefe0da643a97950a205cbff6bd9334180556e84199f0b60738715cd69aad7c882430578f6fba4579d908f863ca54d0b9862eea6abed31301d183cf465b1a256cbd597a629307a8a890f11c23dbff895b932e9cd2f5f06a4183d6f2d61117126fcd2ce2b86bb44a9a5b402e3eedbe4ed1df11716e91a2302cb72d8f0dae132e16311c80dca041694af1ef63f659959fcaa133d9e5668f94d0489311af3bad379de17793bb3ee8a284529a72cdec474b3a82d92c6cb21c63017f262e0d7dd47aa5c58f5e23f8a37f00d5438717f05bb974f18a5d3e1ca054ea053c30b34fbfaee88bc0195f061ac32f5b71b2a8a3ed4b8bc4edab40a6396c052dce72e10768526c00610e96df38aa70938cf844cf445d8e2bf73c4f32a742812d8c1db53afc6b6c0a4bc67c3cf7579702312d6c89bf14e9585d2c624d07feb4b5b57f8e4c5cfda69a5e922cc1e9", + "signing_randomness": "ac6e80765afc5d0d647b5e4472b83b585f3a173155d444a4996545ad84e11fd2", + "sha3_256_hash_of_signature": "d88bb1115906218f670b09b0c2ded05d427924431d70f383c10487e91cfdfc81" + }, + { + "key_generation_seed": "929f309ab3f90cdd9c21eb77a7ca762ca3afcacbfe3e67b056290835694ba3d8", + "sha3_256_hash_of_verification_key": "f64c1aaaccf3f7afc95af660a7df9705ab165960f0e3c8fc205d83b5c50ee725", + "sha3_256_hash_of_signing_key": "a24ff8637a69b8c0016f5206f08deb5de1909e02fe0c2713f1b5da862e3679e9", + "message": "6103e5b22f934203b5ca87337095c9a19267afb9695d309beb8a557bb7cc90332c4a03e1d416d397b945b607268f545928104cffd71b02864e010b666cfcb68b762fa5ec839b5aefd0407419441b38e6d881bd5218df73c675df101bf2c53d90ff86d4a3c7db19ec9cac044e0467a36337aaeec32217faf86cbd7bc2b663421754cff1200a8a66e18f812868bc8d1c8ca495e6462da4b8b96d4167f040f04927a7c27ad35cf174d42684ed55ac80d14cbe4cc2570642ddec4f44880d967e9af77ee27d0d3dbaec9067fb6fc957ac4a136c1d564e17f59ac4938d43fb9050d810989907125c47fcea6c162c723e79f68339cd1b3bf596988bd6e215271385cd50616868c6bf40fdc34bd30e5a00773e2c039723f2ac3a3fa45f4ce870841762d7435bd6ccc5fd3d58fe059ee455a806fde89155c84797fbb73691a1fc6921859e99066a3239e31f28d1a46100db1917621d9e61473cf1e71f9850b584b459d5690941e676a7dd56796313ed9abdbe03dc75afc1430dba27fe0f8df48ef7c339f462af1a6d30a5f8b480dfbbe860c4c0bc136393c8fa0875af454273c3cfdba7eea44eef1a4060136948cd98b9d2c19aea4934f3455f31dd15be6545134f17a195b6bc409159c0975e592a15e86ca4943ccacf4b46719a072db8c629b67768f1956f8158f179a0b645320489dee404c8d0c4e786cff39b324053f102c118e7d51173cec0fdd017f213b2b07ac6b2c7dec04172dd5396a020edfb74ed86fc31952d241a7c3d139def543d90976aa70599792e73cf73ad0bd4a359bf60dfb2ce96a784d8de5e23a95e831ca6ffba6b187bc5f29a7757185ec06ac882572ec6283a1875b54fe4f295e1970bf311dbabaf9f894d3364d68f529c4ef9030ab934bcb09459d5aac61919946fd28df1ac85876f979e8b8528e9bbe69f03deef136eea6a8fc86f31bd64285c8c9f49adf53a8baa7867ce52e72dc4a63929df3ba2662dc77d71f88d8af42b8d67ad54884ee11f5a6b3b794f7d5610909b0b740937587cf475da903159994a262b6f32a3d1723fdaae65e636b71cb0ef0a744f359bf08ac8231ed2970ce8c451266f703da3b57f85aceed4c1c174c50d9c226f028e972ac124faa6f60518699cb4c499220ea51a538f9ede67d0e98e1bf8fb4b24b1d8ef50a28a93e20076f8fb812cdab04871d331ff434ba66dd4577b18dc3f471b3e96a174b58a7ac2470eb8463a71ffcba2d064470fd2d4e15f9491db09df3e3ba376a3ddcc437312be5848db3b9079f2ae046798473bb970d725e1d7c6fdf405ae387dd7cc1735a7fc27d1a476592a514b87c9017e1e5d37e338f37916f3c72c5f2af75185b88694d4e8e0a93fbf20ce81a7a0c10d55737b6473fbd92bbb39febc6167336beb9c235997796b9c0dc18c353e80305175bb412acc29e647813d0003f727ed0577a7c14bcf67173da569320e887bdc8f5ad27fd8864261e802a6753c6f9bac844b5900ed0d4274c0e6ede42367079188b10bed5999501164fa4c5a818ed6ee229c3e0e0f7804b19eaf5d1132be1d7fc18be834c842b21f8ddb11f8cfaac10d2e124981ed698ee7caca211c5624f09c62e1d451429048b55ed0f8a714bb77a0d4b40f0a446eddfb27602b7bf894805c4aad9252658f6b21a05dc0cf6a3acdc227fa867a4e5b1db63a14de26a79aacf1900a7b7d867c15cfd1daa712f2a1e2a6c7b31b121465539cd0164e3ccf79a978b543ae9602996448c6f68069d044fc958911ef40b0b9afc78ed014d94571f6771ea5e2306a7cac32c135fec0bbf1dca3cb0b57daa239c01671718017c907048e0d19515cbf430d4b3b4ff4fc9a391d15a38b39c4e528fac04ebd3dc69144c98afa75102d21ff961bad2e1f25562af92554814405c4ec08dae4a0cd28be592c9c9bf997cc0fe31502dd541000d4640d59654d26ca2a17ba4cab0518ee097c05b2984ffc56e8182368e216768e0d07e17fb64003e95194d04c6e00e08386084febb6cbc841e8f3fe2a069c45554bc502c27591ca3c1dc9e6b1694ba2c1bc0713c1cf738db22ffeeb7443d72d5bdb975d192976a58ab33db58f5dae497a0b24011e15e3256ff124dd99af6fc300d1fecdcee18dd4fbf25e901125d4e80efa8e2a211701b74fd992e63376996994e054cc00e7e1de7db8e7d2898a735ec4920dbefaaea66b456cf6a12324c5d56762313a627b3523ab1e2c1c82e4fbab136ae4395fcf2672a58011d96bbdcf2a7478305756d66b30a4ac44e48b18a5964aa89f14187ea114084d52b4ba77755ba04c34777409bdb782b7b645e93b4db284525e2f9c9c38d73b475dde2251277a2e6c3183d5dea78414e22cc8fb4b2c7efa797cd4a87ac81d3242ec8d2c2efd6bcfd69c39f14b0b365f3151a96f75454a3a1400c76a4390fe9f2e7a22a0cfa687a5bef1c905d3a893b0dfd35bda184f25e62fddc2a52b6a67e76f550abe4cc8d1d63cc8631e4cc315e46d3015c3b8636b92b8d07075d401c654fb4a", + "signing_randomness": "3ca92fcac81ba5d5e4679e71084f56b85c718cef79cba304573a15ae9d814944", + "sha3_256_hash_of_signature": "5bc39855081e5d520675aa02fa0459df9eb9f77a57c7828cc6522b5339d10889" + }, + { + "key_generation_seed": "dae1eba78ad1568590348088aae88c1abeb59626ef65991cd76ab81198e52837", + "sha3_256_hash_of_verification_key": "2fd7e34229febc2eadeb77fffe8f4e17701b993062fbe63360b471d10a979abb", + "sha3_256_hash_of_signing_key": "3345a35d3c37a7b43e5fcf807b67e07ace99258d5e87ac6396532726001499f1", + "message": "3eac87b3d642ceaa3dc904ac3c4245cb2a260e4b74d0394d33d4b71024144180a727f80b092305f31b2526998edf6f98e46933fdaf0e8709e98d54f13c2701c58bbe35292fd3334c5e03d345a9a2ea1e01b2c4573567ff1ff3ba7406a16f5a5805edd760ac78a3ab8602e415f67c7cea5b36421c79f83cbb14fa775448a832a4b28851ce215c11dcbaee652cdd7342b6b1204727479e6208fb556cf08bf7ee230f32659e829ce4fbce0955d01d36624bbac18c1d25a3e187722f8f74c88b56e518cf0e78b3b0eac56d8f13c4afc4da3613a41ccc2b0b0e2ebbfe5799e479f81335360d483596e9ae926751ec9b956555f271c2ccd85f0f6c1bbb2c326c29b5ddf6b5c4c11f8eed15c0143993feb626543e92ce4d66c0bd28c79ed1ecb793a3091d6b9ab510b0d41aa42d70c2d8f26ea0b826c8c375e1dd89b3e2a48fe5d88a462deac33bac35aa32ebc010af7e47b77ad23653d747760914e0ca12864cd401787efd96f30d82d8907dc68578067703dd19b2377df319eb540e8ae78b2be86bee1c915ff3b2f4b25c0ac22ccf89bd85371961944d8a4e6d20e2d3e9df3a07d3bf6986898786f0667545275fac3eb0f069b457d8ebbe5f60125f94756db04ea203451a0de160cbce2a34650d92f200448b097691a61361ac487fbc3c82b2bd7c1acca02031311971c3cf69ba459a0b640a702db4467973713a6f2466560ffac0592d64ff1d4a935220826eb559cfe0144ea4b8e54eaf67ddf91988dd4b3749c865008c0c1cf98bbf76d929b85c8c426c15fa56706984e0f2e90658fa3cc33ec9fc700976870c94035ecf9a0534b18d07f55923663835416e40235cc2550bd9822f0912cf101f86039830ad9102aa4a3b6777edec5ebe621082fcf81a1c6a528f0324ec9d39fa80b6e87d6366e7edaa0e14337d6708f7c3d2fb1978f4f5cd594fd35b267f9cd09370d3366dce286ccb9647a1944f8d8be63e5ef8f6108cc5e9afe9127da84e1913439ec35a4e17f7782df042dc2f7c5cad8a659db282e61763539b56c2afa0f2b507d549ec8c9e76c7db306380cd7b46c9699b6db8be06cca15e8e83763137b06bff02de2738a46c61b70edf4f394d54d0453dabf689fb6ba41616bc589cb9847224e74f919b6e03672ec6a52584fe81456d6e648dd6f0f9b068eb72241f067bf6b891a498a9a59356c735e10efb37b3ecf47cc5620a35442dd81e25d2c6db0e9e871301add193d628b30e3b4345751bc17e0b5b05af758a653de7bed3763303ffe1af05e407f296c736ca6f4c348b25718c7a814bd0730affc057842af3d9b9adb12fccd740add16218aa57e43835821a2bcd70f1027f3042d4a92f10d0a1fb8323e87869bfa8da24da75f8743fa3038c24fedc0c987065421bf4b300be3ed3f6d6d590968d3ee32a8f5e20ea6168756aa18bb78b6aa48c299c36d0e78b6f84cacab5946c69179e461f4c2dd201d8032a29ec6c52942ac37d9c76ab4a401c9aff96284e1e9e39bff6d912ca33b6118067605ea65d7f611dd963f4f75f97346fffd1df84c79ccba06804b3017775d8c0bf614fcf4d824709557937b22e1805a0a961ecf226f26e3706362bf6d8d1dd30be7eeda481a64961641dc57b9f0211f8ee43578e4c2b6507114dfff3c3f884586bfd1278d117f7c6014fd5980cdf1e2fd1f34ccad170842b9e819c22fab9890ae265c3bb6946fccfe218544d00a6ba5bef5224eae24002b6e83e0b35e98c2322be2eb3d8234be8b048c54e40782c9a24d7a8b461ec05f38a94aaef3da3b46d0d85b0d949cf1089408189ff97c56c7dee50a004aead82c15c7c0d0965f3c65a9a715a65d29cd3614954ebd91eeb4e74f862fbc944c56f2edec4d344f92e8154708ad0f5575880503ef0f107a9a9db99bae82357c16578f3e6cbdf9b427da88dc322d11c6ab2a6ae6f5179c94454e09df5caa6a519a4c1903c8f2925639e12af793695f256bf0e55e0d45b73880358f09719ed89a4a1a07868bfbf16095a20035d5d4f99fda19ddae3e21cb98308f4508b5cee706c27898f03a2bf14f29acbf055e4ab0713a7b6fc1a7853efd36e1290e69587fec15d492a66b9a4fea6e2bcde61e02fe18e06f59a2f4e06f177b14ce4c1cf1a8d1f49c554a8a4c68b9937b4c230320c80753d4b071bab2deda89c9181820336f1e766e447ea1c44e15cbb7c002c1813d2c1726db0e4de289466077da9610e5f3aa313b1b01dd79a4056a8bbe9d843ce5b0439325ffdfe91fdaddec6cb86d5cebb68d8f9c0ed237a4648c412780acff48fd9ce817ea70d950dcb989ea6b11fd87ea4f30347a27488c5c15be7fd6d1280fea3a7c022f8d9881fac93176db2025b4c7914a51099893a791bf5be851f325347484ca6ed51b2ba71548a6046ea7ec85b31a9967e7d119d2ca3a51c1e14d5a3eef0d41bdd615da01d45979007a1997de281bc340c3203d5bc0075b1aa38873a9dbb9d18e6e26971e70b54e41e2c8c91d2e60fbf85435c1ebc4893c45a201b1d2391549f52a1ca3e0440adfb746fbbf0d9933f9fa0220b3e04ebebb29d2a9ac1", + "signing_randomness": "539bafd63015b77a86a4569148f6c9b750d236b1bf8893bd23b56651c47b2b24", + "sha3_256_hash_of_signature": "7b6e0be4957c32177ae1a79ebe9f36b5ea732956afd7bf7692fc0feca015b700" + }, + { + "key_generation_seed": "15ed428927a7eb0c7c2dc7a98cfbb77bdd773fa8747b8232a6ec4b87cd7dbce1", + "sha3_256_hash_of_verification_key": "bcd8fb2ae527505aa9a2e8a96a5b11e0fe8cc11c3df38d3decedee61c1f5f376", + "sha3_256_hash_of_signing_key": "31af63268b3c202798124df5833740f45929f69c7a71308dd778bade15bf6a3d", + "message": "baa4a41e4b68fe333ffa5ee97fd3de18f0eece8eb83e46a8e3505e2ef8aea2c4040ba3809a764b681ec7449f41a2463651a8cc6def0e4a058eb843ef016e5cba8d55f925e66524be55cb98fc3169082e52e0d6cc3600c4e8a560b6d448a72ccc95620101323f98b43e28d6357414185ecb0263c7bb94e7f86146661fc897844cf52873114d39123260893def13516f982783b927864b61b56d3a8e5b4705da3a95f6d12a6637c9ced02f07b4aa0b08b4924103036c2a93b31c91ebb6c5b77de090ebf60a04191eb6ce9cc9b550f5b0c9104b74d15358854181c0c5640fc74caee14fed6577fd75eeca14070b6d02a9a421247a5bb262d6e62b04649e75bbd3ed8e72752289fa7c1a68096dd96a4bac8a2dc27c44881dd2416387d74a005680a3d229d562d3daaf8dc37b4c87cc86a8c991e9327cdd43ba930cdd8d1e44aefb084b51111965c5dfb0ee2f09112b070cbfc545119aba823eb3f65f26bcc025b39f79be42c0396c5fc9fc924ef1b7ee9ddb71b6e69b579c0a64c5b020206cd3515b8d5f4ff29378b9580d282f7e5eceeb5ce9c09a7b334e62151100cd658dfffa66f4091231bea6c9de8129ec4f5fbe8be0ff4bc93367dc69d9e38c177b23afba5c27fee3e2b73c0037dd7c419c854df7c2412349bab43869469e80527c3ad3a7103152f9e0b03353a596002ff54aba8b14ac393ee52eb5564d63bc2738d571fa3c255abd20102bb299441b00eb988f3a5cfb238ef8c49963b4ae8877e6b317e208821510bf446ce6b06c33717c91c460924248382159198f09d0f5a25c1611b2d39cc6d2ed149fdf0e09a0b0b2bb77067182e386f5f6a55b68808dad98e5ceb0fdfae6a0315845acc7b9c172b0e82190a5eb7c58de4f86d883292a883045c62d6a1b3c886c345aa6158276efa6b93ab2188e47abdd25d332146e980e1b1e043cf63ee35a5aa01ab6cc62f77699dca16fa30e3632dc5ccd3253d01e547746c78021ac307f0ef1a0119ad11504803edad933150981c4d9fd181835c507651dc92a86737e3afd0eb4ddef6182872fbd31bfc6d8427c2f4d3a39bcbe6b5120b8cf2af5dc59949c92d10b1c6a96810564dd335e0755f9de25ec26c102355688c38250df8f96e105136855c8de4bdcd86df03f92977da16908caeeb4056f4a5f751a57ba057ac0309f1c107e594cf3c31544e4f1d93fb9ae7e1a2451e7082cf0c850990ee71ade0498f6a3852dc4fc128bfdb8abdda3d759c8d4f83fed8509cde5eed38410fb9f0a5f30ea45c9270ba2395df645aaee03f56158685a0ba65de3d2c5209a7ef4bdd4bbe0cdc966dd1bdf1fe0be06c7115f7ccd80f8012e5d17955ae0c9e4220076882f30dc5e391295994b9f809c09dbed8ccdfc89669f40492944ff20948080a4ed66ad8166b613ab2f4414762ae493ea6661950e8e56b3758a77cdbcfbf24fbbbf20eacd5cbf8815899a1c3fd20b1d04920025885388012d9c58ea842db9530b7ada901ab9ce46a12700687bde07fb99bf66d0c775218b8454c936f03558b899b59361a0c664081ce8a7858ddbc5e7c5480280411c9acf4d1ec45035d97524e9e44f963532ca5067609540c1bcb5627f99d5c61cb9a6d400f0ba0a74e45ddab5a4e8a765dcf2f3684e3a2661a78ac069fa38163ad9f9713eb45c841c6617697cf8a72c54b550dbe9c22b04d579b09aab0ef4ee8b70ca563f81ef9700c07761c944926f9a76a8c3eee1cf7e7524d65908c47c35b0453dc10db5b75123a5b26b9612c0ae18816a71f34638798dfca21f5073ce771500034f9a71feb8b621356c430b4d47cb1b59ad4677b5c679188d8861beaf52558165f691f65a692e8cb8d24abb74b8885edebbe52fb13dac16e3a8ebc4ef192fd10d71898e93547c7a09f8642aa3b4faae23e48bfa809c5989d3462aa50fd4e5c4095542c45e5600926c2decb4d18bb43b7274239a8dfa3d9de1bb9ca099dfe56dedfc9e120867efcda10b48f7e630506aa606d76e4537036127fa05fffb8b8703cdc8de70a78d014872111a431f393345d74e8866d9a9a633923072e93dbf47c54c4b205c60e67d5155b76f51ab49acc7435525605dd43a10c88a03e08e257c68937bf2984be63d40f8a60589d909f8f09688a77da15dc7b4853339f235b1bd60aa845b4db6b699325885c49df9c40781cc56fabea6201e2f8a9352c28ce321b9441422807e9c81c8f1ec85d240c9f1c8ecc4ff06d6e3682dea3e6cf92f2b74c2165af247ce0f5ab84460693254b523498a57e7442977f51f1c2f649bdf756e7f43ae543f5d8e692820f8a06322667a7fa9c1a5b10199a69ccea22c74e172fed43e550c68c337ecc5e6aad9f7eb997a7e619d47df73cb917a705c3cde5ff344f6fbcfaecce6b734e09a385fe54b224a880704d774581074c59eb0a3b42c59b8ba4518e764c5a532f6655dd839862af716903a118433ce0809376a88e88fa847b4d1c63ee393267b15c1e42a91dc6107cde990ec9ecc7c1066e9480e90a22907c51af47da837438a90cc07de8121691bd73802d5d09d18a2d8b38a28948735110891d1b559a73445838f359a6fb90a3cab887486cc9d95cba35b55693c890830d2", + "signing_randomness": "fd3cb9a6d1c92d8919767779c088a9d5c67b919d2de1b6b630107ece8950baef", + "sha3_256_hash_of_signature": "32e41cd0657ffe2e35e69ecfc8667e9636fabb483bb843e9c16d0fe3605513f2" + }, + { + "key_generation_seed": "ba7e359b1f669783521ad35edabe97141a816c2fabf0ad0e001e21f73ccf7736", + "sha3_256_hash_of_verification_key": "60c1701a56fb1926f1f96ce8b6f110a7069721539a8647696b2be9e699d2081c", + "sha3_256_hash_of_signing_key": "694e1741ea287031e3783d883dde6935dbcaef7d91db3fd2edcfbd1e5aceb498", + "message": "0707ea05515798829f42a4cbddb4a95c5750879e0a584ab503f778015f83bebf6d63c3b48a4f478ef01091403ddc5a9662e39707dbc8502acf50f3e06ed0199cc647ea155feef503be045bea4035c07c4cceda306b8187185bd06c14220f2b7401229969c1cff8c36d499d5a725fa1ce7b44d71e6c0e4e750766183883d838dae4f00b140e0afccb0e72f935018a6314232dc632c5ad3c26919d1a7925bf0f665ca0223439518143486ce92650dd145fdb2e97e0d5bc9d6806f442fe90c9c1f52992e670db2603ad885fa42b3d8bea4e470b7f76a367aaa506e931890b6e4607f59e87a7a5fbf3991eeaee47cfbbfe3cbe028e67bb645d37a7be5e7cba6d7955cd62d1d8db0d9772ea0185c25bc1ad40a09d3e7e9caba72bdc3a6ef3c40c7ed6208854157914a80b5c66a6dec2317fb5a529421c03cca6fc0a3b3d51556e8dee7c1ebfba924fe2ebce8a46be96e761aa6749c0a9a2b2fc49b42ca47663ea3395df22de20947db14fc1fad03805955d67f8473baefe2c1e22bdcc7bb988db0dde4e83e26a16f10b93bd9cfdba77b9302edba0c9afba7369a023ef763c55484f7425f842111cae27e07a511a725f25d422d933f2ec201bffe3291411ac3cd6e91018c95074c18fc780a73945b148154987854cfa1cf1199bcd03519c8f34774453df90b71fea6734dea7191ee2a5735f7a191f527642d53c844b087e9346b07edd0b78c36f83445825e60a13c424f72530e05f75da8d33957faff004deb549985790956a0e7d9b256298d56bc6206f1e4e1e958fe298641a277a2c8b6b9b7660dbf689ad7e1a19cbd965cbeaa4a0d30741586290576996ae668ecbab4f06f2a1d542e32c5d3f042e7e29a41bf86bae29e7029d997876cfb23b10986a45ca029739b2446a29c55561aee8ffb187961e6e7401d726af6d8a5c816b2ceaa9a1c9b780ddcc4f0e4003542b193ae26ec687f8c51451d2d5387d9c3b9eb95981df2de069fe741cd5c15f6d1b12c5b9b94230aba33bf46dce8ac7e26896edcb4f87272c32d19e72c313738855c02c6f46f1162be0a3ed2e76704b16169689bf532ead7ae7f2b26f4d9b22712662beea1f46748fa4c27d1d825d3fe493b5b3b513617c81d21a0912d329c5a4e3a90ef5a29a4e3137d1ce3eee99c42d034e61593a4076ef124bd6bcf8fc911fc9f6077d82c2980c2adb955939441bc9e81bdf9d6996ce578114c01f9ba096d6ea40f4e0fbb18b3e3d25e7f6d6cb670ad26f604368acb6190667b7b7ed3c1a1da04e42ae0087852834b91aa072ad51c0193e5299481221bc9083118f7b5503559f1e2d9e22a8d57932cd0b59509e7d7f459e20ebf4c1d0df71472340e64992c0485d593714d6b469547616dfeafc95089689931e79944204a6d0a47a565dc325f3be19fd44bb6cd4bf2b1d4a78c883154d70705e121b833a4a7e7e80fcdca03f52c1f831ab0d989ac5dbb5cd83babcb3ee74b69681818dc05e33234775123f552cfc7c7bb0b98c937957a2c4e86e3d775468a7cb8d33756ed7489d04dbe52eaa2737efbc4c4d0f55b5a841e1453763e611bac358fad0b5778c6015d97cc42ca9fecc66cf844dfe55587c200da5250b3a419791f57d3a4f672551be885dfe2aa8637d6c890ee8e1063e782fd7e2cb356bf47b6eb93a155d8d64c9f6cca3971c5a7facc3c052a2aa9fb286750f76933261aff5ce408bda8382af8535145f432f78b3b25a768b5da2a211d1d07ab557cabc7a139f66edbb744aa76e0fbf22092e31c92cafc624ee1dc6732f27e8e7632c6eee2d1f5c85b52d712c884b36c91da383f0de9e06e5ef63d7b7a692e5e91ba1a1d9298e26694faad9ef262f117df8115e2e877197a8069a96210ce65d45e6aa7011654acfafda810cccc20c1985d54483dae12b29d7ecf66376968b52fbd727cbae7c9e3dbfee7391d985228aca9eb8ef98fae32bd24552a6b34baa581dbb03676a3a4546e10efcef269b18e1172f560fa0f0344149543551e079c1745bc0425b5233b7d7dc32f751d321638edb1cee56df0359eb6d9863cf3e341a56060c8ef8486014f956c39b751ae239a493a017b2fa5210d374ba83df5d799b7cd92987febb0b2cdb3ee42a61381304c5eae2add4777011c3279bbcd1edd6f91ff72b3c353ac35da8fa843dc5561d3cdb507730e8bef20cf09b0ddc36d47f4c10d82652dc2937d889f83b1ddc30e52b244250d19eea9cf7a3b5d931e2e25b64a0a81b2c4fe933a17beac2e10fd888d07f994e4f2583d204da126533f5e36b62486a00ccc317c4381a8fe11d36c43e71be108e22a98f53729f05a5e0aa38d512423db4bc1d6bfae9117383acf94ae2a737f6b8070858beaf08e365ca84925f8bebaeef5af77eb73a9d3648aaa6493cebddb95149f0dafacf129fc321e558084a44cca4b429d664d90dd90f2a04818b48d135952746ceca76f99b947a33a3bf7c535b187c1971af4fcb1eac841be7e96f429dd38127b52facc2dd6512d8d019e0080cadbf7078fc67e9af170a2a00f70f407b0a7ff469e2f6ea165f8b43eef1779a115089de9abe6b78c93e4b8e3b018686d16ce8ebc88cbc1d571372a3996c9e5967c035f9da6e200e7ecfd1cf7158563f36a3aac3cd8acf52a4eee29dceb03fa3272a671cfc9b", + "signing_randomness": "bd322c5cbdf5c481cdb9aa66cf453d5721a97e0055e0ff3604d690163bfe90d1", + "sha3_256_hash_of_signature": "bb643da62b01cd7ed361404261ba5ad0776763b1b4c42ccfac3ceaae9fe99b02" + }, + { + "key_generation_seed": "9daef95c8d5a61d3a3a267fefb9f37d6e677d7ba26a3a5bfdbda8c281be89ccb", + "sha3_256_hash_of_verification_key": "869c7b206906a757574a4ac30180cd88039fb6d03720c7bc65e9560ee6d5f972", + "sha3_256_hash_of_signing_key": "aa6e7169f3981ddada233626cbf61e7856e867e3951118729931200ea4e01e86", + "message": "f3ea695264936d537d86e545e132131442c2973d19b37f8c911e3ecef4a13a8b1edf5e5968a6198d26205ffe6b76cb14e353b5e2c9de1bd44ab9bd55862ba1a479833335725ef52601810c778da4a32c497ccfa43f91c72a1499e8d295ae7cdb43f1ca05f0d4a31b30d9a69cab8288640f3f9e081e2c98cc8351c7eb9954d428da4bb374b346a83eff5aa3f455f2bb3fc922f901bbe5695e3ab9892a93beef90fc150b3bb47f6965c229f7dcc3100a4101840417a0e2547f9d42ab27216254a2898368bfc60e7d407271c213233b6913c8e48df10967757bfaf5b5e2a284b8f67c70537c97583786b5185b45e2e36bd8b5443e98601f772829176c4d66f44a81aae7c13f539490640bfc40b83e1c75305b06be60e18a0ab568859435b715e15ba1ee4de73e04e1b09dd15350ae423c131706f057255e9fa8fa3f9e3ade7435a6451f7a2aad0c0fe0f444c4a247dcbaa49e7c926dd52a33d3737b4439c1d40f861720e37bd25366eb5f34bf4b552160f3eb80ca8fb19304e1e4143090f8e965daeff17551a3931905b5cd991c6bc5af5be808073893a47fbfeec0940ef5e7d2f2ee199847e1a4bea447bec40f86f6fdaebece6ff0f66e04193355c9576dd4aab2d796cfee5d432b1d32e13b8903a06ffd3aecb00c169a3af8389848cec724f647c6ba8dc3134ca18586db3e4138601a16df8873a490f23c4d27fd9c3d4fabf2bdcba4af3f0793e7b591198100ec97602d9ba572409ea49d7c8edc646335fd4494577720ea7cdf3b4266fc201de4bc204c0d35cfb55010bfac68ca0df3ac936c9fd2a9c532b8e3461d25362efa37da159b64670060cab833eca799fcf1342c7ee1b80bde05abad08b9ee8908d50cd0d433dda0b120d1980f690acad9c072502ab537ef71b691917a76d3098c27fdc6fad1f1b29e307e17c87d9fa6a06cf8cef6568d9e4e005feefcb5f41a46d91e31b41268367d636c4478921e690d5d57e99da3448773d51b673109cfd3a58cc50c127f34f4963fced6c216e60ea0952317fbfe88807bff4223624f6126104cb46c8d39ee228bb4fc0002287e346e5ace43e2caec07a22203fe3c4aa9008a94f7075f6e449fb89905bb955fa0023608c494f7b73d2aa4e2b0a8a7e3caa889b6b6a6640f7222ef969d46ff6794bd97c5363921461bacda17f2781e14419436e37610e52e3b7b7bf9c1a4b1d80876030f9a8981daa4f06a432dba739db988bed5de7f38378ec1f7d8a46b305896ca0caa5d8ad74002863c6ff91ef25ae96450936509efa93f94718e895a82b4616a965af004038e0897a6563dbc91eb5a6172adba052250d06d210bcf5a250246fc3482e57fcd9901104c5ad58eeffac2860a4da9d2c308552efbda2d4275f3f3651e9935a0e42869b9263fc7ea71079e604a4ec6dc61cef6ac6cc06194def432c1f7cd9edfb0c4b448dae3c2a685bc818b2a90e17a4c1caaa5fc2632f720e764e2b8da314224498119a0d94cf5dce24176421c2736575672b361119ec7c766265768cd9ff1957a17779c11244c1cc82d72d4e3c87107885f71c56da2bc41008b0bc1375c12b3b2a80071ec03e377a93bfb227bd560edd5e5d88f46f7ff9831f05bf262f01f62278d3dc13f4f0ceca0509091c25d20666d8d3527975ca3495f6843b46b5d5b6f5c650e981defb3943963e14f00a0f78ce785a21634c46b531b4f2ac5ad0f03d92372c334ce963e514a1891716eb5d5bb1b67834994eda492719032e2a4f961ddd6d2002d8f52798c45a9da8145bfd191e97d1fba1b395858b0fc7d5f5a54e69fb3780635f70a763e44075075580778676e6b9705b40f40210e597b5aa1aa77bcc3be5005159a4b68cbdc6ad8674495e0df65a6decabafb993cc49c082d358db1e5b3a8af2fcb0049a15bf521986ad84148135cdb185fddca6802c2ade9ea2e82047725d73f51e072ccd799d696d7530f61b16e9b4727c58cb0f552b188f9b451be543bd809b63d66bcdbaeb7aa917be6aef05df559b3aeaf65d5ea12e852d1370efd6197f970f52292f27923a10d01aeb652a9a44573c137257b49d130f1da48e532b3e33d4854b995534380b4549511b39a99145af5abe0ccd3a9dbaf673efc115cb75a9a5a806679907bb525a2bd4507977329eb4c985b3575de6533fc5d62358c21af3dbdd20deefd7c417c77d37dc2a098a8fa48f7944b7ec6f929387ba11e3516c9ea681238650416ffb97ea343d5f227badfdd509b94c1451c54f85e4539a8f70dbb5efbb10b2d82a16fd0c997c603b8983ceb840a7c3b61918d8a97766bb8442c3b9ef2d324e28dc19748417d32f642874a8927688c74bf4f6f6724015c4dd50eb83b85f613fa20938f5c895f88830a40c9799c212b2dfb453ba0bc534f75cedaf7a016f6744cb4f5269fbf0284eb90cf1023918078024c3b125cd9c7501224050b4d20b585472b42a0f494513ed131bcd8f75e223317f56b37ca48780750de0bc81c74a3388c94d93a65719122e9d533274811b76965265d7b2f91ebe3c5924ed2d4dd5e327a6e7546aa2605e4c78d0208db7a7f678caadfb32e6bcf8c77fc7810f7d1d5d50e26d1a0da03b8afcf99904b2b3198670462451925381f0bc404c51f2f18fa7e2c1e8b0c6cf97a9a65e575373996c3e9da15a18d15c93548377677dd713c9828dc4e4ee823a241377c65a2948bd29447bfbe", + "signing_randomness": "8e128d60e2ecf0925ccd6440e04217f4b6cd4ea12c1f3066ba9148af96d2806a", + "sha3_256_hash_of_signature": "08d384f65fbbd66a65c16f599648eebdcb0d7b61455945bb07d240e6ce27be19" + }, + { + "key_generation_seed": "0531b4105cb209585f9fbc29caa57e64c2d40f0829931a42caf7701717d9096e", + "sha3_256_hash_of_verification_key": "bbb423e8e878408a66587a833769928fa870fe2e87333055d579320fc24e1f6e", + "sha3_256_hash_of_signing_key": "21b7672d45f2ae444c6819110d24ec1cceaf92e49570400b8c5ca88ec891a8a9", + "message": "437e0f77bd0e14d704be86135119f39a0a65650c762852e2694ad9bf2ea45c7ee59df915f5aac128309847e944127294566ffb193d0361dd7111d32b06dba60a12e053f424ddd70674e902e409bc6f5891cb9a76108322cdec1491d3d89a74cedd855bb0791dd6da371a75ae979593b5159fbe9ddacf88506e6a184547e2a7395a46fbaaaf286eb7780b789fed86f257e5036a3555e777b909243695ce89957df492c80050457afd84aad9f8918099ab00fd7ad3528a3d0afe5b52300053575b839572d4d7ce43c255bbf5f16948d40bcc2e63714487afd3638601adf47a324482ecc99fb88574538809227f8c0a5fa7f20a0b2fefda38e6a665550e44b8d5630290a4815621a5dd74a2108ca946241c48661eb087240788808bf676b145442b2de4c35e1a6b8cb1e97e54cb729202d8827a0d4994c6d7f3f406ed273b00b6590006af069d69173b5ea8237b87705f362288ac3a50bbe7e70eb15df6ed820d66290f57a87e51b2c5777c9c95c2a76ecf2e296a7c295bfe029bbe681b32a6d9f16d11c7ca2750e2f8877af5ddb616d8a820de998b0b2af5b0c2c5641f498c99971932327ec2c73c0ef4058d9f33683f60553ad2962370afc6725743c86e591d7d7c20944479daca5e92d66a33ca0c862dc60dfeb5ec3c6e7de356f6e43f06b1431358285398f8885176d60cba218217dc7afe4ad876d0890648052a56812bc3f8a9e6c49f9d70b0a032924b891a9410bbe2f214c842bbf0511ef9017744a0dbdbd500a4189b471930e25216d2588cf8ba39aae7623966cc62d6c4ecc8b00b0613d912e60adf613c8f55b778efb93a513a776c64e8dc943e6272c0eab4004b4b05ce9bce9ce2f2b86fd8429e9a72cb16ec3ded285339edfcd122150f4e7310f669b1dd4cd7e76d282d10314e8abf61d53bf343f3ebf9968e1be8f3785581f675bfc28c893729cf67345d0f7c11d6e7d6da0bff255bf706c986704a3b9c6fa0602c6dc108a59cca70f624b08e4f5393e597459bea4aaaa463a3b08de147e10de6b75a0d87bb79ba9a71e7f5999c8972ba992228b60912aa2d7a32703ba8bc02f774430a2b590911d48d3866396f1d71f19ca90ebd5277743a984e2156cb57de88ebe91bcc09ccb5c687cbcd4e48e4ee110f4075a21f9a051700b0c2698fcd6a5a73372ca366a230a9abd153e4dcab7a33a8226f8458c5892098bc0a95619880156548f300c40bdef81e8c1d8bd03031c690b7c3c000ce99675adb4b94752ea22bc9e0278d0a53a2a19363a9388bb8d6c24a45b5dedd8f7482e9c29603ff182f25856fbeee2b41b88b352f99db5f33d8eab1a1a1fede60ea6cfb7478db7540d3a286e88117503c4d0a2c13d32afe3f1a31d1af9ee60eab8fe06248cfffc7bb438b77d94b5644805cc276f19268dd1ffefbab3c796923288638da1c15e014723a84f8c2dd9f55f7adc2adc13fa7cdc29baf48ca438c882da5f7caa792b7cd984bb11ec4b681b332edfd4ab4c132b08bfb688f81baa3fec5a079e2182c282a3ebe2ad5e4c59090bbb989e6a07d85d604f5ffde0587add29a5175ce65d29fb9fde3e8b49eda1d88ee8dd64fa1498d33ebaf4a847ee9fedd3376af46c1552a150014c11ddfc5047929e2415d3f9d81186a685a1caf2f004de777760f0567e880866320a7b42e61cc994719ddc81e28525e50195ffe4e0467d9a9182b75ef57dfee926d7744485a55e07d1bcd1c9b9b12a60460bff016e9834848665f132e2ff87805e00154c7d9853dbca43d005bb197eeda3d2d9249a621efc4177415bb103893c82eeb0aeea056b40e98b5fe65527432ff33ce3e09fe1288a6e2641011721279253800abc4b73f65b15b434bd34a573e77a94729a78c92f0e791570a416a0876db39a8fda8696fb12e7fa3bb11e7838054e4195164b9676dd03327810ccff9586217aa3d50e7d3ebdb1ae1bf6889df316047cbb278ce8c9741798452a38e48a7138e1fba286b497fdb8b1e7bf6145c5f29ecf6d5430f8e550314db3cf48f27897f312c6d9d6357a880b721e5148da7f789238ce411f952695f4a878756bde311bb4e62f10c2f9939b8530ef70d3fb431655aeca2ad36bb5df0582a07f53f1df8e0325e635d5a5e795c130106502a081f2fc52a9d97c5daaf174f13d2de1ea0f8860f08f4fd5b571e1ab1e84437f3c82bf19b96e46513c316bdcf994bc26fb8461f90594e08e6d4a032c1da38481a1ad7bfb7d5270255bff23ce035535cf478216e6d2e62e147ad93357d62636b1ae42c4e8433bb94ca91d0f8ec265f2793514543aa86b786d9760be5c77aad5a8449a7dbe92391eaafc305c1267a68e6acf0f044fc144d82c917992748b9232dec4e33ec97534f2bf60b56edbff675f0343c9c78e8a8d0529a78e2eed9f998b360360352009f01905c1a4815a36b111cad8e5b34688b99216171d4f57283cd669dc05995bb8d94ecbd3e7b662c4a603bd85251f2ba35fb6ca492c2b3e996fe66a1eb904ccd61b0900e7dedcf136f50e4c3ad5fc312a2de4b3e51f355d01763692c0722c700a544e681a316a1d261fad727e557398e500f15df33883abe9d1ba645936891f5a91ff6c8a7b9b6fe5062718542df4fc4ba50d7f513945482381adc42d5a9d444ca211232615306d7241fc49f08912bacbafbb056c018ad4d6021d99fd720ed6548a5a29daefdce868d71a1ba72d9f998a3f89fcfe526493582c4c8af5c1be065ea29f6155428dbc955b745df", + "signing_randomness": "8ec405f4b0485cf9e3de3bf57f23727d0fddca6f2eb0c91d162d9d5e84297980", + "sha3_256_hash_of_signature": "601b6534f2c5889297113a48497947ae7c2f0ceaec3e0514bb17f8c679119618" + }, + { + "key_generation_seed": "7f8515aa82dbc9ec8cf1ded5ab58ec0d08cf686e25a8c01fb1109a3c68d19e48", + "sha3_256_hash_of_verification_key": "4fd073d3079b82239507b87f4cf4f0049054257ce90b4d5340985552612d3267", + "sha3_256_hash_of_signing_key": "aaa99c83b3dd916171a1689be5290a3d4363762d4d273ac8f9730c176a125a00", + "message": "e4e3edcd70c4bbed033f402ceedc2c265dca10b2de0db00d454c3ae1a0d00c97e1dc8c6804b1777ed21ddf5145b9f9348a931c128a8fb03827f653c37cd95859868dde356ace682f627fb69fcd97757bbe8bd5a260a293d2acf0bfa2c0a3548fe25a2ba1a21f95123d592b40c20a927fdb615e69878e8d7c98d261dc01958a088599d3f9bb5e14002192fc7de417b1074b3f7b52cd2a699091fd9dc3c5929e51cc0259d2255caf0e444ec11257b759978bd4a7c8e2ce8473325b7498681102de6ffe9764334d862e379d9f2ebf9b312fa75d7a50e08b94bd43eef78722d423928fb8e26fda85a345eeed0326a5d694e4729154a9997b269407b7d03818025eeb2ba96580626dfdb3bfbfce100c508170d8150e4980d5d386761f4e8311339b47852acc2a0a01dad90d3978de6536547d4f203ceffaa652e4f2f28639bc3ff83c485c28edc0bbe21d17b8ecaf3794d64c36ffe7f07e8a906cab8e7fc9067ca4bf9b074c7fb01ef99a05d7c0f35d889a63afe5ff18023bf77f8a3da0c3cecea0e538a6dab5c54f3a0d83151595ad3ec4c45132ec2f22f652ea5dd930e692a7c0d7c23de84314caa7c017ad50d430fef42de557073ddba6caa4a787c92e6e28368943cad0974edaeb7addf991cce20bf51c5a898cf0a2104abb810bd4937d23e5d43490a3194b8a109b745e0a365efa59199b43835682e996794f16c5cb874c88d9697b189ac54a1ba1f459623c1563cba7689ebb32dc4fa0bf30e064d119d40c36301a653a4f959c97873003cff7e8e030a137bafe0a60ad08e4f692dc107e68ab40edd0c384875b8525aa0a5ec3aceafe557ec76db5283672f9751afe1166d53542d216186a3def4dfa94e57bffbebd6f4afec3c0f3f40f651a1251a9ab39c262d42313e9f22879645589ea54fe894ac005115a43dd806b2c8be6222dd9f02189d4221a9dde99ecb8c3ef4171776268c12adc37e4ca92eef09d2d1803db1fe917521662ba7ec0c07292c7e2130eca4eeffe53ee0ceaaaff6f4ccfd42186611afee79bc651b1adbad08458592d69fbeec708c7537925658babbe7e9867915c6a728eaf41b0af2effe55207c01652891c373f7a14409d05fe9e26c2e72d688047de9a0954516b85ed6a3230b6b0ea9c5f086720c26efbf8b7f5c5d14651d54c4ea181a707c562239cfc08b2e09a2941d04d587b90134d8f670f734578534138cd9cb7ec04437a768fe65fc5b3fbe818db423a2208e485669082b422ab1257c2529cbf7ba4cb30fa27b7f702418c2ef9c3bf7cde53661df716449c6337c54542eadc5209a0e030ad6577deeacc6be1813db24bec035cee6aee93749d524222535a0277600f8e4f4beb473093c5a00b6666cb319dff131ae4f004eeb1bf71e5d274e3dfbfa246dada9d6f548907091045fccf79b363e695ad54c2f791861ce04874ee8c3375612de820cede04e4472bc3dc19abbb91c42a1c3d7b467837570e7d20a2ca6405deccff1aec03e0558076e988619cb0cda9cc87a12367bd486b676a4f71d40b88ab4e7fa750350dadd1a8f12b70864792d3cc1804be8b7cb9dda532182c32582015c1788b43054b7010229f46bd39000440e7f5d22e4d52eed85b204b344680426aef51f0ce0551feb9672dbf391a9ad363ed090837cac1e721878e65af9ba92a0ee7c7979925fba9f4e452eb4fe3af03b9eff0526ff0a331ac0b8cd27a0c49e5019b7025c3c9870c900a7fb31ff834e04b87db77c4d6dae4c3fee741e923704ee5f294d8f881833e9137158d1ee0fbfcb4637acb814a2a5346607bbcd6bc916235f7875334f2b75a7ea7b8b8ddcdf46c0b8007c9b3a014ec6e634d4173cafb1dd09cb9ed4a123151f4f2631d4bee1520c10c15afeb17198009c2b254c1ff0becafbf69be8c7dbbfc7e8f3f1ef05ff6a7945ff79ed6c317609b9238670dea26d56d481f87ca171ccfd726cc0728c965d9bc38d376d707e6979908b19fdf7e74ecd2d0671ec338fd54ad6cc5f789e96018521882588f888d7d715104d65954dba8907c0b7ce3f2acb802ed49ddf1416c29e8d685c5ad879464819e1d53fdac741f71e31ac0c17b6c8932a4a00e7164cf8bbfec36ebbd30392145b292d355fb304a88a638f991f6f89a398b09f1de4f0b29866029bee75a12d724a52736f2b9f49937f0e51b0f2e1bd2c1bc9325bbd1061e0f7685aca02da735d8fc39646e0b2453bb9690ed1c4853a757ea9dc2f4eb4b5adbcfcbfb0cd2587f61a24b77ca0d6cfcff47a98c7098b986d4fbd0e46ef0d1f9df842f4473c43912ab49f4117c8214a42f3083936c7e8a38b294ba081296a393dcaaddcd0d340ac62511e47da6591836553eedb466da6285359ee831a952e6c7ae3b943636124e43224d527b7d394511cf31c50ec1d3e7a20e49850905d504f1aae477830e3bda50430ebd47fdbb0bf537d8d479cb799b0429c3f6591328299a09f45cf9c6d30d5c1c9203b9521d807875d7fb2c2cfaa688414497122161b1b4f159b66c0834e111da4f82d5252367fd2dbfdc079333fc51ab0d34ecebbe786f984852a596be620ec6cf84ed596425b90316a13b39e5ebfa19b319bf0fd1d6c812f29970fb1ffe948bc0d2e057b1dea15445d71b5f728c72dd0c69e277c58f031f90932994ac5a177926dcc1c570ac1b4b099ed66abf7dde5a5d77d08ef1ad7c6ffe018f56efb07c737f33038846247eeee147e4a5995bdc3352b73f15fce5140410aae3f0af1764e5ad996d01608c5e6c6c96a20274ea7781b41fc532b01b52134fee28f501efd9cf", + "signing_randomness": "234ca1489df44ffa34042a77d73748f1e621eddfdcd2cd35708566b941a1aba7", + "sha3_256_hash_of_signature": "3636c052cddcd6d4f5db6cc24e7d51fb3ebe17110b5bb7a0ae7ab90aca4d6c99" + }, + { + "key_generation_seed": "5af3838060e0f83352a75a0ec4ace2ce8ba119bf89f34cb4d6b8e27007cae7fb", + "sha3_256_hash_of_verification_key": "da1f315bdbc5ad073737512f8848a9a410cc49c0332d66885c46fcc85317540e", + "sha3_256_hash_of_signing_key": "431fca131290a671925954f2a9a5dc47de8cf3223e0cf34a4175d1c864afdbb8", + "message": "84c603d1b5549c46964ff2987a1f533b4ced94e67d576a3b0bf1c8bd87a74ac7db640fc9f7ade44ff79b820846eb83367153f5ddddf9dfb7848a13d59436916efabb82dd61291447491d2ca04166fa8680e8e0e0dc98e79344534ca1cbddb531797a61c291606200107002091adfa927a763cf98cbbd631cfe890b0ed257afd34ac0c5280aa7c70bd0c945d78e6fda284cbb7b3ab636bdf17342f2ba28d707147f14d15173d9bc0b6d65fd1663c86971be1fa59da8325e1f3773bacc5b8d4158ef525fde6e96631c51ad142250252a8e5786cd621210df3e24cc0b4b60ac2f013d76db0c73df40efaa05a65383a8892276b3d69dd511937d55d914c3222a2386d1bec0a268e683716af4ab709d2d225b86229095e87fe70d69e6a34bb214529ca3f082c0f2709e77b86b00b4a04bccd343c862333b7c9163857b77e30551710ccc3a803323f5cd4eb5317cd2e6a24bfb77727e1c64d0ac47beea1cb35e5f2ff6024c06f2f391fee76f2e69537673fc0124e48e4e2242e84d8affee6803ce6edf3a954d2c54562b8b76a4edd91e24a8640afe67255605849053b60f558b43ddb9f8a04e987d15f6292962d10ad8f7b47188d12d1c9090c0fe8710dc3937c6939496884bde0bea979839837c61be4df5662c724610c7fcb4631a0a2083417be6a20f4eed094e2145bc72a83a6e147a655c481dcc906e63adc0244d95b6085fc096fbcce81eeb0497f48bb5ef827c0893e331795e3b301dc9f3a91dba9fbc838e044e2ad9859f1dc67e9bcc375442b4eb59714b5ebba87ac9a79c99ce74f8bc75740ddcce46c4b408b91dd7d4ad26b0fb1a4ab874f5504c40e7363838d22aec45c10d3cc2e233124a5cd8344249edf388e37ba43598f2c2cf56d444bcee04a335b154dfa3ca694db481cbaa59514098ce6e0e4138c0a543efafeda4aecc022c824259a06c3d57a70ea15a5dfc822449a27f58f9ef842dcbb636ce293684e1b331cd821594a12634e5594410b6c5e2306dc8bbe62c8b0f49f2f699a59efb14d3cad399f74ed893e1eb43fd770fd61e0c58e5d8cbc9435f4ad0892681a30df4885927130432186ad4be41f6fb7cfe660e23c5e55f60789b3e97c3b622599938b36bd1c0bcf6fdb7e4ee44c92b6a86ca2470bcdb8bab8df6079382ca314bf3a8b3c4286518c356018fd6f6fcdd9be9ad9c228f29135544e723a898f483e9d9ee843e75acb3feac447973d12461fee3d984f3b4f31645faea56852d356c96cd73a6f185e8cd56731e83fea145a2bf0c15adc634dd9e2ffc799b59a0712eb4d2618680c7493f50a9bbf3f7bde1025cd44afdaf4a8c42c9254b1b34aa8559e1cee9bde7b4da0fb3cb2289418110620e505b793b91f422fcf53adda8f7c96d55e26244e075d9a70004642712eac377ce18f88f2c8581694b8f621707dab6d292179b2a95aec5ad6e409d78253dcc05eccdb45683dfffb9c629afcfb0654725d650e4a283fd98e47f37aa9309e2933cc0393625dd81d4a02f9d5082644de02b6472d5d3aae110747e4f756973fdfce8ea5f997e30b11ebd50b45f6889d227d87d9184cbc6ed40e96def8b9236763c9999e21bfc1a74457ffe5e0dc2b16876fe04c2e0f0f47012a767a7ac18d71a7fd65f8647a7e1ae2d4d255492a18aa81d17d390e381b1722bc3c38bccea9d5e73231d0c6e1a96ccb47079e36c994e94af9a318d67b6408bb602a91d8e9ec6499deed0b51a9ae31d9774a1bef4c1de0e7a324545b2af9870cd733c2195c5ecde386d298c33d492937497ea5f0e05c377a4d755dea9d96c61fe82cf6299eb34b857217a2c6733fed64f5dac5f95a0ef2294eca844b96ceb5163363a31c58c88428152663ab0a2b310b1a9e9027ca8cc0db6dff528f9a421fa826a86acb4fd1d79c1ae6123c9e685ba66f5ff109fdff2497b1a50c2e4e7b4662fa11fbaa305a960ca70ff98e5290a8c3a27b4a3cf1705c6df4290fa64f3259fdede7a81cfde4214230dfb9efb20049e905833b5d48923c8ce2f8a104946fb3356154519d950998677c56c8b2c80471a6117b142e26c0345cdf0634e356d80c3be12f4ab89eb41dddcf98188ead2ff420eed3fd9287322f24c62b21f430d5f9b8592ce1cdc946616111c91c667006e47992fe2d5a2aad82f8dd1af3c1b8ba5326220645885cc94e8b2b76cbff7e161e994c0cb9e489b8a5662e9d420913af34433f5bab10ac72c5eeb9249f3c102e1762e862c13cc882d20be16834e54dcc323ea89a133f451b70087a8dcdc5b518eef087a571b570a7966f1c49bfcdc70ac05034d1dcc56edc2c0f57d1aaf16718c67d162ba330aa61a2875f90e2935752bff1ec28a79ead1ac18e70a833946ca6a15d8765e1a62aef46bed232eae89dbec278297b396cf611448c5fd4b36b95cdc54e3394c63b9b0969d6488ff1c700b390e7226f99a945306c6504958cd43cd3d63910a4324bb662a0e5db1622d90ce00e50ce7112193872aab5cee0b8d6fd42f26c2fb87fdf99062169c0be75c85109d4e209dc8a640fed3ec71ef3de8878b3d1729ff118f50f8a33361c6f707f6011454c5d744989ec1beb644fcf99cb2e7c3cd20e6f1656e07c3566c4de68593bcba0ee9f7bd2e272c3d47a3e03985456f18cafbebbc1de74964becabdf3e9bbb9a10b29bf3b458fd50f19d63a6231cb51cde3df46e4bb6318e81e10ad1674a053c8cfe1e72853fd60e6e642642cb825644d6734afb00329839f22ced734fa1421c4334e20f2ecc8bbc2652004203b3b639fbdcf5fda1423f08c3a1100655e4763b8d8356a151d702124d30fdd87b34ec4d34bbb3639464e44a693690e193329", + "signing_randomness": "4540537cdf98ad35f5bb40da1dd2e0ca2340d3b3cab1693200afa0104fa5206d", + "sha3_256_hash_of_signature": "874bbe7d85fd6f54b8758987d90a132138569637dcac6a6b04282f8d801c143d" + }, + { + "key_generation_seed": "b323d48b567f7effffd47a7c9abf0add5f11141737a8af62b56e042ee498ad6e", + "sha3_256_hash_of_verification_key": "cd62f49ac922713f30737eb8118e40e8377d2cef96a567cfc204a6756cc0b61c", + "sha3_256_hash_of_signing_key": "4cdd942d7d0ee70db16f14a28e51bed58db63c8a16d80070c5770a778a459d72", + "message": "92d5feef68737ece61c6e0078d77fbae97b0b9235f40b97099c114b1586e107b5ed1308a8a2d20be41af129da2e0b38eaf02faef733c7a1d1a387bc55ef008530abc22697d0465aa3eb71f41ee72add236cea9a25995f3689c5a451e2f03915d96abea10d356d549d68048977587326523ccd71c05fd57bfb3c7a853f535beddeadfb84118f6548860f6ba536277ddd7ab42123e93381a385fa3e6cc023c1458a9f94822d93248f36c48fddc972b5d6494b26658440ffbc23b57363f3d82cce69fee4747a889e85343288d55d30fc54d2d0744744dba9977720e8edd2c0aca1fc51b0c6a3c68bb9bb8da0385db1ca4e9ce660cf7eb2382e5e95d2ae19def904a8651dfae53a4d0dc4d057ab1a506c3bd7e1d1ea3fc4623e7d7b410dcb312f037b7a5fde5e0e604fc33270faf1ffb6ecb3125ddfa5c49f25bbc98238c8ab1b903537cd67238995e81b814280a4ced61513d69a2178086d505f8dd1df7e11ce66ae33d4c982f94231957031a258e0ec745672a57a5ce76d1170111b8882a9eb5388094ebbd53ee9ea1fce4a275f9d7060c8da79018487b452817280c63b01b05efbf897387592e2bb3bb486fae0ab09f46d9f2e176de96c59992c10a14ec16eac36102b1d15541607075e67c842a888c87b268e9809148a323c423220dc31566b62f45cce1e2bc1b3bf43b87c998f00023890bce517271bec16efaa33f11611fde87f197852bc2e7a2b44f8c72a6f79b22f73be0611b81efe09253931545d2453939c46b6797cc5dc5a8f1aa3bd8456eeeb84ee76dbf2ebf32598750ed10670df422c7d7993acc55f657e6e1b3dfa1bd6c1cd55fae97e69d2f8f5af368f7da0a63b4065eb6d8f02b19a34600252fdffdf4ed8de2ea9cd2e74d63a6cef29bf02f92d346ecb9a61081ee5ac811f33aa5792f6a1af570a8b0846f3e6ef38452346dd637b19eca37bd1a6c42b20a5bede9a5de3c9f169d04d8c6cf5376d3404f0c21dead53da6c169f390eed7b5b54dbe47cce0b2ad1179ea8fc80fddc7281bd4fe31b9a26a00444af0b4d40a1b72be37501308906149dc6fc5cf02b6f60aff82b975fc8f146961ebccb4d126add524a9b33bb16f6a83c6f3727a72efa2bac116e493e07b2ca718a63fcac8e9d52a1b61479b4ee52a5ed30fabcea4d01a792a92676721286814f3b0f4e15e23ce0c5d59a0c3eb8573c0a2f66c25f2eb2fcff787324721004979be5eac505dfd39f5538e2c1b2cc12d20c1c5cd87299766361aeddbfff743693081842378744879e6e6371b3ffa9ddf34966fbf8dee91b7edf6eec3e4e2f410cb5351f847646c22ab594046ded63347d04a008fbf6ee9696c638ece73b39a269db239df36443868ad44d26a5c40fc92dffb008e436e5c18907f5b18b5e6c5900b41a9801db070d2db651187a4da7e2647ed3e9b6e9781627eb576bee8334374468760dd3b32985d42945d953d434bfd80d7f7ba537265ffcf27db0da1abdae89bbe94d98bc9ca197e41c0839728f964fe4ce30b8cc43cbdcdd9ccbe06fe99debc6f4024f3f00d43febcd62a1822a6d507337ee79d4517aa486870602d4f1c5368b0eaa1ff6c011a9a953aae58c75bbd3dc78d263a578c75cdb1ab324d71b9a065a9af3dab854189585c68d499ae8db887745e20ad9738705b9d2f5d429f12d6462e5e2ef9ffba53ce2f4e75449d2a7dbc3c818e61dc546175a6e0c10ae631df6b1eae6d134c08466ebf6eb5f8257aa10ef8c6f27f4295f7ebfd450629f3eb4e0f4be247ad7f5e80703b1247a4fc277311d69e5d62e0b0201a805cc4f1f807de99420d563a703493ad35a56b2b2dc237112f5ec21c70bf139a9ead8f7e921f086e001b4c449e42a0e3afcd5bc757040a2865d0e5adaf98e37e6f8a501ff39cef0bc364eecdffd03069b81f5e1978c397862fd56362835c059fcbe4d8e2a957fadd7d05bb195e21ad67b429621e1d6872de2d8bfdc91544f9e6ae8c164a23255ad0e00bcb21456f8fa6ae018f49605736c81a5ac0945e2d965f1493ed5befce512ae93ad91daf6f5a151d6c9856dfddd1f877945d932261ded67ac8231dc3ccd0b04dc1b02079c897601e363ffb9a3bcbbbdb0b0a375e69ee4a7135c094abdc237faa2e5f82d2556290adcf82adba8402c4fc9d0724f15bb87cd7a75a1a7bf826896d8ef63c7a2a3c371756af638706270652c376100ec42fa55196df332820d377760448d3e7adc42e9f5d8a7074bd0fa97433b0e2c501252de6939ab948552663a17dd7ff05430fa76e29f0519d650b86fbb19fbed097143fc242573e3e6fa4bd4a2ef6d9ce6932a066b4f9ff935ba9bc26fc2e5031c20ae30a52970a2df3504576108d5f26517f8577be61e6aa9d192ed62cf36aa641da0d274b1ed5ee864b549154eb4115658e6c60219cc5b2e22c49ce3ba76a85efb549117e1207f6df081d0761421262e352182239f1e34edbea4bcd8fa0027543824dd58a20324fd4cfe943aae5e361c367b22f587e2f9bee841e11875b026f12b9571512f72985f98f6d0c212df36a60975429173e317f6acf72e621f30654a6deaef9e9e455524bf07ffdf44642a1826f734d69f3eef4d52f26c06376c8f71dfb65a24a4c57d74b5976950af3a57b4248909524bec47d858c69041eed34e0ed3b111bbc117ab112bbf947d646ab3b7172f5fb726dbc53ae37956e29f5b6b1e3c90baf4e4fa544ff63815fdf4ac9a2a80ca0e8722383437b9a02f3ac538feda7a6d6c1635d3624a385d846e79e956dce483b89c346c1287a1a7293168d8a885feb6569ebdf3f47f8bbb50aa43941eb20001959af1b9b358aba13fd9bbc596ea42a9774a120af091d544e79c50686c26b4fea396bf1e4c25b8ee4929d75569a5fac521c77b", + "signing_randomness": "627ef60168ef6c8efd1cefb403dee572635e57fe9504c647a4f9da5bbd5b029b", + "sha3_256_hash_of_signature": "bf57f6140161a5661a3a77ce73f91bd81ecc77fd417e36d7d270b92604cfed80" + }, + { + "key_generation_seed": "c1cf3107ea9b283419e27dc563ecce950bea78c048a3f49fb42128819959e51c", + "sha3_256_hash_of_verification_key": "fba6177194456a1491919a0acfb78bb0dd211dce6d51d3a49d835af09aed1859", + "sha3_256_hash_of_signing_key": "d9f27dfb99c1d4bd62766e5073b27def914b6ec3c330547d094267708ec931d5", + "message": "7f704cef1c510bc2cae9b70fd248c656226bd5686d366528f0d0befc0a8761ec640cd2da7979de5eebdf6127f29abb8607f8a3d3be05be25aace7fef3063df28e22a522fff0b6ff6a0c61f79b02a408e8e1c775ab80be6841e9f8a9d030ae5518e3ea8a4e31e416e087d47919593598fd58122a9e601a57ef02de183d56921811ae2253628125c24f93c84361c5ec99e7b16962bd96ca190c68f3aa9dd60ce3aa7610589813b4fb77a4688308d9bc72cbe918583e298e03ab95fc500209c14abeb3a43baa92dcb11cb523c4d17eb9c6697b56c8b61eda05bf5789166f839291cfe2997b7dd462eda69b0615f2ad82aac0a32f4b30fe8725849c144a9c07799d6ce9d293c25d8302161757b8c8c8d07032d914ea7dac275919a1dfa0d3348ec07fdc70266975722763ef85ec4af9e14288c9659907526566bb3f2dd5dafc0d422568ca3ae52486d3f2c18b667e5622ba7e52c56bf00f82af2108cb4949a09179544f30758b7fb98c49ea160720991b14e2858d648f0585ad1bb1d08294f029bfe936154e9d328df2e054004fc5c29070df9ee50dcd0981d2bfb3aa7d6f637c4ce457c0c66d27e2670107a2b85d1f026bd970ef3fb7e32c60218d5e43a06d9cd26289a937b4fbad2a831425728f3d0d30c6c602af4b14411e9b3c7cf0b4d630614a9e03ac30ba2b024d496da984d08854f1366012c2400a5c8268c2b126dea5aeba0de7c92be0af08ca22e02604a753702bdcd642bbfa0cc91bd8375657a957306a76b6f139621481b6f15cb57bee128954d30f552661f906d8ab42cf260f30f88993bb40c9679385f5c4639888973361216df3c60c57d9b250f64b7634c94dda3fd122713fd2405a7b71f476c263a781dce271e7d0665e45dcb27f7293de57312396c58c40e268f57ed856f536c8feb4b0060488de3c25949d2b7e64207576641b34920d04b46766aa2978d9352c2769d49f8599f3d0439c928532e0ee428a3773fa4d68e6052335c6d93368e321d750d296799faf87b82c640a6e995d18dda002887f141db8ece2584da2fddf848d38357d585cd619b1625a70a5d333561d6de856ed9908d1e377ef7be03b326594808be58f7fb3939e939b73f11dab3e572dba41d43a046b8d2bb521728222d5a77dc886ac6f328d9a531118156d791d64f5df8ff8be8dca32eabc3cb259b0f72b021ceb4db36a6cd2fd149437b251f81f7588ae921456bef1a79fe83447d80caddbf20895667ca0e493a4731eec901e03f66de284400a5558922ad53d4e0ff7bc6c61640ade0274c63d94e96bf6c642b790823109f53c3c27130a1ee38d448239187f5009373be328af866a9b8dd1bb735e8002296043c6ff641a432709148c707b900ecf46555d77644565d5998c096756f79b6f0e20850b8bf0528e78bf5fb4859bd655227873d289cce47feda8414d09ed7e8d380fc4d580c7f44b01521e829e7b0cb2d2f345c517b65e2d476687ec9a4c160a3ac0b01cbaa588644d799b125910812790f06c1ecb1f1e64d5ccf92ae5e8147c98b0cfad5626bab5115844198e8c2ac1df9a208fcd2d2891f4a29009f5b36d8e31383811a9493cf8e143b5ac8a14d48119cc16d2c6bf6826fc47d4b782ffc76b64401b8249777e32c1298606553dacf386a22809b599924a635796a1aec3cd8568064852e54c95ad887d7afe837f6ff676f69ee6288879f6d96193ad94a0418bbba2eed5355876f2c3497448a5f8f3f83b136703d9a38fbb62784cc233df448a5e88eb5f81a0be97a16fd4caba1d87a4bfb08e002eba548f662d496a1478bb7c26c69ca4c100aa6872a4945d703ca812bdba53ac86010aa1d2c53f29e46ad095936ff50db8805df4b08c9580aeece3a6ddd828e7b5d4dabcaf112a6e35ab3c28a6ddc4d98ad1063c2ed72caa50086e6b72090cc1f2afebec6751f27ef51dd8557e53d928535d82a220f62ba0645e3c2618f3424ea1a339a138c9b8e26b14bc32d1736a4193c0c72cc402c3eab58817335c1424bd6f38cfe16338611118b4100e4038d07dca041c72e485c5290f0dde601565dae9cdf657a4c7839d3ade72986af396e767430125786e219bc5736f16fef66b4014e5961cfb4cfec4cb2a32205a92dbf1399e2710395ba1240d48277c120526cd9e2352f7d04d89cc2754379ce80a2cd1ac765718b8ba61ebb8bc6d0d407022e7ac672065fc8503bf5bc4138520cae233ea997463d7c9e00bbd852f12ec17c6f1db1914446aa21e156d210094b699b4117b31eae6386dc0de1f55ccec09aa1eb38cde4602598d452732c5ef8b07c477e3e2dd470737eaa7357e2e8b74c31a117b519bdcef79b6b044148a10468e38b5a6b7b10d74c6130a60a268ed73dc9a25ed68af354758fa3f57ed3558da654caca7150a8e4449d0ef640184a7a33d00ba765b01c442e88d9b4257b93904ace04375679bfd8271a03073e34c4a1c0437c4009a9590cb98d0b5581dc83407f04a22c9b0246de38e1a13f9b1191493818783950548be562f940240cdecd4a50c94e406b1bae04b50a3a19e7923183e3fd356238c45ae6559193e0e846df0fc6878be6c963aa8c3508dc31f766a4b29c78d749c89985ab8f580dbdf7993a2261cc4bbe489c3bbb38c46739bd2516d3c64a93f10cf559db6a0ea3bafee8b43f696a5288c66509a57c642bbeafb40f4cd0649b4ce25b6fb2ef5529b73556051213bb39cc4f1dc8004b1588c8de836699c66ced567998523ad3ac303d9e13617ce6c1d2fc4c35b22a24504c51f64155f24d91d0e8785b40912b3dcedede71a6933b36bb514fdd1d3d843aaacf2c1e79a5216622c20036c9c999dac3a5a2d43fac3b23119927806f497b4048f561a2276fda0302423147d35579dd4411416f0f59273429ac0464ac49b230e29dc124115d18a045663d228bfdac9f57b0c5b4", + "signing_randomness": "e1425191d9b51a40f04e93babc2c98cd6a21745a48bdf5745bba964527075185", + "sha3_256_hash_of_signature": "dca9501d3712e2f2ee0f49f31ecf9281764d63358b767fe32c4657db39eea652" + }, + { + "key_generation_seed": "a50fc40f0d9efa5d254943dc599f7dcc2f6d197a4d2666d5d69cfaccda560817", + "sha3_256_hash_of_verification_key": "4047ce9a38e161a7a4d5acd92ac61e76beae7ee6344f1e4e55928eb29a4d7556", + "sha3_256_hash_of_signing_key": "8d481db708e2071131bd2a7023a4e0890e9c3a092af2f3a525a21c065df82dc1", + "message": "2e086fa0c4582e0c6ccb020f86a6107475985160bed201760d6489cb05b8d21452c81bd5d317f8857703daba24e968f3164c82a4a9751dd88742b72141734dc0b4a77cbe2ae1c287a396a2f5804519456cf1eae273a5c6361f52c35edce5ed7388d61d01ac040676522c9fd7b02a7deafdcb4169867efb69792210a7069287c5dc958d0953c36f84d9a26989dd3b726be8b94b41dcba1b5374123f55a6dbd6360698551c27d16baafbb0ecbe116b44f11425da45d7fe8aba91697d83b6896a06a7888c97a91406b81b3a5bc8b68a984750893114b4011b9c8beba6f5c2d7d9f2c7a27030555633a0f90e30753a04b1958141af7c1b95ba208da36f729673d20da0a83f913bec8049f8cd032d9f9dd94b2086c61643ab2cffddb2b9be0af996d642b7a0a31ce0eec8c61b343aba980fcdace9ced7be4c9048b356d41002eee0433428846ba4220efb7f493ff57b0c706282eee448cf7da9b17b32d0eb0016983175469aa5bba53489ec56ba3a92a70fda2390e3a5d8c038f496e7c3180c6971a39491eac10d828d44b3de2be64569b907005783e62710b9ad8eb8c9af4b04993d40d1ebf165efdec748fe9f6b334da6a30c568bcbad095998a47242ca16803fe1720fcab85233ad76ebde102a5d93ab98460494bc886bb04c05ae89e157967747f8c050b33cca52ed5e59050965523ec5c4eaf94cf2f2ee80c35aeedd14e65d937c92855d03fc76abaad57a21a42420819ebb9aeb65f031f9c4ba0ac2ea27289e941db89669a0620797091aea3ebfc2ac354e94d27894f444ff9e604c8bdf7d6c00df0e7fe9827171010445e737d0a5867636e3488eaacccfcbac1030c0dfab639ab45c5ac5435e2c5b8244e58c3a6bac81eea408020bfec66ef55fddc618083ed737f4dd3bb65474487caddf3aa2720a6931fc69533b6491dfc7e6e5fabf8103d05f870bfefddefa20822a68a710b517065bd2478ce080e5dea09effba3a136c1bc9d7d8088f736c363b30e2af2a6f2395ea8161cb64079340fa642c7763e3bf0623c968a16263cdfdf1b8334e427955e20c1ebce8c8cb136da8d002d8a9e5da3b1f56668c1c59e20dc3be026a43f40910d3a2b601d9d3ea2bf6d2c2781f976ba840fc986c8af0df84b8b0fb291d1310039d6914f8f7cc6b26cc33af94150253e8eb410344a64344a5a0c06e0f3aa23c68617c6f4659df79285782c89bea3091083a069ef8f048371cfa054de45e32c19a44db5d435bc8fef5570b68d80d5bf5dc06da13c36e3aea341ca9fe20047ac30683aa9d862306534ec93e79eff79fe22e3ba15e2ba3f59f7b8b9314dce31095d3015710c2927b54ba6f46d3981975229eed16c9b17813801c7d3cb3604de9b7a4f18c2f91b2b50c1f43e87198afbac718935db9cb96d9fe048d969635cb9f4dca659ab1612a698ce45336b8d9ff5468301bf05d04b3558d66e88de88427fe87e65d36d3c29fa3fb126f1f294e9bb391ee427001c34126c6622905514ce153682754d7fb1c985ae4da600aada1593a0a214332b310620b1b4e95bcbfd6eb8a241cbe848bab37462224994e0d2f3f4b521dca4a9a5ab10bee741c5919907afd2552d4aa300addf67cec2862420c8d1d8dfff60fdbe2d4a8d03c92e23bdb3400f5390ee4b141c5843b1e2c07c9afdbc70e3fc08e2840ebf3b0e5296e1ee44d12e68240fdf063c07bebf01c08586e8153068c1adc744a7b54f53b0fec3c752da9f6f989a1afea4adf1ad6ae926cabe4e0cb2cd864412daee377de559a38047f31e834a6ce56d4041ba709945f07e514f96d783f32b0efcc8b889faf2b6d217246ba7c07b687e028f23d2409bbc12d6ec0d94ad9697bab6395b7070b6feb2e907a119209c9b7d86af953ba7d2ea63982bcd794a5bac69407bb7cec5e027833b17420f146ae08f4b753bef6ca0922f3294cd2a670127f9d2a2ca78a30f62056a425cbb7074c9a55135bd06ce677abdf33b420f66cfdbe9461bfdf385a97439b3431cd29decd9b5e59ec3adaae879a4e8d5e28ca13e73fcdba51c828de271207a5deab373b1b6677a29acb87cbb01f10cd2c090ee66d472e8db61615a5ecb84a7ff0988dd0df9831bf43d732a12ec8cd50a86add12a5a2ea765744b05f73725ab8704eccb08bd74517f21054e58903481e7a724f7ff24c43d6cd23de84cd69c9e464e67003903c3858a6724247eb929716e170e2d2739aae10b88bc3fb8ffa849e385b4113e78c24de1673fc7e7285e6e3744f3843ac7be7ec16bf74215694ce467a2e859dd4facab86250fece28e0a6a31dd529d08566a6389b85c310c28a8dabbcca9cd6a631ef0473abfd6846d8326561cc9cb8181c1593d0f15efb8129af9e838af518477ce361640169d9731fc139881d452773f21a3e79e514ddaa513d7b9f3399c0c57d21eaa00d44a7f031b79cac9fc304e936e75a0cf8d204a6cc3c0fa7d037dd8acc3a33cf5718061fcd57ebd06a607fe0bb0204e687b2a17b1ff47da357b51a753076cb89422098d4f880f831842957e648c54adbfcc0e488a95581e709b5a5a129da7ec5b00ac9b18b80533f2dd1bd0f475a61db18fc0c4ea655f602b207b572234230c831b26cecb7bc3284797c4bed5a977c3bfbeafea3dbfc4257d4c2c5bb8689830ee157f3b5aa1eac09cfce0555880a074aeb86062a8ace19acdc1a25f8d0e454f50f119d12e707d103f3c1a502d4e358d563e53554395b5d386ad49363978afbca2f8b673a693acef70d1db4ceaa8fa580160924d4f18119be46c71e09fdee45efb14a74db1c688e99e24cb6025e73a3e7f0f7ea9c485274d2b6cf9784cbe39e388f9ccf1e2e8dbfa6db43355391a369def645f815424253abd0b6de9c0a0af156d9a4eb7474a2e5937f008134debc9fc7e54812967fcf5bce28fb5cd43f1aa240ba2e9cedd6f350d556db1658868091e6034d7e1ee5c6645d0a345d46c42e23c6821c360f5acd13f589", + "signing_randomness": "6601d5036d7237da65053579c4fa739ed41e174bd433f3f0946f691fda702000", + "sha3_256_hash_of_signature": "ea80de59024b03fe9793fc7a0d3ef39401f6e467d96b259304e3a78ab4822d85" + }, + { + "key_generation_seed": "4c0f0ef1ca8073a562d5414584edf268913d53d5fb39fa639e02e900891ea82c", + "sha3_256_hash_of_verification_key": "a502054923c91cac55b86fcd1ed28b35011ec10cba0e084a0be1be75eb8ba58d", + "sha3_256_hash_of_signing_key": "6c37a3bf7e95ce54cbcc2e82ec9ddab37b63007d4cb71434588241e0f114ad39", + "message": "5180b7de9a84f651da10d334009b3d65582f3912d329fbad4ae39a9eec78943338c29db4f49ef41e3c50dabbb530e99113440383f20d5a3a8ae279a6201a0c84b003f6717c709c21ae893b6e412d87f8e0cee5a89e60a14ce975a4d42e4f43f4710fc9fa29e9b2afa93441ef5570123aa88aff009e2507a3e60a79cda25652e3ac3ac0c10a816bc04739b6fc758ff9ac467879bb67f270e4eab43f10a633e5932b8d6dcf23814de8643407b17b5e2a91b340f7bf6882db694de4dee4c480ce037b9f9a220acdce84b03746f307a6026531d712c0630e7de3add3a8516ba602d2463e3478008b3252b658fea54de41265b5c81e4e913ea0e2a63309497abf961ec40ac374adc0ff3c6fae9bfac5cc2df475885b0bc636702828489183cde1a2934f2d63828ad1f2b8cfaffa53151b0ffae6224df54c2ac47cc8844b76222c2a3b6e132071150049b6e46aa75dea28c13477980315fb64ce500bf0c6f633ae621d65b331ba96cfac162dd7897b8505257e228cb621bba9176a7afb3a2cc20d7804ddb3aae4b87ffafd3c8dc541d05624db02bd62491067ec1cdf73147014febcfa5b561756d5e7a13b88d1e7b2c0375e1d0de71ed20ca9cc4e6dacdc579f1ab024aae2a0bec9004e5dd81c046f00a2a4cb767c4eb240d205278cb863d1a61def16635c6a84c2406288410fa4b73b21077d8f7a4075a1ddca3d0d334725151e434bda80d3e73593338b07958d27337e32cde0010dfe5e58b99eb27a97dbd1c5e6f9a552a02726aad5a4aa63edc336d83e5870dbd514193367af2274804628b4eedfda3b2a155694e89f5a6798c5d6e036159c1f00d8dfb03d41940e775974b11c3fe4456e07b127ccb44e6fd6b2918f57a6523d7f77f32478d9f1bb539846793d4284e2907830e5ea76054802a266c85b122a389eaf4700629036716e2869c0fc9440856d562711e903a1853bc68582a95344b612e5cbc7c5b2aee23cce4161a75829b2048742fbd65abfe2397cc7d66023de34df4f2df8540cce9781ed6482d29ca4e906716c8cc9596b158eb51bab8c2e00253d6589a99b3d20fb494834b42bbffb80e7b0441e356b541f83877736985f6330ea459c007ce8bf18d84e78e36482d581dc7df97528ce15f68e604b4de62422b3aa76f3e7e5b33a49cba9d89fcf50deb65ee45173795393a50fd4c60cf6becba7e733513537d13f89fcf1c4d6437de0eae608fb11d68b9adc0c3a19a3565f6d62ba81a326ec334b239b212b87320c03a75c58dc8f828c4195ed9d7acddce493123e235d098e9dc60f5d3a625e1ff66f245e9977f9630a40d26e3afb6676f5122a88ce5507bd825757d9ccd53fe574fd0e6e728da355403ad664ffdeaaf636256fadc3283d6f15b297f79216833cf2c745c4c5e17d03260a69178f2216168bf8f00c9889e1e35540254f150c587a884cdfc9e5f7d379be474356c06943e416eb0697a1ae989ab4872d0bdf436d9ffaafec1631c9939fcecb84db2846f12ca395f506687b4a5638085bc6ef58fe8e2abe9f8d51f272ee855e2db84a89d348dd66950b8f43939db897c519fa302594fd1fbd6b6e94ca8ff63a7949432dc2d35c60803a570b1dac95ee0a60c62fd18b3319601ad29a156400d392dc9a14ff50af6752c1f6edc2acb7ecca71097b6e82227de429f1a29c5e38abea1c74de06e6788cb1790ae9f0e8ab35afe60b001f45971d42949263aa62519b0d630281a4c5788d5591b1ef5a003c58987e8665701e5b1c6063f93533094e96820f918c354903775ceb6675c4ce9cf940c4beb8845b4f5e1f642bf505821e5a23122e2d1adb82a63ad18cd1e4775a96ca9ef9493d75ff784a2d4a99f54dc3f87828bdff4b3a3d98fa5a29b62a85caaffbace4592a81bfaa5b8bae6606ad25a92a43140690a6003aa2d617fc707a53ec9d868e33596e098773942d798263f58fe5a1b23046cfa136ea35203b90bea2c5f0aaeb5ea8c24b8b8cba14cdee28f45d0278f193228484bcc7e08a75d0064d605d674aca9019a0a9aaecd6ac672cb8410fee4192e6dca7855fbb1c584cf288bacb40707d7e6f8ba2956f6d099f52bc7b0ad72b5a3ffc03c7b47086330244ea5d393c6b9f256fd82d5cb9436a469acc3f8fc237146895be148749f82d39b7ba4ce47715bb393a96ab471665529ab9e9958b12396c1ba7529dbf289184ff0f635c2ba9df301036c869d52d993463222b70ba778e81c8dc668de41c0356eef5c39f1bd42398bff30f959e115c6b386e73f0fe28a2665bd463c781da1c46d6d4ea284b152c8c12426dc9cc467809bfda6fbfbc0bb4793babbf6ad564d57ae9f5e2b7f651d6ed980f8b1174a126cc58b23c32ba73f5031b3fcabfe7bc360aae412d799cc14d8b252d9f9ec9005b7fca04a88cc8ae9f7aefca94137003d5764faa3c7c45670585c84f74c4ebd1f5ad1f97ea093595592fb90e3cab01f98f06e114f13de67cdc36f3ffb01c3d51ea643c25a3f6aa2c57690e42b98583d925ac7b06a349782a1d33c06bd05a82a7aa3dd679326d948d74a1861926b45db78d36070d3087aa9c5f4f42ca57ee9ce7035bd88a85ce1107c8e07e5ba3a62ecf012bc75fbf97c4c72331b55ab9a6effd78869f1cd3f330526f262f7dfcfa2b084b61e90772d5fce8f038c0f72554467192cc8a27f1f53c8714da1864815974b00991f466648478c5f9bf036dc4083d72e8d144ab10fd32408da7677729347febc79e48e7b87388d9b59aefc84b5b3b589fd91863811a6436ed76b43e657f7ee03eb796285a4d93be9aaad1e1a1e81687e42ec83f3dd059b78bb7f8ec70e6c831db5e90c6b3aa511f36507dbc8e7a77df0f5b9ef03bfefe9471de7c7fbe67b9922260d3703d95a5bfcbcb62d830e20c23c6cfddc210e47cb575957d8c3514a2ed4561c738928f210057896eaeb1499d4ddc70f44e30661e780aaf5c0a20c8553f40d7d3ff6d120511c1073510d04f2de544121ab851e98f666906367c21302eefb1aaa723f6a531c454eea0be7d50", + "signing_randomness": "fb391e8f6b6c6cf4e8e20bcbe3ac3e06718ee1e191951b5fc97a74eb1a51126c", + "sha3_256_hash_of_signature": "c5d60818f49d5eadfc5b392c385eee207ab766d25c30a90da529900d995efb46" + }, + { + "key_generation_seed": "5ba8ad9b66c93cde7e7e616a97fed8aa91bc7235fb4db086cb4021877780c6b4", + "sha3_256_hash_of_verification_key": "3f369180f91ffd5344df48bc20a300b559883dbce54708165ce9e1a58b84b970", + "sha3_256_hash_of_signing_key": "d75653fa378da7a48f7a643baa1f9ec6642637d1a632b4282d041c12a89c104f", + "message": "99b5b6fecdb52897a1958c5c3d1fc2f20b7d045f551856ea3cb441bad9089c64cb9489db6b63e0655afc4c2fa73c7417ff1b80b9c7a1d659687d2c415b3a909ca30e96849d4bcec6a9a6a4311204936ba972086b2394d86e840770d01550caa6ad85adc0ec851d2b3808e4a0e9830b99a70f6204ed4dbcb6759f6228126039607ad7ed8eafeea28d1c3e25a46bc18af7e01f55fad8244f15de36f890416aa09548554338972c5f88fd9357792819e51a63d0b872b0a4d21ea3597405b52793d50c6cd70b52841d53484bcd3ead004cef0a6bc16ce74cb8ad0848000d8c5158dc16625112d1d85d17a3c1c8bbdaea42c3a43e9930724655592116c4c6d0b8b223337ee4e754541a09d898f7fed71c3785b7f8721653986c525bc00f15590616437d11f9722824dfde7e9615f1fb8488e5327e4d8baf5f79d1ff5e808d154951ad87638910607b03faac3a61fe9916ba65ffd16986deb4169bd24a72b1c8168fe569f3c81f93f3ebdd21d4e806f79fb28550912e9afffb52e97860c4dc0d042c56e1bb71c28b68e416874ec7043306a29bd1f4b9a3e612a6778315e2c2b850d6eab9ff1905030fada250caf308735393c191134f3c493d00b5695775d82adb9f2abdad17fc41fbd7a1defe337c2f8adf69154cc0862fbd43035295b1a9c80b88fa8cf75b36ca08868f881966b41fb3e239eb1db9cb51606a0a9ebcd552b2f4e819e2c30abdeccdde88d2d2f82f3585b5143943c929591d20cef559cd2baf2dc7fe03c9e4e084e8890fce64a4aa9f13d5eb945ad7e3cc53e01fcdc192b97adc1f98d9e773a0177e8d97405808ebf48bf17b689bfc15f4c515e38a855a9266230c9085adc9a6ddaed93d80c3f38bc516695d202b4e89da5b4ebc43788c848f8c4a72f79f37f857edc105f13e4ececfd09302711bc1993f5308b8f32ab96fb8ec3f5ea0531dafd0ab3451f81f47e62c593c8d3e3beee79db06909576bf876145856f5f716caa436c98eab28c5b85bc2e4d7e1653ecbb8bb6b5bd6981dc72d7f63ba06cac8197eccdc72c1481db44724a3c21f7fc60661f11fdde8122da5d0b1d72a29952618b373423a892875e6ad24d0916109ed8e9a9a8d9a68acec4bb5eeb0d00eaea72d8d5a76c2a42f18cbdb3d336b71c70ac73d39d7eb04533453779a1f210bb4fc056b4728afdfcf46675c6ac76f750626d642e3ab117e5d6740154759a46c27d51306587650e1039054b876849882e7dfd807bd03e69021e337dd69d9b097722c6d2aeb517d773d2f7d84d69dabe1a1d6422ea1766c0fe7b8dd4d7283f2985d96d91a132b8ba03ad85f7d56095773222d0afdc5a192d29f3bb0c2539a1c99db4e711b6ace3febd58e45e99c9f5a04cecbb309d50397f28c48bb9cc9f9cf75a52253b634ec47216a1fd6358af26501821864569879be1736b0ad242ab5b8ed16a7ea0989ed4cae3567afe1f8209a028db46db0270b3bc06668a9bf5e1bc1061babba00ec4ec37280379139d19bc6072cc6b7d260a816cb82f9bc90897be3025475af12191690f9f400a914789a860155efd2d606a15895378c827f2a4ff700303962fd96db2dcd2d213eebb2460f0b753bc6902da81d44c983dd027f1171d40a2039997241e09ae5b6165b4d55a8e4c79671a8b8bdefef2c21f81c541a5719deb939f866b61be250af371cea7b7525094c904698d412737f7781bd779365f122ee627d9cd4a68da9d5be1b0431998aacf824cdd864c7365c01cd5a5f480b6ac1e5fead8ffe40d87c1f9fce81867157242285c5e76cf9667919c29a67ca0c0a61d7819d9ee6b792250a358f5691ccd80578f15288f3d5d6d7dd6dfa351fcf8df0223f7d1da1b76711fbe0e7fabd30377660ace7b23acf03abc1d973248cdd0897773fb74e20481ebd3e52657c9296b980905ad29271ec128513284f1b78f38634bf84cb80791a0c5649177791cdab87769d57b626f78a03435c758a207f52bd2a1f31e34b6a122b8701cd9fe478c57cf3535b6d51eb46caf794bd69363d5a56adde6945e9788f1e1dfd045bfbd0a68834b13d6b9ec4ea9c860eea0e9ac19c2de14ffbd6b57e5992b08943ea0283813f3f15e4f928b8d0f13de6863990f5c77f130c97d8be12571edcec7deec4b6ef4835f136da45da70a11f9192478fd8b4846c507410fd11668365b05252e68cb2c972acf50156e369b83bb85e62e4bd4d84c2e9ff41a5844d5d88aaae7ded852daa0ae5c14a5dce64c7e236e9b7b60f5b5ad4d953a2d842a52929491be3555ab8df534cad56dbbb86b28a8a86b7bd9ad1c58c87b8a089324e00fde32f8186b2b74523a22904c18ade02c3e965f94624f8df57e750ea6335e3eba705294b76cd6ada33d90fec1f48de7ba9dc7d8d60a53d2563964188874810c45736c57efbc3a3ceee7238aee5281882a554f2143bdf89ed4bd819c08239c187c12a8b6e763434b92c26fdd658b350f51775c60cbab7a2cb120db8ce8ae9aaf6af559f8cade84c4820209cbd27cc09230b22f013a0e4cf8041e4a789a5d20be9914a624ab957318848addb39c9748c8922c54327048a2e46523bfb22487538363459035ba49858f85a469957df1f4831bb7ffa0564c53233b99b596f5356089949306dedd6b904433d25c4854a80590b964df6b0703b4f9628d6b9a4d3f0a4096e9a0b46d6b32f66d563baf688add18de001da62e33c503a4387ce0920ba5d1e8b69c38e3745b19f8d8b6ca5e1ac6de90edb25fc32df04f0849d769fbed3f8169ea1d2252619a2304e055370b4443cd23e56d4934f9f3fc92f1c1eec626657e6a89c1394e56061af8ece3e2a17fbaaa4d579a99a7998632a6ae2683ddffffd27a27c8815511855f09adff7bc627a7a5c95fe57fa3ef81f494fa7ea6e6ca2d14775a25beaf1b5a3e35ecd4a306545d597e4e44301c3d1648f0a7d841f2f76fe59c6eafa3f5b58907fc4e642ecd28d16a71ee3d295f1de12de1485b9cebeb2cc6c9ac051d3d42b6a1a068533a7680a98d015b09c5b819ffc61688d441c1b7fd71180c4423e64ee940917c7dfaa19f3f51cb5b38d1b2b7c81d10e7c", + "signing_randomness": "e5580b2a7b9d30906d0d6d9b88ddbd8b5a3ea18e231cd8e8b05b35bd03a24695", + "sha3_256_hash_of_signature": "a275d7cbc73101adb0a584980f4884c504a86fc37bb235c487d38f03e036614c" + }, + { + "key_generation_seed": "25d957b9bf68326d2efec93da464f43e3df16dd6571ceb1ab68bd58e87734a51", + "sha3_256_hash_of_verification_key": "c036acab695d7ea6a9a6f416f114fd038419e5dd4940b22891ba7ce1a763b7d6", + "sha3_256_hash_of_signing_key": "c62619d77856b62f453794afe08ed1f8148fefd4219b16553fea43f885a34919", + "message": "e3b57b208352a820f622a694b7c3f6f297239ef0a069615dc664c02f1822bba48e11e37bd9749c98facefffb0fe1792a386be10ca7b98cc874c68c36f5096d3718dc93e0734d6d6f913e3b958dc1fd1424818c9437b0fd59728ed46a79fb52c737a1d1d26f04ebac279a7ff6a971e2b69576b712d9224ea18fb9bf4e613a8935f3b36a073b01f37bdc0b77981c8f2804e93c395419352b85c8a32dd77d41da9bf3ecb914173e80dd1fc06e8ff5bf0e4f7424849a15eb7faf7de77456ebb64d10dc10fec6254070c7df387397137372ea3a53dfda7da13414af2df16c1e38c5c70a5f5f44f725d622049256bb15dc04a8d846a1a0dae7e765a7f00c498f1d0b2893b8405be4a43fb7e97881069a49134a2a847184b82eb5a690d87baf2f579619ee19a3d7a7c7eea72d6e3fccf0a8092bb8d3c6b551f27e63e762a30b4a4df2dbc4d119139ae1b135d06ff827846901577700935e0011b65461c2ef9a7b71eea33c8ca4519c7bcfb557c5e1d42d9243f2dc34057f5e0ccb9a457fc34dcb10d9b47f6ec3b9550d3ae4fd593dfa3e28c6cca1ff1ebc9d98da8db869f8c80bdbf8ad4684acb6a779ca9d0a106f26da17043773862681c5dd2deb1bca2ca48d4fbb4bb7c1f765dca3a1d991d890b9a8751ceaff543997fae5b128ab2ef22b3be94499dfd9d8e78fb4c82ca8d296b0415e84ca8b5f2024455b5decc8b4ccdc7bc4ee06b4f0c66e6748fbd07e3a3bc5b4b6889c40dc4a97ae3eb43c3914def976efe3bfd84a093bd69102d7b37c89b458a55b98a1974a13a7685d26e9d816c79585bcfc1042c2af88534a9fe8b0a6c8c44355a6d606f902db40d5490264bf0f352c27355633cb095268d5b8bec985a62d84b2323fe814053f05dedc22029d2998bd0bcb255c162c4bc03f60e3580ac3ae86c37850110e9a1bcbd75f64a0dd60b941e2f57da9d72498b3ea8324eea53da3895585ed2942b9140f260895dc6a1131a4c3ad2b64028bb8c0fd67e1be4c07f808b47daef306fd9578025f9c639660075837b2c95473f7f860d6ea2c53f4ba677a2345cf212c7757bb94f1a4f76d4e96625f6fe051b8246d1b7611bf6fe325ffff8514d2f9a3453f0e77ae8b958ab5b567e541f156c6f4d315b4c3c547d59bbd0d7403e2e6a49b9e7d3fdba338ada41875ceb03830a846a1fb266c0f1228aad2b76a2e3404278dbe482907206fa66487ad2c999867f870c8cb7a70b83437e14b9e893bf6b391dad75e84588e882246d161799adea63adf1ad706c0a3b76bae595d84b21ae9da30bbc0856987f2c2c543d977747b8cbd5a613b92804ecc5284ed23650e9dafb4b76d63f069710897334f18ea6b0cbf99cd590a78e3b050e1bb24c86d6323a17106f0cae3f30b01e4eb3db1b5f3a4771a880c8ac06bcd5a82d4103d0452fd7b54834c1cf8595dd77f82d4ad9ebc1cfd0c9a8cc787e10aa4d1688474208b69ff7ad4da6986e5f62a34ac3093e0fb1efe8ae3a96f6aae09b0e8f6e7a2b65c7387999cecca43cc33f026dc19bbfd867c48127cff579d1d71aff0c4a0e20f9fdfd599a6169df1b85f6051e02290df6f5ede4f29bb6f0c8f806d6850c6534ecddccd75bb8e4a097c70445585740f822e5cebb0e19eac82bb78ebde2ca60a810ac6c54119fd6427da8a0155ef48653515a919b299a306fd3c62b505a6911db2b56ca2f296e487ba02c546eca2783ade8e46a8c78eb1f3d7c04bb24548f92383e475ce6e572d8de1bfa9b3e35d9bd6c79547b592c95693750010a3d22cbb31aa5a4abe94897831b1ed9287631f006a735c36bc84a8c87497eea4873801a733f35b328c7d2ccbe4a41c193d22f972571ba7630b33080793498cc85e6eea1c412914459da175a6db8658d0bd7a823fab286edc20c785c40bfd539924a24af4e3d37bd781353677c76d4672098f5bdd17017012571d9afda05a40ab56998e40f5e359c43dfe32ca10a45bf08f67d128c24b1acc03cbac46ba6ca5a532c105e91e0c77ed59fb534aeecd68735a4978177bb5a656b9f83b202bb604d61a24574c16656e512c0a4cc6f597b3268573e10539d1ba775ed83bb680bb9115011c6ad43fbb66fb37c467249060a1586df27b2cefa65265ccb9051e468000ccae24f08ba941a8180a64bb624f146c8ec562363b32c369f62997c4b1375dd7de64725a598529244273caf8398913c6fc01522683cf1f9f965c491abe7a554f0019514ed98d75eb8bb8565f77c195f629f98163494b4aa2674f92a41dcb67edd1d818a5b98993d0b1198bb6bedabbb486bc6fde039433e842bac568a5b4eacc028cc2544b57d8883848dddee2e967ea85a6102bd0abdda41c3d78447bee1d4949449abaa9b3377e8cedcf04a500fd1a6916e26983e64b5e96fef87b32a060444d374409262453cb1376c349a8b5d1767b1e2991a1a6044e0f58831bd11f12159675d215d7eaa74807c995fe22017e30482db8a4b09ca7800822c75c92ff649fc0728f5a1d44efe7d0ff147274152d5f2f60342c8f5f951d8c95f83c1d54613a182d9dca68f54fd55047f1f90cfecc04d733dfa82cff2618f29a4db4f7e1e59dead58ca65d07cc90c25f804a895d6a82f9375451cc55506d276fbf783f7d4d53b9bfb83dbe4a8771afe21ac543983d68034badc980f9434527f9edaa2e228646fdf75b44899e749cf4c9e5b345222385a4424382603ad6efc24c56e769028f4394f2f6220a9b390d395e412498e57a08bad927b8bd5d76e18e8feb457fcbd3248d218236b07783e57fbfa03c292a9f5719e6aef2eea3fab2caeed5442e89bffb236cb13db2cf9c35a38c338c377c475daf45f8ea822f9aaac13425fbd43d3dd9229367f0b3687d7e82ac5ec2fc7cdb69c99a4eb1b8e45465c6a53f16ac0c4e0c970b8c732af515c09eaf25596f64a04ae4621037b8841fd2b1bbcb310ea23e122b0b9ab96d8f7702952d0e96e4cf79c2a30df0091acda91479ee2979b0054997c48f6a0e909bc52a943459af25553969eb31ce7685369a7fb014561b4697b8bce220983136e5eb2303cca4eadd4c6cc74ea2fe69d448ae6ed953a80363dded5591b27a1ea956df081ce99aa59dfc789d9d8fae952b0737099d467d", + "signing_randomness": "6db925e3f0c18153a88305735b7b63fbfbbafda43d53f6db06b50acff0d75bcc", + "sha3_256_hash_of_signature": "47ce50be1a1e2579015dc57ec4fa9ee8e27a660377a0d076127c84b1f65a1e98" + }, + { + "key_generation_seed": "24f0cd3b05d964f82d3702bf0a613139808d49283286294be57e13a983c3c961", + "sha3_256_hash_of_verification_key": "7b6b51e56ace224d0320f520b4f0e726dd0f6387efbdb1000d29b459e8924dfc", + "sha3_256_hash_of_signing_key": "954481852fb99f268dfd3f38fc2103f3a952dd5b701efc25d06ed783486d840d", + "message": "89d960d04a3df6984276a3d17d59af9e72b25418c8797170fa701a672c5835ceaa22dc35470d038c6acc5082d2ae329f36697c91cbb1f9e42da59a654462bf19e04352192778cb050db6f4a656f6ab0bd9641ca8ce6c1ef8b020a3d9fd9dff772f38926458bda6e6072456e506ae464785399ad7b498afd4c211f09d0c722fbd9e20890cddc8c6eb9ee75390e6d76d0672fa64d8b97c65cca46dd1f542b6d6014f035d2817c4b9430ac8dc318cf8642ab34f4c8d71fc0e3b1fc961e94b6a84622876250fdc21987777360784d9a58f35e1c9b71f30561ed6854ee9b112e7b20ce064272213bd1a46d0d19e5efafaac7addf4d7b7a519d689398eaf1e67e64ace8e5e89756377e1fe458d04e3df7f6680f8b69815680276acdbee6c8e1aa909ec56994f3ef3b65fbefdbc29aeb0ea906274e838cac36a0607716fbc2b8da6150a4ef39e1cd9cca72915007723c5d2442f7133258234d18a257da2c13e53b47dc6abc2d607b98e351fcecee8ba8886821985bb3a7bd02429ecdc5a27eb04d01dadce88a324ae44f567593fbf730c284414056fa33ce90a6d6f146dbb1635bd26b4f883d4948da47216c70d2aa58ceb3979523c6a4f2f7ea455a97c7adb6c43685d63bd4c51d7ddcb81a06b9bac31a7b255b94052d686128d234bcb63ce713028451b18b981b83da1246281fc3bd2b06c741cf71979daefdfa0fd06fba3722ff7bcb2821fba964fbe9f6467fe583c06d3889a40360a7aa03358175ee75eb8fd1d3368c30b5691776c163764db924fba2362cc9572f642cdd2b11b40fa2683a529ec2100dededeaa70a1e639a71d6a96ad31f70a00fb63875d0fd5c21e56ae57b6e74eecd2ef34bb3e20be5a1f9f1f54955a18b4e4e4b9119973deb76a2a603fb6410a350667ece5c1c147dd00b07a88a7d0e86aa2d747a867ad90ba6660c7a0432e20849ef642a20cf5a20af7e34d139b39dd65c65b36750f17f0b9f1db06cc6e16f10eb289f567b647454a581604f381d66371238ab785585a4da2d00810ef6851a6009025fcadfb77ff7996ba6b091fe4130733466b29fed46554febc2ad291dd966bef4d79a9e04014d3003c95696e8bc39892ad32db6d6ad22d33e931bc87f78114bbbd97b334bcea676f9e9db23c0485ec06d8f37f070c143117b1bea49f06e1a2423d98c12883d32d29103f7699646e7091d393b21a260703e17380a1bd85452702c3af7df73ae7856a1c066013014de62c3c817dd74c44aa436a71490e7bdc6b8b74bf61711fdcc541ad7dc49cf4c3ec154879e048ff30df25065b5641367cbd3bba19606a9a27a64055d5d3b538fc88eda66ff9f26e619dcba696866de54a8dc8580b5b28144f952ffc6dc543e98cc9fd7f4538135c0f4deb4bf892266dcc48a4d1ddcf407be4fdf2a5afe4a0105a20ce2b3d9f48d608de2315240875f1fed696c49cd8d4a78ad26f51b3c804949c536ce35c3963dc1d238516b3f2d297f5c9939a946a0170e185c75087f37acf907f9e3f87a2b15cf81c7ecbf2165f0f3962d11e9c6a7845ecef432ce9e1fbe74c77ea1057d79cb595d47a8ddc1d911c6b97af76d91f3515081b95ced16275decdedced9ac790d73739e35973834503133510dbe39201f9b5c618231184b9dbafaa7ed6623e8bc492170812444db62d4f01925dc4f821c0896a746b4453e93ee51844b311b0a0a51601477bff651eb5ee331227a2e9e49f593eb2988e449e750e990a8a89906efab00e0955c81b6aeb160313007b481c40908130597626935389e47afcb0a20146f0c7b29b567e95d59ced7fa8023a2d69c89443a11e7150a03d09ee6b0f74358141d48e9bcaa3ee081c7d8f8c223f4d48efb3df8a4e287fc5b90b4fd251cb616687ed09ab1a06c42eb9d6a578d72e99d499882d216ddb3f35b0a33d9f2d3d4a700161a5c3b5a6729f197479e78009794aa1be3c25e0b9142613ad2ea508acaef5eee33dacf60cb7a16ab38d9f3cafd2150081b63a3a6ca0163a25fe81206a37a0874fd55fa3068b4c1b25e6325fa56646ee5f3431d33d0bc691c134ab306b0bd2d1087f4d898a529dae08b97683fe2eb8abc9095d67b79cff0e77404c1f7ff316c3cecbab77c710fbf961008047af22805d77eff79f815b21d142f517da2199f6627ad9fd85aa24e9b7f40c7796207a82901c7b5a3a42369a9bcebc24ece13a3ed064e4e748bee2890bb21b8e4845362be9aee46e25418f7ca38ed087e46e24f12012a1312bc623aaba6ed227cef116a3c2130b4b837ac77d86f8ca3553ba0cf5ad45e9b4e4e55059f1d4675291581d7cc9e5839212afcfa897e90cb601cb33a4d2241a5ed5925f6416be5a43d4767fa04f701076ad5ed5ece2d09b8daf11b00fedd2aa2e748cbcbe365031394ef823951ebc52b3e4c79d79234c16575910c29a35eb67c624f7504eeca3921f461d7f95eee39638c402481df7b59310c4554450789dfb28ed1e485c0018512eb05f14dc7a3db5c0606f9e28420d76b8f8534d2ae31aa01e90a20e248a7fb3b72ea859031c67f7b2b043d38f7183165a42ab28c6308608c530a9ca98f82c133bbc313fddd2109838e970dc9989ec14df781a518f6cb56dbedfc1e381250c64f95d0be5f37515437673425374d44811f4406ee2b5130334ba555839e61ae623d283c77247d2ef8b22ed138a526f7e41dfd41fc69a2839b77b51c6fd96d97d3ef8359e8725ba1afa80278fb3ba9c697f7e2bbcc5d3f0f2e61bfcf542d3160ede02cd6295fcc55865e7890342572499347df80ec073a91e00193baf804b884e9cf5c43269824d4caf7eef49fabd8bdc5496d190263c96dbcd287681c19b90c34635ffbdfeafe0601bbb7514fd84896a22895e9b21faeea372696e350f13959fc23533f3e8c34b17b595f3c935e37220aaf644f3a565114c34c7b85f1a3e465470166a62b13adb00a2bcd5a9a3ecd59fb772f09dd6a6e2ad12fd54ec62cface0022f2ffe3eb62db0f4d0f0f9d1fd6f3f11d76da868d2c1c4124915de19eacffcdb31f7ca018b6976260ca1bb2c4fcd6b9958f096313b608e208d875ea5a1fa89916d0367edc4f8890e93f1e660aff16ea79d1e583007e693bf06c172105b3dc24117dd921fb60d3ac0d2e5c89fef17087d885a0794e496e3cbea333cf72a507788efe", + "signing_randomness": "d82adc2be24134146c202bb857089860941df6b4cc218d016a3257520bcb61ca", + "sha3_256_hash_of_signature": "adc7e091f088eac6078eedde48d62ebab87f75cff1de023d5f7846a7918bcc8e" + }, + { + "key_generation_seed": "5ef2732b63a1cbd2cc239ea6fed62f7feb3102715a5bafd8c83aac33702faccf", + "sha3_256_hash_of_verification_key": "b6d6f5f4710686cb8b2655ca83ce927ed5f1e696068989cff249a5647d2c0ca2", + "sha3_256_hash_of_signing_key": "47a75e466798b6649a60a45903229b722dd34cd02a10e5d8c43683ace8d99cd2", + "message": "8337940ee74590eb25e52e78e8563a09cd2d45f650f48775e3e61f9e3509cc8eb7e983310d0185359f66bd80e0da1e45a6beb53acebb9030e310e81a576d0f80c64fce1d1fd77dca27b7c6e02b0cc26edbf496ad2e3ce8484e988e56bb28153587d7ecb02fd8882545e7bf79cc9966a7fede93f7e9451bc48fdbb481673d1c4135f95d68f40f4b4f847345a320fb4d736bf5f9fd347435462dd3a238e4c799e7cee081107e11682c7b558b19177522427f1d269fad81b565be538e8ff2d7193579aee51e50974bdc0b66331b59bf496c87e4f6e143754076db516c9c538410fb38a930cb5ba1e6610441126d01c8eb5f34e2e58424b8b218d9e68c5d8b4f5258eef07ee0aa5475a72ccf363d47d825fa524c16c7b7587c44864da9e4b267f738b87f7e5701147f550cd38774b17de48e6969a0dedf334fa67470419059c4d1607880cb12fa9c0ed23032c7e0f325169eace7daccdd4c2e5097fbba859970d7eac4522c1fea043c9278c1c89fcce95203033b4cea4f9f24b55ba6b79ef88f275310c6e48189efc1eeedab66b56b6bb028726bc463d93d742492841e85d5c837948978d0fadd1c172f8859c802c6be8394a05dada7546ee1cc5bb909d3189088f4fa6d07c573ed7263c081720e701d5d4b027ae54be175536f3bd5e91993cc040311a7d352aa26414cae30d10408ddb44e8c9513f4619e99edc894f963489876b24bb0b91bdc3ee5b78ac0d4046b2e864789c0c779e5af97f8f84f09a26ff74b8bcde66c007970830b70c2a1122dc9845905c3aa7810b40641e8bbb398a23bbef52bedabec7bb54823e64177a73786992dd67d5c007d770938402efbcb3a60281c5706920a9eee4c26c0b251c32b9e1936fdec2928110959e99255508250fd5ba84b4fb314187124072d30fbf2163d36f1480ecc08f7fb8093bfaa72f1914c63533ebb3a57420dc38dc93dd6ae4d197fab790c1efc1b7a2234522e0b408d0648c7ae782f2f08cb70b96cd76b5089af1ef4ba3a4c2faac363a4dc1c6c421f6ae1e9b67461eb02f36c25e763f1a2b73ceed4dceddce619cb313d124ce6f7ac986d6bc344e630f22cb654c1286fbc0ee01c968dadd1edad744c8bc828cf5f316336a5883166ed000ff98d6ce2ceae7d3e40bbc5714f71ba9e25e1506d644fb2de2fe190d327accca79d9b6d9db505cf1853e98f30e9ba5e568ed83e2567c936a64420c5d8f07ac4f65f38c28e88dd7b5209a600aeb81a6d2afa4faaefdafd9b7fd3ad7f49462cd577204184f9d44a45e2a909373ced24ec0ee56bf2e6675c506eda67b1e6dab75cbf1822e20e7a8a81a7729b42a6d67a1dd457fcd19b62f048ab97b3d694254e5c051fd2daf3d12ad627ec37c22117bdee9eaa290d11d56baff0de1037eba908fa03e2f869fa2b27936669306e8e70a0a4910a123f202797bf1c8fe47178bb1e8e8d7ab1c01f30f5e779b2bc99902df15185fed4c865997ab72254162d00858e0908ea95a9acd0fce72e571c7a381cc33e06a27fe6a5922775ee82c973cc3ca8a05717608f8703946c9a89854d627744da475defc1390dc44fcc3a23c47aa8af17240eb1a1a00a062d258d471f31333d0356243dc1cecfc559378b4395f01a970ea4074d5666b44d49ef291ed15930dada66765b165cb8331cfe549c38cd0672f534be60f4d9b4c125ffe747670513b5744676899b256b992e15106b99b794db3950582816612144649210751f3d0dfd5b25cd393e724f7fdef00756d0c8540e8891e592507599b06edfa6ebfe543084ac81858f5eb02d8f5eb8a72184851e8589a3ac6dfe1cdcf286723fc4c1202765fa4f783ee58c627ed494c7149bca6a4ddb420827cdca82dc42515beaf46ce9d9ed524bd00ebd3094f770b1e1dd09fc431e4c244d2305619dae208e65ef385ea92f5a79f12b99afdaea79c9d8d319944ac6cbbe3f1290ec6b87d97785e059e6871fdf239bc404021cb52064b88eb4cb3fb6a871b0f76c12d7b8c5e8fe0a65024ab5b25f4c67b6d15c22b0005b754cf7cbec898b49f4326f1ae4034e5f5a446a96ce08083d48525a3661e10c996dd22dc34fe570a4c8817d10d750fc5c2ed0c24c7cbcba5cd1b2680dbaa3315fbf2ba7457abeedc96b5d111110d4678ea5c7851d25f258926b0b028365799e940a6e17bb03cb332fbc6d713dea7108fc6268c8d33e7a578c94ff75be808c15ff7884f092c0e309f1af99b1a7314fa0f32c8d8e32b3e9d92c9c8ff6b8fbb99111529c4be3a2a4f62884373d0903180b4deabe613de5cf19415dfba7f9a46297ae2f21d7ea420b41f628fd8deba55207606539d11791623cb325f1e18c98aac27283bfab2408f4fd6cc58ec9e306643ba1c0c77d84b3930263e5a76a1ce94f3d7721f0098d54e6c990c3aff69b6a0d82c853ea2af2d3d2b3e96dad59ff873171b55d16ca9a7c68dad2e918174d264919ddcb4b9d01ce622d56c599bf60711c74315c918a7bb97b9513937afb6a652da68b6b0b34e316d7be9f5c282a5e8773c892782eff220667a6a54069c37b88eb1ce676aaecf2015e59fb7af4d30c4625dd8de4805f505e83c877cd61d2a0ba65b32b0dbdfbacfc88ca43e4ddf7a1a4517dce83b7b8acf8dcaad28284039747935865daf8dcfca29fb676ce2eba2c509cd75588fa5e58cefd0694626c9bb31c3afc372ed313c9bb3adc398e89dbdb108dda63f9380ebf9da17b378451634682f9823e209bf10e39f884ed270413152025cdbf4875c121b1e83e12c044453ffda6d8ca2c240ad522577c6898ab6f2abe1fe77f860939408cd193e605f87ff2248fa163ac2fc0f39bfc38503b23f5441e0e364caaab890073266b3b51217661f5df41c0ba925bb425ab3dd7b6a3675b7d60d0290131ead53a4eab0c66baa83f2fb77e74c3c123aba7731a3f62fab8eab2a96e8bbc911e501cd23a088e7887a469284e0b5c27b5cbc1de2b6938cf1af58a47fe78141306cb76e8f2b73620bc4549db6826d2d72873885f6c5311eb5b9462bb4631d314dfb9c836c6f4d9eec6818940c04689cc4d8d11ed9869355617861340e722b2be78197746e2759aaa8d68d1965888e89b6b0f5bf51f94e586b2cb8708f4cdb520bf31ddccfb7cb69e29a7ae8aab12c11f431de40fb9e82eb5f2b6ba1f9757f1487b63255fa69a755601c2fe17cd1892d5a6799c35d05098dc133bdd71318667d47c4671", + "signing_randomness": "a4fe2f6f39d216be4b44712577c349cd8c58a9ea3c9d73926603f8d86c4b6c4c", + "sha3_256_hash_of_signature": "a4a18b37443eef8eada375646dbc7cf65488fd33bd0bcce34e6d2d608c00fc08" + }, + { + "key_generation_seed": "6a27b1666ab6fc4483d14cf84ede49fedfe05bb24e008ae8a01c52d83b8d40fe", + "sha3_256_hash_of_verification_key": "0504544dda1fc83ac4e222abfc26acdaebb47e8310feb2e5e0a1441288acaa85", + "sha3_256_hash_of_signing_key": "e52488cbd5db4f4aa678db0f0be753daa65d748dd6b163b12ac2712b477fc379", + "message": "62215248e1f3afb19849f758d742f8afab595040c4dc520d603c9a80fa9cf2e97e4f4bd7350551fb667d606bdc31a45d88836cd376785c01f9007d47df95c1f4d1e30a927a13525409d91c9f5145c0b86d3b44e933ca81e4ed9559ac17940c61eb85b2d26d2c47924ab80acbaa3d9b1c8855c13ee45f5c8047c161aaa5321839a01783b21a5ee90cf91b8285c4779465b7a89de3d74d482080f68eb2d8b47429d5475356c50a92b3acbdea5786f4d6c2a304ab500490f84fd1d0f21acbea325d62d2657f3889b6f591a7f63d8633c061cb14b8266a7fe17642dedf1d08d9ffe369126cd780d9f99fc6262b5befcfef35d33498cb2cffe55f2f8d567ea8687dfc6e7d49a61fdbfe768c1d11bf5b3b18ca52225b096490c97cb9a0b3b2ca0762dcc36b60f7d26fcaa4e38b1f3a6279d889323010d9cb0a97fc488e09b06237e6eb0166465c2cbc2b9cd06f155759b6c93ca0cd3178845e0f3a2d20a68757aaf3c4e74545494462ccf28f6f51ec0fdff4f1e6d98fc5b63bff068fa7be1764bcf14497e71e424c9389c5dcf8c5ce1dcd40b82f1d75c3c3970da433a92a04de958766ac5eb3645f4d21882f7071383af8dffd6cdd91b549f143dcf59fed6674441eeb03d5013e90adccbd7e3da115535ac855dbaab7f51d70630dc00009e726a16deadb12047d85906cff315c73ee7d4e24c9067e3b772f3dcc44c25c7cb8622fdd7b8ecf5e9c877838d71d500f864a662619b1478f8ab4db2dd09a111acc99abe737ddbca06e88926c4e73b5f5d21eafc4b11938feeea5f8d5a4c616a342b54c9ce371817aa2409a55a3237be85a50f05b33d35aa86a62e85a01cf34ee7dc840a26fa1b8c6b307817c062d9a2e7163a3b036874d2abf6531a772d4031fdcd59ca79fbf442cb9155f90148dc3b723778e699c6985634185c3ffdb966adb80a3d1308150b12964142498466506bc0742783c27bd3472a5cb45021de066c28143ffbc82b5742be51e93bcfde1a61e661b730d8760e108b80c859e4b3a07d483a6a8967e5f01b03ec8b63a20c6a03755c75f419558878a5eb8bb0b2120f183e4becd4a104eb4db62cacf5f9964583815334a25bdb75724e549211699ac3bc9b2b5f58f1fb33429905df81c9422f8b84e95a7c36dec6ae9b48d4f502d8ab59b69e9d112693578d143a3f111ef00844303950f65ddeea6e30f1286de16546f90c4364a5c09755af3fecb13983c418b2fe4ac17bdda57e4d597e8bdccbfbe4082c446fc920e5145bbafc67fadd9799cd8c7714510da579516ed39b3e22de319977fc77a9ca61ae8252795d11724aaa866c1ffdbcbc1ff91af1b8713248864a4e8b9c59dd12863245f5048110dede7fe31ff9836715886c37e9642dbd6c668ba7ab8c2b706cdd58586eb7227b5768c3509c1f66493468859e275700ea38ba69064179f6036d7b50bd232b61c9b9659492894c0057dbfb80329a76cdc57b2a89bbb910483301ca0bf6aec7d5ddf86644ff52f48ff6c7cd00406cacbc09aa251708baf3276a52be2c7b42fb6a9036c318529ca98940769a67dcd532c0000afb5fc63ad2303e94e09d2cb40ccbe47faa1dd22ecf528179ad40fd4bfd43717864149243d61ca255344c52743200ed8385a7ca6cca24cf967d23d07dc2a3f9ad5f3240f4f022a6c6cd281b6c492e8d144a2f4641957ecc65b32c9f74bb468524ff58f0f3da2f5a56742896cc8f99088574264f857dc67cf04c4b63c6a08fc534229ca8ba616cd504f969ea6e3c98a517355f98a9e884062805b77623239074206e01ad2f3fc9fe9ff8254a5d3525c3b2f0a692803500c967a2e18511ef5b8845dc4b0dee9338c38c4b1b8b84ee63923250eb6f9e9c272617c7895bd538a6f34d3557812bbbfab2b8fa6eb5e95b9bce33ad3185cd90dd536a68639022c079b5ca7748864d37d45fa6780a45aa991f28bc0d3bf371ee2ff0c913cea6db38e4a278a4840ea1f255f8e83b6b6c5e260a49d727aa42095a88cb8120b51dafd764e690102f7fa07cea2eb86ac613e7be2f498f5767b622d04e8a6f272976fb058c3334cf8caad1d180e3456c210763c974e431cbc3e25ead8b9ff9243628d5b08d92cbf1d5df29a85b1a04d2999b3c669227b33610121d543cf4a978f8d9365c0ff8affa92b07fc8c8604a0f357f3c669445685b6a29898301a5afbe10ace8d64a47009c8741d7ce82e9900643900a3b92a26fe5f24886c06ae0918c3f2523c320699c799cbf72f0ddb08a0f1f63d6dc2f021c78a9d44503209190ee4be654663679cfd292292d71fc4ba6233a196ef9e95cb965852773404b2622b565bd91fca6747aaf7f4eaded7bd3bb53645381b687ae04b8d8a9bef1095eeb39a0beb4ea89badb4655a1afc7eecb7da0d670c192297cce0b31bbefebfe94c84603ba8c0b7cc73159ff59c01a037cf2c866dc40d88432cd6c2f1989351a4e41343cacf7bf2c2b395c863709d6ec1dbab2af514cc771df14df095dea8284be2b65097d8e6f72ef3936595384afc0026956e819f1657c901b92644e9d6d32d0d95549729b2cb3d5efac9c42a5f284abc3bf5cca5b08161b09d9a48ffb2996c3d4383d65b8d1f7fc3248cbe84b9c05464f4a76efa005fec342edd56959cd26cb0dae1b61b0493a4b68eb3d6335bbc280508f09d84e0c5f4ef520d92cd34d69e5bab76df5d2b72cb41a298d370ebeefcd6c1904b956458bda581efa6b3654be402ac3a971603f23f2b543c5beeda5f018543b72c146cf04680bcea31b4a238460329e2bc12f14c804fda3494c15452223d2477c9c8a497d04eaae7de09d7d7a879d3a5dba565ae1a38f15e69c18838c487c0fbad44a068c42efb7d3f5ef488f91c42f25ac564751f0efe0ece7d98bb1b3d0fc42c9756f4b8f9daf1fd0d414391155285c8daeaaf380bd07e43570f14e9a47a87bc733f1e676233f17bfb71aae464aed68487392d339ae064ae27bd57f8695f493ae56ca96c0615bda8da37133dd13c2b21da189a7329773fd8d51381bc118645440b28fa4f402ef84c4091d3a0bc4d206bdcf9007f5de9aa1e6cf7f6058ac6b69fbc703e908c4221f9065147766e48f54be4b076406e2f9ed19c1be982e636fd02dc26267c3ed989e6ad1cce62e7b988fa7c1831e5126111a4c3c29c38a1f96ccb3a04132175fa46f73c634ac6ec741b135645abf1dcea18571cf9a539f5cc935bc6d32beb1c7b8b3b5a141146ebc12dbbcc17bb4900cf0b95ebfaa52190afc6d8933cafc9", + "signing_randomness": "257dc9807e7f9b6bef97dfaf0f83be41ef3cf3a97ff5618ce44d1360ef2389f9", + "sha3_256_hash_of_signature": "b980855158ba656bced3493bdca0526e8e1fb6e9cbd7dc1c3828e1aea7c0186b" + }, + { + "key_generation_seed": "2a855572e7e2add2888022bdb585b61577a75a31aa8acede59acb27eeb2936ae", + "sha3_256_hash_of_verification_key": "119f6b378c059db0e2518766098bbe9b5176a840481bc11022eea73a99cf2a34", + "sha3_256_hash_of_signing_key": "3755ccfa04d3179cd44bb846959bbc80103914438a378dd109e377ad43c8ea2a", + "message": "954511394b9d10e1ba162861802a717e24ee42a346c9ed280c88e267a41ec09d6d73b6076e7e30257bf265b71a0b6e0cf408f02ba9078811be94d0f38559e9985463fc9671d182286cc4f18cabcaee1a3e5abdbc384fb27911168b54a387171c0524489fdf512e4d8d2f65050cfe7405d8df63a79c6e42a76f4538907eff4dc5870095241523f56fe8e389ebf1a1cc47ddb9f0188513d5259be257bda5be7381f22392cdc2406e0f2448a80f3824f2670f61920c667499de899f0f6b397381a2de66255e061ab92cd864de75c9db7cbab9fe76ac38e0ab3389530b4004055268b289b40d79b32e5ebcc74353510bd1627e2d5dd0be7d3dfd04138f6e3ee7526133dc70490612eaa5024be6fbefab24e1e83d8941a113d8b871f3dbc3011869174888cb7a265d7de9ab99b999c19af9b442ebdc904fedab52cf40b787aab35626417c5291f2eb892f43e698a8c65cbb6442a4832f33920fb2dbfc50b8e996fb227f2ff294c385a330957d2fada9f86839235ea79ecde6d9d94fbe7c79a38d40b9a8f241f53b921107ff1c72624c9600ec04dfa1160f1fa9e5d986a5a363e9ce8627276da73f5db47e4b90328884cfe93194cffa6fa680f77886e4a7a0fdaf13a7ddff6984b8855e1f58235babfd5106338fe2b075d4f10a9fb3d3c5f829b7c61b02b34e9bde6e62cbcc3ac9f467a6ca170eb43e632ebdbf6847f781e2469b4740fdb83da34ce34a286e3b363a72cbb13eb66ce1de35d8fd77dbedbf45c44dcd16e6b58a1699694d9006947c8c20810e85e3ebf8fb2c68b967743642d86556ab6958e545ab83ec24b96f2b4bb99cc8890c3c1e0fecce26ce09b6d99000694f870af9f642374ff0bbf61efc7cd5aaf5667fc3fe5745dfaf7f13fed70fe070ea4c09cb1a92d8b7f0dfd4b4a4b7dcf4ca6a97043bcef6346f1570f37b0eb48db8d15c8a82ed69b0c7833d6c830414c111c987471e84d2ceb5bd973dca34acd3a65d7b1a502368941935435b78b8f2b74c2bef127d96651247bdbe68eb7e466b9ea2a64a13c375103d7c8f7d30a13cbe184bd1ebb19f3274e645f5c7b82efdf09233d8ad146dc0715266963fd3cce6f8cdec20743bf1b7f57c101ac24c64d568923203e1a6af03a700f5a401ec4572bba528e284c151f1d108f7563858011fab32b3776cf2b910d7b21180dbe75742032791018258f4d1407c9a213755c5c91205352df919b6f14be056243df6ac2909e52c9a79f6917440667719185f1c5f1aaf40d873ba22956fa0bbad9c35360853333a10a0841d9d2e758a0b1bc187f6bbd31c41b74f9eeef1f7a28bdb7ac3d52fdc6fcb3ef0383a06a61188548963e552716d2bfbd6c2dcde496d06615e86a5cdb76a03bca2822aba85ec6807ebb6918ad2948d193ccf74f4bdaf7090cd4294c1785dcedb6b55886a848284a6a4a88a496800053e84a9f2dbf6b334aace11a5a540626716302e259a64c6316ed543806b3bbfe37563897e83bbefa570312df908c1786df0fcf55069edc336501a5ae9d4bf212d56a9cee811038656912238ae284575ef8de1285b763ae54adf44f91b6dd9e309b7a7a0ab71ec2e4611831b3ce1c9dc85cf907b52df7406b06367e7a43dece72dccc57d268820ea021c27056e3c6b50e7ba7a59b53539a6b7b06b35051e3151c23f3bd3c889b25d0ece1fd0df1aedf657fbb096ca1c861acb0158501ea1aefbf6dad11bdc325ac1ced3739a40b7a83458ef4f3453c0f6eabc1a48037809a90480df9dc4ff07daddc58df2733d49a4fa53c2a41e55a4a0167c6d33ba6e752aed3a125dfd6a0322cd235254505d7b3ced7a0dee7eb662acfd30f8b79d1a872998cbcf15cd86e26809e0d2da0324ddc90fd12caf9d8e4eda437fe4e658d47d67c95927c4b5dee965b940ce93e6743917296e10820a7101f8f633c93069e8b569f4625afd4ec61bfe4549fdd06c2290a91ac0fb40cb1f55dc8bc1fe695c73af603840ac0351f5256e00555c984e79a09e58c566d1a117b7e569beb5850fb491fd9b982442b55bdf53832aa65180dcddc2f768b1a1361994de8c25f3608ec853d5982e0afd1f9fa70170fc3589ddaf958dd840b4b502f8e2697d01ad7ac2233f6a16d540ef8d232887d2b4fa727ae2f038a69af3dae69eda8ef6bf1e0b67d811160b75231543ec5a4d0778b7b42fc1dd6732385aa4400450b3caeefdffcf147635cfa4aaa53de4ee3035bc40ce8670016384bb877a86a15b59f3df0c5d624d3d2b23ec46913618c745330a96c715c6f0bd096487e89b917384cc30b3d20a332f1b4056462227e98af9874ff1d18df2a6bf84ae822ee737f9e34ee8c69f23eeb9bf38ed056f499545f405759355c104284a6d08a9efad8fe28288b2084336a6479a6d42404f3e6ff3ad1dfc63c8aae971af11f2699f32f57ad29188492ce07bc1a271035b4d13a686efde5572353283a0f3138f6dc05cc35e5e5057c5c8b9e12b0164c0915adedf40a6e23848fa59adc0e65bdd2120486942f232315fc94b4676751a35aaed2828889864c4cb7dd95a662a475733c2ca8f6997a9c822c6c8b9dc95a8b4c367e613e97d3ec6d6ddc2f81022ec21b3a93244e3bc8c2737a7724a3cbd480b26819eeb2676fd383601d79fa266ed3f9bac2a98ff0109ad7e43e33e108d88c09ba82afcccfe98f50f789109d99dcd0a2c61947544f3666edc621b5d5ecb7088b2430a611bea52be7f5edfc6e2649f5e81f6df72fa9a748bff06af766a60d2b751b23a8aa95cbf733359f7c0cd19b1482a6e6572d1570349c688d78cf8b8c7dd37576dc47a193a2c2797d0af7504dee303823a8b77204ae7b6e91d431979798a7edf435056251d0e3f26b2ca16bfe3422cea0398d30f0a0dc06dc8a93d27d13650e5bfb6ba04c93faf0d7d06f99fe4f1f52a059fbe808179515fda48eca714f0947fe9a98f02d66fb0d80952411cdfceaef6aba16d92b8f1b82db151d7dcd7fb7781ec55f4a86c86011fbb9c5570ee76897e7803036e2fe3cdc2d5ea7a613897f3c69a6ea734e3811bfd15e90d7256a0c0c88ceb54ec6aac151b435cd2a870e4a02087c2b847c75b00b44bb3ca6d4404c3052bd308b8d5f595277592d26f6d5a2193cd4d650bf931fefb9deee61032b29ec0412f38e1cbe025b2891c59574c1450d9e3d8ef27940ef712143f06f38ddb86341a7fc781e0fa8971dad13aa7e93f1858c70a71a40164211ea9f6a41ae90d19032c2ea52c23375ce3c4e59599ecd6855213aea83f8dfc5cc70f58a62e4dca17c09705c0c099b29056592986c03cf5d67074735f2bea", + "signing_randomness": "a697aee697ed8142be668bdf28f92c4d653b3ca0100728c490ff6980ecd15308", + "sha3_256_hash_of_signature": "59f21ea708bf2ffc73c6f0f035cb372c357c0c3ce949ec107303e2db98d42e57" + }, + { + "key_generation_seed": "7967e9de70a7f95e69371f812c2fbf932cec07ab4c235ae9e8a6799f3f537d36", + "sha3_256_hash_of_verification_key": "0b0fc01fb7524f406f77f8e6b56ac55560fd9a8fd8150933993922458bd062a0", + "sha3_256_hash_of_signing_key": "6077226fc1bacf04a00ab75cbf8e60c9d2824702c9ffcb4474e9426fd1f66d68", + "message": "326a4fe723be9363acfc000705a10b6cd8a7b25e99a34b4a354cbd6f50550bed30f6c4208490b4194ab79b24b093fbe132c299df924f2ffcc2cdc6c2c9019eedf4b72d7f0817825bd787135927102e1da041e9a78b501b42dce777a79ace604e57df11775d7b87e75e5b00adac90d1add78cc5ad348c7472eec6e6e06f737e77115a9509a6ae6570f738dc2f21314a7ccb9d44add6e1434cdfe3614bc73a6b468f6691b60f4f2db103289a90c4fb2bf5aaf87826d2beb0880fa64e07e9bd30d4eda00d6bda01d1eb22bcf14ee797a859c9a0d9034e8c5316201af91388c47e1ddf061c9f45e067a5f60b355c98f8734559b8f1b82f47bd9cee0224a1d67d40706333523c34f3582b6c8cb47bf7d0e4fbc7d7cf3dbf21077e664fd59998338f4dd4a423c3a145ee1e994aacc1a48f81a7e9fe106008db93a6626b8c8505043ab864d93ae3972675e69c3825304086aa3419216ccae7f7d5117739e99d8f4a0b658148de33fdaaeb9967ef56677d2028c3b584c5cc1c096f4da16799408b2ee2fc3482ad2f49293cf4097a78492470099bdb90bcb4fe3b245ac8b3c53e05d7609e34770adcc147033a8fade81359ff63c3fb90c5a498c98b7a0e5ee9cf4d287759acda4bfa3965ca85e1d1c1019e7fe6d82e5e66a717f94890277e6db1eaa6f3291fe1bcd7d437094749ff5574b8728e0dc21a143a14e382937efb7ec1b0fb3f6f9c0f547f470e3b436dfc7986f923beaa89583d8978c433e0cb0c4e98516af1ac797c778662455a57fef45ba2c7865c1df5c502edb01c8cc729468091bb96be9da9c298528187867eee9a06141daa15f60cf719de2bd15010550b92a41f12d8f38b54692589aff51a9d5e6047a0d9b707369992251df31341a45b01b05ffed8adee5810824f903ea59f14fd500aedae797f8baeb470c0b14c4eda5c687e4848a85b30a8e8f59c45d4c9f0c65fccb15f4d4209a55722c29b6cb09aecb4e53fa3aa602c56ee3ba6900cc12889e7b87d5ef283af1586764519a30cf60833c82f0ed15e39a8bcad5c6aee9999e63d399c5cea10ae1f53b04858ef7896aa29fa541451fdb685734c39470250545193caf26c9891f7f965904ae10e8566bff9b2f465bbe13d6ea4a79586e68844b9fa68b2f992565c8b0ef5ffdeb5878cc12a0571ca3aea50add29dd06e13741a1ab215bf487be7735d1634332f47e037253054a21e0ad8d8f011334cb5951f833d4d344d632bcab7c373cb7dafe8f3d79e7e13bdb1c6cffa474a9fbb46f5736d55f3466534596ebd22b29107a8fa50c1d0e62f0533e343fee038fc0c3040a6df2d318bbc8420019b1b148d6d1dd2fe428c2fd617ca73f224ef9af9bf6f83cf1006616235471b69dd4eaf9f32529ef3e1dfe6765e61e246b519c702351c9cd66c57065ec78993d793b082e3685eb06f2530b07862277d339a52813c99ebe16c06c4c8f547d9705850e770982e8fa0275a52f430ff2422a115ece46a9202caa0195789532b1444f1507aab2e4303464e499989f21c7d881328f18dbc77d4b9b467cae244a93053c0321dfbf815da28b6ebf483eafbe634e9947bb5383fee3a31bc03a63fcdda5e3e46d5d3184718c348a83975728714351df43baf91787caca346dbb819602f18a4c4fe90c4ce307984bcded89cd2e4aeb66318c10d95afa5be53393feb981c21bb1411bb9c58818bcc141223d66ed5f35f90c05fd4848617220dd72f5e892292ce20aa9a0f9ad54022cbe94d2c86daf3fc66949ac35d8e122b02e2d155e73f4ce24d7e85a5c301dcc173ca8ec090af9dc7f443c983280dda27ed4b9bc71f86e84f7aee39e6a7e9bf5e43920aac858f0f49a06216d9d3984cd2e3575c0fa6ce8a5e28b0f481ccbaab450fabce8a1084ef458dbe257cf09d8116136c2cf1edfa6cce31aed0f1f8278c1c8d9c79846886d48e3fd311c015bf2373f7caa71aa26b011d0df5a843ab53d7e7f0466ccf49c5d4de872ca87b8895101ee0147a3dbd391beed75fc16f65814d56cb29273a5f4e5400fcabf85040505c31d001df0023726e9c1f7c29a37039fdda73b9b99acec3a029f7c0dd61ade7d5e835e1cd605aa8e583bf8dc99285e86cf91f4b4827a0e8956efde2b495a86f85e78b954341cf3afebe8db71c26b9b1ba27b47284aa84e55b1c2afee733ac596a10186d9ab504f33e34a06ca931d7633462b04b9b2b0d4751b0343503bcb2a1893d944fbdb4be63de167348a1588e6551fd9cf2101b0b4cb61422655fbeb50d64cb9e87a23007a39821ec3aba391485347624efc3dfda4a133c537d7cd8c3a549bb6bef9a52d2edf0a8892c6fc3eec3efc3c18741c85bf24cd3b36ca04ee77f654ed5595a0e4b9316ccfe4d2aa6b4a66b06f309337e363c9e39829c8838729f19811093dfbe962246473b7a19faedfdb0193f63eb85ef308cd3be5831f35ced36d9448d0ea8306044f78946079210cf89ff78104bcb2964ce2af9954d53885d7914e4ffa4ac7e9b3d103922fd1ad68c0a4592f885c5fee51d52214e17035e8681086203b79b5eb176679eb3263b44ea7287262dd84bb98f6639b9657ac04e397d69c634a0c1181eca485e467d62631ad2d9afd5ac5b86ed4005fdbb7404b65bbb826f1a2334a481b9cd46e0ce9c414a162e84368089f24149d7d05ea6adf40b25a708357aaa5a28801ff100f69252810188cfc6087507bb5bde1cd43bf72b1b3207ce4f7e65a18e5276613d4beddaf21af7b964ff69965c47cb03846f7ceddd2c5133080fc632a4f0b3495b2d2751727cf7681f28675552df2a0994e425a922bbfcf84189b8c9f43058d691db3166c596f6bc480efde06bdae7b9c2985a1f2f6441520620e193d7b94ab46dba2a1ade44e2b006734e6770f34b0e2122dd7f4eaf045164dea8c2fece7758630384c00a6b528a6ecf07045b2dc0281c936a540904733149bc65b0f57acd9a5e41c2adf83fd6a760b169beebf04644db1314270adf86d01cc2cd580c609e78bbcd9d2694a89f9cb6dd36b9aa2aa5581ff561b5417be2b52f3ef2581e461cb0690782f33862c52590643bece0a6141dc805d8f56c4f64c1bbc49a3ecf1e8827926796e5f9335df47da6d3e4c14795b547116fd1f3351fc55c28b543183fead8df7da4dfbcc38e224901ff7bd83b16631064cac4a37fa632f53f004374aa19861fdca515af91e66186ef804366d5a1b3b4faaa60a0c4b36b972a9579548b4cdace7eb85f1f68a4e4255fd994c1786975e7f6f0ba87d0295de72876bce37146a09edebc0164b9c4911ce41ef4d48130a27651bd0dc315fd622cb6d03759d35756806332658b5b33e768860c1946569aa45130486ad49b", + "signing_randomness": "b289f87e11a5321c883ce48f016495f83ccccafbf4b4d428aa043305ea04dea6", + "sha3_256_hash_of_signature": "600a7aa84a66a57c25afe9862949bda8a79d71ab163016e9ecd7488f1b08b943" + }, + { + "key_generation_seed": "5aba340a8e541568fbef49e77f94cfb4b3a5e9cf14c6755ce6412cf86cf62898", + "sha3_256_hash_of_verification_key": "3d471acb581e1f17770e77ee2aa6e8989b5521f529be62dfdeec50ee1642e943", + "sha3_256_hash_of_signing_key": "e32d723c6ba4ac288b9191020718cbd329b0420c0fd74893c4f44f3e718cc430", + "message": "efc63dd588a7230ce08efcfeea534f5a0eb005480ad1d169c386e476715238526e936fea7136e2d8aed60de31cc91dae4e764ce5f93624fa7f72b87562fb6ad8996b5e41fd478af0af8338a7fd9aa250efd2f2d20364e8a88a8642e8e38f38583abf8d3be97f14c3ede66ebf8ebc84385cae646cded8c5ce8f06910ba7fec05d828446d558d6fed766fba347da2e84da247c34266aa31c328804f4e3aaf6acbb0ad50feeccec00d20b3610785b9f1ba06a0badfb42a8f43de3f7bac36057ee0b4d2a15db040a8903f767f7352995c8fc3e06ed1b1322587eee5b31806192e04b09a7b433d08cb2a340942cb75c51e0f8409f907f69c5f8dc316a227942edf7a458974fda76c255ff4f1a85a352cd2cd2a21507e0f37451060d31d0847528b3ed5da3e7168cbd0302f1b03842e63b3dec6fb37357e37fc3cc26721f290726a47ab3d4dd8fd1778fe5133726c240e7b3e398f3d809c6c469680b9efd25dbe890d6936b76a52f97aef3f93872b76506a95685eecdcbce203400d182252471b99b7f4c6ced4cac8faca7682d0df07bc5904aae042479855098cbc41534f0ef17f38f1bc8c272cf72c1ac4a5564dd132130ee676e7d7ec3cabb4e85ac81945c87de08ec60ced3fa0ab3e83c18ae493a851434bfa2c4968b42acccf3609539c62a4e01f8bc159362e15ee91d8aa399d8bd8d67ba1e8fd646eebb4583812293406b05ba5be2b1df9620e6fe3daf8cebd9652bb04494b899f407c7d9ed1c4e77ffade24abe56ad597bd438928e05b0363d6d2685d34d6b51d71012844415c46f13181b146a3af25ae4e8853cc7c7ef6387306c45180a6ef9e97abe1e7d5e10115752c3071b6a213367e8b1a3d1c3703cc1840735315623901d772c61d55ef8c47db10f0eb7582d7a043018dc1363e93f315dd984b8002ea7bf5bed38d3f273276ca577cf99a635cb6ed9d6525520793405be27c86e6effeabb1e5f84a0076bd151cafc59853424de4b3460c673b0820d76e15ee47b6505d2d5c179db92a44042f3631c646d350ea9721b8984660a76018dca5c6bb1223cd03cc844dc9371d32549d9d645f75d2683fdad1df6434bbe43200e506ed2a815fab511172c70f99a85fa3970433e8955b2f9389f23c10141b5779a23b8671eae8b91991b78f635fbe8e627d3e79d91fd1e6e90699640ba3ae8d7e4cf5145f1259cc76ae50b1fa150d8338a9450a5b6b90eec9c94318bc78c9c7715a3eb215aee6443540d211a0556813529023e5a581623cd6d19bef0705a5f69aad4833a57c308144e92899ac5683147cdbd279d5c3a55bbc5e8f8e26a158a3e42f8c5b858909b024b4ba4069e26de66460ff4a7dc92bd54ac244007b6ac6ce07a31a2af3323cb55f07b8f480d279308fe10f2ddb001da6c4aa132b988ad03fb63e0eb06544571f5505cf377a81153d6fbd4fa2b7562074cfaf587ccf28dac84afa58809c0b296e0d2594d3582c28596f5af7500e143be7b49c63d04f49bbfbdf60b024daba5533f945ba90659758e06984921efeef79604059eb808c9fe1bf9bc5351a406fbba7f5d8fc9f891488e537db14b216a0535c9ff7bf8d5c68a2453a8a48e58fa7bf6eb76448d6d0bd05bd4628c4b852a236a11bec0f67118f1267ca42647f6f2303509094c9a7f3a07b2724abd2d9b56b71fa7ac6cdde456ec209be76c419855a5151ec9ebf0e0cf1b86f4e8e81b8173960f8d1c8affed1ac7b818af8e3bc092e2b209d693e80b11ec7da39ca93223e1b47c6127e8ad40a78bdb0ecbfa1f39c84cb9ecdf960abb39884627bc4105c53ee7bca4802b92af60241420cbb36c407f46cc2e953d7e3503cc82287a8d68d0e673e212173d80a12257add5256652188c00590dadcfb7dbb6b35507b853ea5fad4f52e02230cb3d3bbdfc43eb74780583e8dbb851e0257117f4a39a6676586216220c1ca21de16cdfe6e1cc99ea7c989916ad2fed4a8373cfcff02207529bffcb7b7601317450bf430bac9ce111b0fba8d7de6627f863078d8e6286b2d34856426ea90ffd58705444d0dc12d4feead0ffe543811e1ef306f40939922563832d06e6dea7109087ac051a361ea9e755856fd4e51388bc7c40c63e0953c8413ab0cbff70c466e15de5b089d095e8ee8a64e929d26ca3b71ef0b2360aecdfa89284cce08c666f4e0146362f0bb84b87a49fcf2324ebb96dd941f00e2586f7246436eb66b1e04af84482d8ecd2bc8ef9955cbec62afdd754a7f235c7f3c41cd0b36a9024d426b7388d3c33a5a6e858846c0fb0d88ba5798c923f9b43d14a6661c65092d5c5ec0f97d84784fa336ae6ef57c7a5d04804b96d19849ff9074724a5faca538e32c6efaa5209317543159272ce50454fe1e7d068c8f5ff3797a66d5f87758627ab5d40ebe1fb7ce9d69287ae7a5f349a5daabd8a8e7778baa26da0eb237034a3366448280237a165cbb303be6b33c0f11c1e56c50a84384a0f6878f2a99b14cd3b6820abd27d2011e0c37f8439bede65747038a5ff7f00daeda094331523cdb7e10f1063b64a584d3e9f0655268f89dbef3ea3fa4c6e54feebf8f0046c6c811f0767cf6fcc9b3497db05582774047a8dcff6a0c1b5188076e64a9d5693195075f2a05e507a5a523eee4537079f9e5e79210e4af056d6624d45a0eba553ca9bc92171451970102cab57dcd89acebbd7025008325c61145264f42e4d14a76e5c2f1c129d4c054da00501081617d1a27012a6e160750dba73becb5dc05105bfde1f1d0cdc837355844b291b09015fd610628513c1c86ead373730b99fcd4a552fba07163ce9cf6a3d3ac0525593f0648256e8b33fbcf92af58ce26d0f036e11230879dbb789507bceefd2960ea320236a224ea74dd2aaac541664fa3ea9430d4fb09c878169a8af1e7fd4be5e7926cb0b6a352b25f452454474107286edaa145c0a0573361522eacb618dd9c8b32bd1a8a5923f4c698cca0139dc640c1d5d557ce889bb69ce32d85853dfbb0f34da2cf18cc79472906b67f6bacbf287f31de0b9e7a01a356ec9b64653cb922501ea1eda940089ba0f293b667f482e92438805cd6851776cea0920cdefc4062c9b4e51f5aa1d7ff909cc2608b6f28ccf28d574bf67ce80d4ddcce28f2ade0162cb66894b5b2da0eb975cd95ee7fe72fda2736616c8b571fac94bf8c64acd1642d9431118f08a62328d99b2b9d90bbc915db764c4935951a59c369c72060cd9f4273bdca0c295294008c0ac3a149e8ca5e8bf21042f5f21c067147f3bb52b13975026a9df7246afb1d053670982ab316509f2850342913e1322758ed89da02dd79126726b1c5566c1831ccb1d62b3e271875e62cde0df0715d404f95f580b63923f362d416f83fe5ad98eed584717fbc2cb7d1b00101200f4eb4ca5", + "signing_randomness": "72560d4af60a2d3f9f644d3d90b2cf16bfbe93708b9aaba4d5180c1f10ad9679", + "sha3_256_hash_of_signature": "9969aaf80132a179bad69c81b3c634940dbdd567aa424757301497dee49f56ab" + }, + { + "key_generation_seed": "df4853f482cc1d0b3a2d71e9eaca064e57c5d100df79bd004ba81b43eacec401", + "sha3_256_hash_of_verification_key": "9be5c8f2726f6b6c2a153ddad515e43dc434056e15bc5e2c117363c1bfc8b708", + "sha3_256_hash_of_signing_key": "dfd5354cc3a46f56085094c61e6b5a84b3154725bce0dd2738263e795e94182e", + "message": "acb414eb55ae5e49107bd0ac5975544f83104f7264495ae0bf0a6d9594c422c16b99469eccdfe8b8000875b469309891ea42586a615d146de64fe59277a61631b2c7f7379cd52fab3871bade120ee9558d1479a91925634578cf14d35df3b5672f8b5f9f956fa9f7489d6e37e207fe556017736f6b147a8cf664d0e0521d94737e18188a1b7c30296ccc9067e7b55d6e0f2fbd875f42fefecac49510e324968b07372deb10a31c585457e0c48879ce44bc78898ecefac7bcee90d0f8925df2b52d5ac81692e0160f8fd5808645498428260f592e29bb90fcb07d0424ec79fb081840cb827caa4a9d562183d10ee41d281e26ce3ec0069c83e1e446ef82e2e30debe3f409e0a9e6d1550e224db15dbdda44341e4ed6f8b8984716ca87233197528547d090058607ca141424a13145f1e896555288c5e2877ab3b51c7f9248d2d56a8521975bc4eae3d009988cbd73c66931bada0725fb8a3448d43e0c7364e9494fc4e295a700e79972e1ffd626d1cbe0199917851638b192ef9f5c03223f2bbd67eb59a5e8baec3db40616938274201dea1ae640f6ee7e047cc4c13f80dc65e3fcb5c62386015f4ef1bfec561e121f9bfa9b2075bc1c4730503fdd5debce8a535eca01b9d5b021c290854b5f3d49effb263dda34c4e96aeae9e71a686c009b205994b46cfdf1f76727ca67d415b9d21d54312cdc6a8ed0aeab96b580d0b419e2058e5d843c17c96d156549962f81c266233ed2b795fac40b1992b626457f211f08106ad86f5702b9deb9323a0970ad86125eca836e0a3d6ccbc380d474049bd96ea246b8bd9542793a66e15b319aece6bee17adbba7db337d25f8f642774030a2ff969cb5671f59901cb109e661e55fd5e75eb2a96dc37fec76a82eb89d020b4916271cfb0cb3342494fdb62ea0d253fb8ff2e91357b33d96d41530b8b5e9550fe9b3f9f34fd5a2a1a6a8beb93ccc322622f3b5e8487de19af57cbd1481ace02779ad928b17a9b05cbeb722c783b088b5912c2d67ce5073f1801c23170deb1eb6ddffc4c33dd25f94f4fbe59d704e478fb49dd2142801c37ed8f539ec1782ebd2f3253bbe19c5a048b9ef41824a811119f3a6ad2a0d4b77338e001358c61a9794572b0c46eb1e0e575d4da141a415829ba8712b791b625b1b0ea840ee745d9ffe1e99efd782ba25859351f443654995102cbefad7e59d03c9a502ed7b77144d0566e4bfac086a7dea356cb9e5ac02dbf7e81d6ceed4a33da8d801d61bab5c01f259ee3a99ff7f6d7bf8f2160c4bc3f890736074b000c4c58fa4615880f93fad43d5657c76045d7c414e6b85f63aac91f04a616184e04ff9aad513ba767215fb0331a369d36c0ae9b1ec1268f1d0b43c42b786db23dd66465b3af17ffc68c67964c2fc9e41eabc45db68cd2c3d95b8bec787d994bb8e9cf1dd7d4c563fca5d80b3f1fe8e3c7bfb7d171f5b9023bfbcc0cf4371b63c856edbda154b4313c47983f4027f9e61e86da1e8cd787e3e6b50e1dfc9201b9ab92059f8b6d1bf7856cd55c5b1d6c4e6ebf818d481c56f66c79444f5a6544a64a7d78ead33eb805a6ac4310cd46a2331e707b9b0950ca12092402d68c1cc5c3f269dfdb13ab34b97eab50b0745be72bb0fd2d73bea5dd37802393b635e42a0def8544a96e7f40a8d9d06b64e38dc406bd59ac5c4e218591d20b8dba2125978096517ec5c03f9bc6f96cb255e216ef82d7c7c873029f9e1d98ebc0d8e1312b84b8d02e8d680aa56a506c8668b5b9c56d04cf68e37c7cb1b9377c867240cd42fc7fbde0ac44e3dccfd3f877c9923ae9cece0cbdab00ca530f434a33f1c939fb88adef4d12acbd8b2b5a139a3fb776d8223a9846465c0372b8c3233fb5280e936bbe9fd49058961463a4419d939f4f1fea705eb63114f0a3533638dc4d3efd620147770ad877e2354299cec6e5c18924e78dd661697adf89a77c7365522d3e8fc0855187139f7e43e9a0629ee321b2cbd9f007b05c22eff56fe48045686b36c5bac2267f37a2e3d4e03e19b1e422acea31c2e9f3e7541976d4e2fa03119df9c4cc2d5418f0fc7a467cd98e290695b9530b91d5df8c626c7236a5c0fba73578b9a47491ca0ad26a144b0f23ec23d2c5b2daa03bf40130f14b9a427cdff1f232c9cf02426228c570cf1fa7c00a773bc0d70858588542bbf8f581540870897bfac8387cbba3416a846cf9f4f5d3f9dcedd080cc0de9f71b93828b835430898e82896cd3f30fe2af8349db294fb2a8ffc0848692a0b9e8a66ebbfc0f896f8d03e3c6a0c27e0f2177b85a2f6fe31e8aaf14ea5c1fdc54e80cde47ae27a161264680107023cffa961e913c4e6af96c0be37ad859c334cdb8bbeecb5443662739d027ef1b9535a5a46e2169933e419454025623fd6779f54c622ef81ab9289b50758ea34f868ec85aee589b08962b85cf537bc733f62aafa95fd81a60d5c2e38d6ea0df7d1390bc5050e2463e3e2e3a769de2a94abdedfa0ed67cc0ffafc5a05a3b0fd37bbe6967bed8debf02a42cdc80bdc62158e184fdb6672f7947505e2c0a6c7762b1145c4baf30e3d32434d22707044dc99d2cf2d38f15c43abc8632382bbbc9e0f106565906f7d4948d30fb19edcc3748100397f71e1548e58a5a01876d0a12dcc80000224221c4abd98a5022506d24bf4d9b9108991ad3421d4ab9cc393dcb8d744f97822f95cbb2640e73e401f044fe20253acb8b32a75feda640e190454bab695a23b14ae3ef60b00491ab22f622daa89b6b2e6d18e735672fe0eb2de269e4e386c926e23b865e1ba22dda688293de144102f7030fde6df653e4106c08c2467ad7c54d1df0dc5981004876c6baa8720f70942700a154a376c8d45dae1be74910148ee3f2733e591e1965fe763b58c8b28af25e9b3c633abd83f1c0a4f68da2e0b85083bf97d4e919340c0437a604416c4f629b33039bbf2a1f561548321780411d2e8ac0edae76fc3a19f3c84c3be902a1e84fdf69b11a12dc8b78ef257b5fbb5d923ffd548451a52c6a3af31c70266ae8a957b2bd72a51a034a2921b8e19321108ac303b0d2e269d032c3db13f21d558c82ba4158962f2210e1c5fdd96c98d6639aa844f34e40c1b9c909cc6af1e97a8dc83b78c72b30b7ae400f44ca60af37770b3d9147f7d6f5a327f34df7cb8891e71d41d723cb18e0dd324e5cd22ae0d9f2b1d2bfced0288b7aa73af4fe0a8181ba1aa7eae966d0a240e10fe5735d98326a106d16dc49f3fdb19d3a8449c56a74153655600e4c9e38d302c6d4080017d93c628388df94860329baa289efa4587f079c6f03fa03c54540a0ab4b067ee46a5a346f2fbbff6570ed0166a55c258eabd62ad90f060fade84e8fac799f7928285f58557a72e055b535d00bd9a4880d10c05c07cfe7a6feadfcded880521803e339f6eae3ff28a0a471a003358f952320f41a0aef9d28", + "signing_randomness": "d69ab8dc675f01cda87b86f4b9b0371ceb1f1e861100d21bd22186263d4e0e6e", + "sha3_256_hash_of_signature": "c7cf5536a12c589d5b5167ec46035c8f5e7ce964b70016a8d7e5b6c8b316f144" + }, + { + "key_generation_seed": "95da16b844baf559c2cd6e68b237614bb9927d90811106347b5849fee2f48640", + "sha3_256_hash_of_verification_key": "25b6446489933a2aa15253ca8c7d37a4c8bb01200bc62be6b6b51ad4efad4114", + "sha3_256_hash_of_signing_key": "eccf27cd2a8ccae849fff9b3654353f13d214403dbf74e020386dc2bd7dc38f6", + "message": "5f7522ce6bd0ce6321c27b9eaa6f572616201f283c5ec171d0ba47662c2320897805e1551ed438f3fcbdaf9de6f3a19dc16fe9c167a65b6e52bcf512c919561b548496a4a80af7ce25458a62eae92ebf677872482d8647c30c12bb1f080c6b9a56560d64fab73db17487bbb007c66661ea9dda14601ab27a100ef4cf4b7447e51418651c03211f8fb884be91f3980fe13e00ea4ecfe6d54882059a436c90bcad80e4101cc6c0754417545f2d167629f80a3c5ffe45c00ab2baf0494d6c065872b03a987a5ee818b3ef11e47fe1747f49e2db6a14410f0b1f9610a2d6114395ef6ebb231fdf71d595cc1171db9c89d6cf202e42d4fb968ab8105fddb2aacb15fab8014b534cf468d77ecde2072623b7002620b7ac3e78b62ad673feef9f8e97e91acdab171fd415b2d15605dde00d074a770e36f2218f7130f13e91fa4c88deea7e854bcaa01b8458d40625a33e982f0955b83080a926ec240e31f0d9bf477ee3a016e146a3909683410d4d09ecdf32eaef580402f0d416dfc082cf1362e8b79158bd57739aee56dc41a549e534c7ccf3620c7d7d95b92994a747d5efb8ec43cfa8189baa9b75fd54694e512fca388b71a5b9ea591ae9cfa34183de59d284ab16b2effa4b26a24a0e615b38b83088a9827eeb5c29b419bc061b033e0e3fc809afdd3de948412677e0bb5136854532639f3ccb176d54ea1961b5c527ef66f4b3286a583e86208aeeb8ed07d9e6bf1beb33995f76ca480039a6130775895f19e3cd4873abe3bf2fa9de81bf0cb04575dd6ae282720b152cf0ec6a4a04016db0f3543d8272ae56b1152b02eaf22131420cb194021f97060d5ce52eb21b57cc93964dd21344786e3888617152d2abd829799ce47d20158aa93f7da85ca6146c5bb94b512da053c35bfa8840ca43f6509a1477603fd50f5e4f9a7cf8d2369156989ad638d35d345bdc859c52688211bf7ef3f4ad4944657289406bf01dcbb49d560a11840ef35dbc0c7f9c96dbea76300cf61997a87d70f5ff8c51aeca2cf0680b6fe8c4025e1e25b62103d248cdee335f4fcd67597103362003206c507970ea6d78cff4b68b44244019152dbf812675cf667e5e13c8596eb6fea3903bfb25ed08f902722a37f8e460e37a03a2d6adbdf79da20052de658390484b83bbab28d039a303d7376bf555181680b7966c798a1c6cb215257e37739de7b9706cd1cf3ab031f68c82d6ecfa507c104115040744d74a40c49245215639d0cf4a5a7a10098e9ce3564ac3c44f0683ae9d3094784d354db1af439bddf63d5cca668d8180264efeceeac0be1b8e1c6418e45f9ed6c779ecf169143b034cd9f332989d445c83a8786398c507b9171b4d95728575539cbb29c5b804268d88f2b39af1f9572b8daa9feeef69c4a77dc64bf2dbb5e57f8b33ab151769b2d00010d67a2d6f188d6d5b35e5e1873fe2b327e42afb8885a842d26c246f7c18e6bcdd6fa49b300c65a3822121e95004928104017cbce2ab95acadb9802bf4bb049b8e96468353d649654c6f69d774380a5a387d6414dc3000540bab6eccbaa088c1068ccef20036e5c8342fd512f55e6794bf85fe15721d99a1bfeedc218617a940c8c25d4dfafec677d2a719b2cddcd302294b7fa41aeab5606f859cc0d638ac94b99ac3ea48c687d278eebeb396dc5bf2d2e89e880f76b533fa54efd30d8ee38b34dc5f8ae62c637e9a7e85d99e011f62d261ab4d3dceb98a8972d3482cf817eff476b873ac56963bd60183b359713385ba82f6e24be2d6cfea6dbb4ad2e1b5b790ee54d23f64e740502e887629b346fc8fccc3338d0f2921131b84590b32c7cb82cba8bb3b81ef7bc5cb12f0aa0b3c6a5b2878dc4f868057c68460c71d40d4263ac5c8b8317d2d0b63403c7549439a9ef227268372ec3a54cf8ee97714bc4b55007f92b1a32238659ec1ee27d6f2987ab06fee84c3afdfa73240963f076a955bf3c19410e1da6a19b3ea3ae2dd8766082d3295d35436597783dafdadb905465d05fc21fa8ac2737a52fa8aaefbd2ed83f12545c1fa3198ff225d37070694c9392738e89467edb2da3cd1734ce398e32bcb1fea2e4fe1260a2d9f9edc3607a8ac8a51d5da36e99b31903025e0cb157fd2ff5b51c9191cc16a9ccb870b4060cfb0fd900aef62738a58c5726f5164417f084ef14fc0953e3c6036b818c21ca3476b8cc5f8ebaace257a0315031a03e64e7f749b9df99bb56ceebbaa4333bc7270edee90fa2715bddc38d44898a41998b2374b6ee3b8524d3a385c03868ee9479355092c4d20ec32deb51497f4ff34ae7e7ea4828c288f46e5148de28a8c660ee132e5b5489833dc66205ec968b60dab96c2a4452a7019bba9fe3d19d5829129e2a9c75c39416ac8695145f2b62eb9468198cbd48d7670ddc6af2f99f77e7acd01a34ea8e0e974206fbc22656867d09807b980563e06a559b0c3a7e6f43cf8db75b18c0f90c12ff3bd43abce7df75d17e631c08c974322010648fe2e2bc940e6510fb8835df8384eff3fe6a264687256c6bc0a5f9d2ddf208171db55c4446b03cf27796bc77e3c68d8f1252be21877d7c53747404420302ca5ae1ab57e43b158be8b707360a2f59d6a473f98b816fde2ccedd92385202c419278e8b840dba4c05e9bb65f68ae2a635a29110329e8c0c02f6fb5eee41ed225051ee975f92da52f93eb1fd7c0a098f6d1421701537298651313514ad31cb333e9c5da719bba95e73878ba41f9e2512862a80602aa2de1e1d086576531330cc7bb8f0cec38050b3cfae5c8b1d6cb849a579f2294f8ce80fde5405bfa3e6ecb01d5117203a4523591ac4030397de9ff81d5cc91af3002590f5854e852b88667638b2d052f2a7852425c8ec026e48d9ef5e73d1993d7f3fd7f704760562c36d2278c9ce131ec6aa444d7b2eaca3ee888d9b2ae122688dcb35455e7de31562ba618f1183308b30d07a5c34020546218101ad42ac5054d4703587ff60e860a60375fab12734912058d5b0b06430fabbfe0c0b43c22814f56dae9e2713325a31c682c13f008b9a3d4ffa8a454f0f64a9213ff2d557a4cbc64ec6e4eca0a976cd9f27497ba544dbaa3e2eca0f54c2634c719b9c3a2ce37bcc8158a880baa72780f8b1d3494f589e2af3044b4fdd86f4db2df0843ebd9f3518870f55488f41e234ce94e907a69d28bd83347702750db1ae2eb1454cdca37a8b5fc90091f548babf489e57c8919646e977274fc972088a522fff9f9306d2f0ed6c01ff92cae8440d7f3526b8c186d5b96942cb08032886051da2a9fe77e38beb18f4fb25f1152edf9d61347a00a844929976a327be46ffd3e2ee0b6ab1014294ec5d40cf7071c36b11127ff90720596c1b3065e7de8010aea469bb4f4ac5a6efd20591cefb7b94b2006d85ca475fee556f24cc41237c631b75eb594f8342deb4f976d73aa46563c1aa6d0b605a16152315626ba08807daa6025cf62b29176f3a85e4bca483effea7e5939", + "signing_randomness": "88dfff7851225e63b200f8ca04c7df429f671c2f1799907ec4e04f6aa295fa75", + "sha3_256_hash_of_signature": "1478c68fd58bcfae8c7c8ae46df04012cd6b10d7d04976f0456e44f0cd768839" + }, + { + "key_generation_seed": "f258ff1178cc42a3cebe238c8418b4974812a05f43b8fa95639cc46bc0738bc5", + "sha3_256_hash_of_verification_key": "9925bb9d1279b601b101c29d30d7e2132851746fd10b953d9f2a7ec272d7c17b", + "sha3_256_hash_of_signing_key": "55d1fcc43d214c0300c4a43127cc1815e33e72d63089db82b0604d1d281ac97b", + "message": "9ffa507328b2129c9f05a22b81a597fd1b8c27d554b36fd3eb150bc5fa0c6ed967ec5be6f1e52d3bed1508dc3c841360020cfc2ca1b0713076251f2935efa8500573cb4634c78a1d0f87d994e8e2b0bd265a877023b54d9a33282c12397dc74caab07ac2efd140df907651bcd1b37cab2d03f77cc28872291f1cb28fd4bbb5331c2a18e02120bfd2d9ec0c8938a6d43681dc03527fc2bf59703b5160d8e25d08534eb5aa5cc9c10572257d9e4db29235683bfe1776a2d9edacfba1adaf66587bc451d32c524c7934556f94776f91cdda96d2e5caf91a39503d3a742dc5a0efef7c1a13666e200c5e3fd7652d200adef51fc5136281570b7832e0c6e7552972e43291f202e6f916c916dc3fa48858f3d92b1b7efd42de140d43648aedd7c7379d7a4b71751a3348b6bba3b0db71b4c99c41e085e5536a3f0d2bddaa88069249e21e2d9906191bbb5c8b45353de72e00270431847aeb4ff6230cebd1969a0fb68d6e302b78da39adf6c0e681117c8432e24820b9ebf38838545e95cf7aefcf1e9436cf48e87b6c5181cb418132c7bc050b9498720d7d534792e0585f05da2735b7e68fe35dec358da1bf1681f7f62329bedfea3d12bfb26ad9403f3ac1db96d828050f39dce4017b45c5dae4d7de9e9f687a9d7fad1ae0e7197184142f6818a63d5617be9d8d82334a12e68f2eef88a0da3a915de63629550d8a64df591eecdbd1b89eb40ae9f9d65815271693c85f2ca41bf45e4fa16ef8b17d945ec61e757c6c609d8afaee32b3ca628842db255b619f6562e656f6125fb27195ec82fbeb9c14330dab649cdb74f523f5a98244194581503356b5b7ec51e2b35ae889452d3457ead713c0715aa7382dcc510b16e771b3a5a91949faf5e29223c8f1f861bc3b4e77e095bb61aba00eb29c065d6f9da9b4413d61b2202547fb6e34671930ebcdce4c541b3e2dc90073867a47197e08c96f74ed81de5f10c37c062e8d82364d67eb185cd098cac1bc3c522e4fabdf2fbefb66b9ec6e848f732a737fa7b935ef2848c29b1fb94044996eef006e251bceb5be356f286f0fc85e5cba627b67398cbfd6c0f520c6f896353fe75ba323d8ecd9d3ed2997580e7e1e49eecd91982c5da650d6b128068b8d3d72c1ec4bf1fbf121ba96e1cf5f247f9fda7018cb609329b1c95e59e112c393c45ef7138905902227cd21a39ce30397ff017495bc98a968fb497e03de5843e64923683f2e402da63cc25ad0ba13b85e3e379b08deb39542c06a268bbf44990447190a1f8adf0d3ed9ed9917886210864cad84e7c4d1282c4d3bff9dc23e4fa68ef6b0480e76459d1b5e0a7cc0cfc17f59531c4c1cb1d416b7d009ab50173f706289dbb68201c305e39fefad87929ef933006598ce0f0242a2c60955ae487115b4c367a7e49488491a6f044fa8b7afd81f6da09d29d4befe1b3c9eafda4f17d22eaae0b2d1646906d1cee65614640b53479e23831c56ebe12b92997d5fea725d78ca75f4509eebd3df4f741d6b2770521be2ae63ca365fe1518cfdcd5088d58cdfb8d3dba76731f74760a47c9d619a31b7e318e957194ac5acc6867cf8c9c235043d5c09240f346fea840ae0bb16094883fc801da0befac64a021f6f871413249e9c7f5cca92f4eab5713b0f2cd6c950f34ba6fb1cfaad541bd5faea45ea5fb37258301a49d7bc4657e3e986d707213c0f836b030c21593f11518eae3a8a95a2efc8b9839e79cd8cb0e6de59d5a43ff8f81fd35392f0c0659b7679542136782d559897fbcc0129c22f43a30cfb27e899a8ca52453f5459a281d0cc21f902403a596c7f69cbf9a64d97b935ab384fbea5851d831e8420066826d7e11e34047d18cf08283be8f29a8a79b0f477c27bc41b8ea4aa010ecf8ece0d37389ff13e235a4526070f96f415d41af2e053fd4440ddffd69799456e7335cc6d9f4370008803f7babb6c58b6996dc5a52649e25463b5267c188e2dc39b3258636ed8689e5c02e00574988b3af881d30e9eb38ac51c1e00e1c0a411ecf37e314276221d7d8713f7a449e38371854ea26520addb58082287faa1f77fc04095499a3c3a331a38852a287b24040c1ccc054086964fb1ee2b328f3de21a986507cd20b4de4898dfd15045324b93fdf85e5392de0f32c3badd04784012e97cb9ba19472b0c20eb0a71c89149ebb601abaa4a853f2c75dd2622235ac30d97b9d7b1216089b9cc8e879660e40ebcd15203404a8decadc42114715f4d8a6a10511bacc4ddc23520445a95fa3945bc95878bff18728e64de8b7767cfbbaa21f3ef2d92f3d7dfda792bbe4e5b3381077658bfbef8db95b64f9f2a44917b38df6f9391118978544369c882b218e7a7a31afc3eb9a75a28095c4478dc81f9cfa127bb749cc53898409365170823d65a0b46bcfba0e47cc0c5f6ecbee09131f134edd254f4f58b50c486dada13195b1a35739420a45be6558401f64c3b6ac94b73397925c20545621c7ecdc7da9f71a755f84d27f2c6d8415d37f2bf1966a76845216e41764ab96dc2e14c12df3684f7683fdaf5ec771db7050f81a4b3e516c7d5c955201a18f436962476c1284531764a9397e0edbffa8c3699929daeaf968b4524bd98ee62f9a0db9cbf99fda80cc6c57a5ee1099b1eb29799a5b5bf5593cda26ce2c66dea3d40545465c1d21f5b9373556b9ed0ae30e90b836003ca83f78e29bd8d49550286dc2de6407860e9a9cc5eaf3e1b1c73fc2d248b81b1cc8f59dabfb5daade6f2a0b38e76d9e6d0125955d08de7f334a56a8f362cc5d883d56bf7babae6d9e425376d34a05ab863a0d9adf7c6fda574fa8dc60965e021532c25ed4d568412d4143fbf2c4ec2f230d08337a4e546e01f7c1bff4c97f2f27af400caa57bcf398aa5bffe155b0f29a085d5053dfbedc3423818de8fc597eeab2c1663d8c81c71cb876f73ac854286063a2e8bd8614d06b80f3bf56381179342143f4c89b8cefe9168b6a96f416dc617b9f544f9df65ca6f4f7a84a327909666b70cffe889c86aca706a0a1365e248d6b341a004a27d4ee344f03ce6e85d3573e272d48210df7c3178efb7bfbef7765d24754673c9eec14c7513fd8de6386b0829ef0980b826ec9c77c81d1e3b8caa65992db9c2f8dd691c520fa6f233afaaedbf287a57a9a66d2330f4636f02ea3148c4bcd2c8b114d48a1027fb3bd5008d732c427adedec9969aead451e166954fdc207c1a4ec409cac60e42383385187af44f136f91a8461e62eafe6fcadd1e491162e46cfbbadddb72e5b54b7c655cb9489e7f4f7e55c93d3ad50cf84e1f47a706fedf818a5246bc755d6d18ef18702f5a90ce51812a67227c5e5a051133576e9ebc18afa18c1b05c854d343727b25bb10e3b9a3645d789287858fa43734d66ad831e8646fe604286544238dc99acfe3c8285230fc784bb73360f72ed34795b1c46edbe32a346bfa7f534b500c6c9d3ec26ad7ed20d1500e3dedf141df3c2f92e981472f0010a48f25429329ae92cbbb918246f5a53212703c75dfa15d014801a830deb75baa36", + "signing_randomness": "865525fe521f48e2591933a56a03988713ee151a81f6952d4640cfec738a74b5", + "sha3_256_hash_of_signature": "d601c59a38fea7cad04198c40dabeea73c0b96f951e78cf23465e00baa61825f" + }, + { + "key_generation_seed": "5efbbbe99cf5c2b6830fb8e990250be308e662200526889ea973c8d33823ec19", + "sha3_256_hash_of_verification_key": "e4f96f7d31245e1b2383fc83145cee8e54df2e266e8cf65b6922dd7cffff7c92", + "sha3_256_hash_of_signing_key": "74e16a6ff8cdaa8f543b7a617332ebc0bd2a3b9b74fdf0e74e821ff9ba8c5b48", + "message": "e7e845902e852b331ef9923416e492c1641236e4e72408d800fd70774ba32b6b4be04b6e82237a247d26f9a33afc4745c16ce0554774c68b33cfc6e67ae34e42038fc6c324972642338daea75982c71720f1ec9542df94b38434da34a2003fabd9daea1950b7751da6c81aff7d03390f5d63455d417f5d12a510337a16197ebaf921b6a7a9a9a58f9696418eced6b27cb8efc8ecbd9b68714f721561af8553a0d84e30e009a8985d011cb994eeaaf88c76f7f3261b47fc174155c138db2eadb09a06073b211fc0d27113e8fea0da56e181cf532ba8207f5d80d6a30d8bacba540d49a81a0763a0467dba7883766ed6358e809261aa3d8b757c839b532f272c5767671a3a8bf3391b14f5e97bf2668a4e98847f1abfa21e2370870ddf24504f89b3db71e210c46d66ea7296d65c926e2c955d899ac830cd9d06808a68e9b3722b86e878cf21a5e5d41d7f3cd95d23a6344c259859735ae1a953ade13ca103692b33af90ed0345c7b038d938f8f494d90cbd3933b2a80fedc2be57960db23ad018bac63017a04fcc510553226cd86c74ab90e13c72a1be12e4d751dc670a98ec4f81e9f8954a693fc7175ba7e50d340ff7f15d568d0abded0bb1fc557b1e55971b4c4ce8cc1b4d9e239c73b1133c9e1672dee36a2d9527f315c21764648643d866b0e2ab6d2dee61d838bc5dac183fc511c4501b6e535ecc54f3edad6e8edbf0de7cb70bee861b2bff0d41bb87ffc0ebcaee9a6dfb98d31d35cfb6dc0442fc285ad0879e7b218b6e66453fe04207fe814c5f72e49406b48fcb1db145753dc2a2d3e9793594f7ef1a1a6339619e1040cde605648234a51b2f6774b31c7f9a77c2ce3b98819132bb725d288c65901f7001e05fe5326b6f701c337d41c8cf8748ff9c276ecd398c725c36c11857605f58c0b154dd9f3c1b4649ae677533eb0338b7475254e273b786c2fe7db4c13468caf0aa2aecd55dc1a5f868c8edffd8be8deec20a9faa621c4680f3eef4dfe4a79794fcbc5f8c56eedcc3e1963569a36525d4f6a5bdbba5d12966fd8a0fcc70783fd9f61613842f80d000c9281cbdf28c01c6f6aeac10df1ddcd0322e00c4e3cc801ef091d9c1b01e84dce725d57c800d38990251aa1d1206ad93a7dda40f27726d6a03d973150f7a88703724e314c0953d56da6eac442a70c2a08bc66bfa2b0ee11e185131e352d10dd714dde502097af0ad155aeeec2a6b93b149b75dbb898b2b3a7c5fef2f48d9b12a580f54c4eef3ff83a4f13f2f194af551d4800ae86aad6efc82ce460d325cbcfee3400ae939431ab4070d7a7cc005f270896051e32b1051e58941530e250f05af19ff416e65ce40655fda31d2e7a6158e07da08fa61afd5319b682de44afae146129a8b769c1708a5d3479b6c910b2ff0fc872a4a41aa8bf3ee16f80011d163b599d18501335a2be10cf117dda094fe01596c404c14580a7075d04ceef68bd8f813d7de6599f478f3de9ce60b294cb7ce5284a61e078939d08f3d4fd998add3b92532aa54e0c31087cf14bf4ec964ebaad53bd15d04e37948e94917dde181ee3bb2346335ffb403b000f5669019c5281d88a0e771176e49dd0ba22e719c0b731ec2aae9c898e74b2967bcbdce0d7d73057e004bd62269f4e7f3823dcc18cd6c551104b9b896b0ad138dde7c3d761138641bd3eff3df1552659fd97bdadfc59a05cbc622a4492a1b22cff72ac197d61a4c5a949aa9ac09d4c1112f4c1b1cae353c70278a21663e11f27e9ec66ecd4ad56f2179a3fcec37ac3a3f4b33c06bbbd4c8ce8e74825bbda3e58a2e2d928c2c6e6d886274bc0e2175ab03d8721c664fbd6455db2960e3aef0bb25afd3cb0bafb71a2bd18a89adaee00aadbc7e4ae70ed4b534aeeab88559194755f9656b43bc83e3952000d9e2295bf3391904218a015c786de0144868ee4aed203b261fe743b7168788a0680f7484792a3f64782b2b1ed9217b09ae9845dd71ed363f18e8aaecd51a4f5913aab33fea3fc5f1e37e0cd6333d2a8347cf45eb7c4ad967fe6fcfff3565743435ef09a646e75c7e968ecf4202a9b2c23aa8118a1683219b1155c2cabc95c696704f5b270c6d213332649363ae13ec811e9a1090d1603eff745e2fa83379dfc6da5efeced556e46a8a5ff1f2a5c0d911b95c20ec2465ad0c96ae7e16fc36143762bbc0734cf4d6134dcb0d739f7822470e0abf66a0ab15ce0d6096d3abba2ca4c81c1c68bdc252a8a4ba609b7c05ccd913ea56126f418fc0b06de8f76ef651f8085604c16e5910f3b8651ab78296b56b78326e41ac15774e442017fe5b291e5227ef5a4b78ccfa96d6921c8542a8a984bc87e2678903869c52c2568fee4e23ef3cc466ce270614e6472244a4294b31f9438f7e43437fc9c9c5f3efb0f4f0af2110a613661dc24a1c7f7a7f8cd14a943821f16f94bd874f1a32e305db4776cdf6633446724ccbb2488b1b06f0177819d53885127e6eb717c0d6718366a8b8a089aa6ab17cb2581a75ec748123b7d0383f3900efcff77d2e022e90aa41491117758221a0b149c8ebc23cc01c17b9fd39118dad413a391cfa0a5c614208060a61646c7cf1dfad4abc3a9cc5cd566db2ac8faf392c9d8e7da0f84b941d792a8493fbebad30d0daa0d683dcc1583f0c9019622eb6c92fbc475babc8b626319be2264ed873ac063f84b7f83688ac99d732a1e3fc12281bfb1e1e63d48bfbfca619bf4b95f899c50ad0f5fe4673347df2bbf2ca21bef49c7f8440d95a83299960f1e42b457addccce236946de80fd4862baf36387e041deaac3c9751ae345512bb1f423a3b4ca8d3a5e3796d289641d3424ff22670a46552ec68d7d095e8636441d777dbe2e9dbf6b5fede5318516c3886b943f6adf17d8b7cd40b20a48233c9fd981145b45a5cb8f6a88eaa36c270e93e1d876d7781bb92a1fd99727d8e0ae34c73398ab8781bb342f5aacf4081459ea5ec20c30cbb6122344c457f92b20448f78e1a2a291202003781ebda1747061c6ce1f8bf882fea4fb50bfe638685cd638eec15bc24252567025fc5c16ed1f5d98dd90c76e720ef7b4e25a20d262e339c5e5bb5a9cf051bf5fd1f63e93452a179277b57956821cdd901f1c01e634ae18485708a6ed8f592ae2ef3a9d54c9734ffbadc6f0b86d0398aece9374f9acafef38d4b97be9b932b9852f97aeec435311a67ae344ac1985738c72f52b3d8b71f64a916240477fddc5faf02f8224eb35d310fea03fd2c5933047355a438676d92eadf70df662d97c2f5e00cb293053699d51d302b78145c77ab03f34eaf170eda5215436faf0238a4b0d41d29f36052a5278c7d8af9a6ffc6e2b6ffc4c5d524f7640a7170957f3de2451ac75589ce328b61ea7179fd990da1698f5c73bb8639a4da2ad67d364db04771ca118c4055c25f1120a0643158c07cd22b375d5c1dfa26ffcda44921f41d4a504b2279dff03421cad19960f87c6b6dd8c29981cb66c9731f931e43b0d97c6ac9862e2cf711df0ded8e4d06f3957fff9085a95d9fcc95610fde22856b229a3121d8b81ee83dee4a6a9fa3fe8c75351574cb000bf7f3746ca1cc5414aeb23a2", + "signing_randomness": "74de74032fcd57139698e7b190efc6fdabb2fe369a05cfe73074321fe0491018", + "sha3_256_hash_of_signature": "594a2c27359c2b6484b1c6beca92f5de044462b7dffc6a3b5a5b44f8aaadf499" + }, + { + "key_generation_seed": "47a048d8799784f6ec385eb984e70c62ce7c8a107232871b69b99f7bf4c3dbb5", + "sha3_256_hash_of_verification_key": "ccbeb8c815404351cd28ac1b17df809e2f9835482c852a5a5afbf747b3a25581", + "sha3_256_hash_of_signing_key": "c175a848c02b83729bbc0779884f88f4d1317e47dfc4c888bf529948e2842ec3", + "message": "34fcf4626248b979a7a8d306cb9ed69c4ccb5cc3729d2692e0ba679d5c2feaac54a4e06d4efcedf78e19357dae263e1b5d107fb09618a9c34f54f19a738a66b95e6f88e20e01f879f53e8f4c371b571e1438ff70e0a8cd00d608976e24501b2ddd323efe6c1302a318cad821c6ffe641672bb80ac62286c69fcffd93422911c46d43dc9a1f00a73e19ebe6cc09a9801f2a1da708f0f1f98e7f1a18529010823230279f487911cef1e784a229d9e311bce5e2d368e6d613f791ddd617d0f37f604b786ca2bab754e8bc4bd3da37e66a54df1d3b268a5a80379a30a52b1532e8cfabe24168d83cbfd61e2346f901c361f771e0be3e03dae8cc30614c10fb8dccdcaa5b9a25ddd8d61e61f60f22308e12adc137d3d8c53cf7b31984cb813758baa19ac178f2f0cd2155ed674a7509a3cfa7ff66d2d9b1e60be50fe7fb79591c500f66bb1d35edb80263f4b696a3dda0b9b2911d01e76e9070d99db93d1d0c3874cffa776ba24424a6b453526f7c44eafabe13c0750f9df33e82105930139e70b5cf1b09dc3913d6bf4a4859f67fe814ff038f0fdab93522a35e7f81002a395989d68b8b7e4235a09837cc6402a5338da08e7c73dc63c43bac42054c694f4931b80140d6b104edec995cebcc5629f85d09ded8257626f9fa4079adef81d044c18bf2277daaa41931b62a6028f89f95f06d8a8fdeb95eb2eb1e90c0d8523e0b476b158e3040f212390ab2503021e8d6fc0733b963cc6188fb2532829925b59c8255d89f10b657053d0fa1d8e76c84826a4609284503d3a101ebfe7af93edc423ef5303cd946c8b570511e38eb04bee0060e678d03e4134f84f279a570aad0332417fb2099e3f1f279ce7d6ddb080c5d83064d107bb560b21183ae165cbb54cc75313de72d40d1cf5173455aa55c5c356d7c40a2a7023dd95d3f89b515d7598f800dcb7bf68b707978ecaf55b794a17559bd1e913f4472b1830783bbbab5f23a760c78c46157fd1b429c445494cdf92fec8bf9fc217d3ce2697bb6c671baa793cd0c1c84f579f0daec400beada799a9f417fe4744145f21c6f8559afa7a514a0e951f03e5e68c17a8e5816f3fcf41774d26be2edc11fc3a42cfcf00f817c3d0fbf474fd7f30c9c3c6be7f74fcc79fa6ab07cab037eea7d83866673a74c087b5f7542804071d53ce348d2e836749e35af0fb884d5d53abb195ae1ee6e9ae35dc91be359bcd510a7801fc243c07dee92373918aa4f8a89eda3895a52456f7244d1ff007cc7b1a52cbef4c1ade1c2c0ac189ab24b3f260475e1d08e7c5bfa30a1cdd71de5ace80d5fbd1d0f17198b79c8eea0365d139f2ae73cab6fbc9a79786896de0ce7fc747d68fa4abab662a09e0e409f7e652153352bb92f5da1836b0e92b0b644c821b2dd2bd0af193ac0f8cf5b8d88432f0248dab09b46fbef2ef1899b5981e9b33de4e9927ae50890fefc35f681e075d8b0169a2e16feda6392ab9858db87ed18acba25575afd1feda9fb3fd01ecac13c245df6972f65087513f505187c4e8ea54b6433fa092b6cd3af13f4718693904435c55d273060fbb5fda76074691269493e86f287922d074e54eff04209b2fdd3417d8436d1395e638d57db75d68f4f819141b6daf4d13a9a18629cf5f84b0cd02e7a397715dde5476bdc467218d11aacd6ce399d9d54645bb27ca43076b7e4e57fb4f7c4f4b8d0aa949719d731c3a927fdef1533d773cf1bb562d5ea43817a5acefe9eb7e51029dea143e8a1d5f76f9bfd74a26c6d38f54194319a1aaabc4daf45efbae770b9e9d834c09fe45c15d4bbc0251d3df2f2f23387dcabce6ca7a59625e18fd997770d164c338d0692af97c749fb746c0d3944ca4b2da6d3ad7b8c3aa922fc029cf9ac5580cfeaff50cb2e9044211ea522bb5769beb7a7bba0743f345feea9aa9da6ec5f0579cf7a5aa4dedc832fe3f65185a31fd49c0d259e3b7f8fa96e110d130f588cdec30d0fd4860ca6673c46d961fc68a4020fb03ae24b1ae12967ec1ed19abec0808a7ef89521152033f70f406a7005819d28dfc556c79de18584088f40be40a555eaefa78e3fa3d9360a7cebd963555cf208dc408a07ccc1369f98bd840f5c940721064e6c7cb241ed0697af0facf36f05632a504870abf90134a01af00d340f7a5d548a8078c2049600ee454d15eb8ce58c26b3c8185cf9dfcdca7d4b6dcdeb82230f993d51e701d8387b06bd45b4b61dc9da6d3b4356f50c1d4ad2b467d36ac092442fa90d1deb014475ac7ce90c974063459dc951decfa30d2de4c70fba39a8b6931217d0924ffa783c8c3daf048908e4aaeaaa3b7c98846278afdd1753252f39caed7d334d8575ce3ecfb2edec31afeb2bbe67fa929a267376293c2b2f295cd8dbd66106e1d9518be1798949f3315e0454d018c2b706fe836fb37ab908d9d698af495bd285a74e4cfc7612d42121f43fdaa7dcf44da82897b820514d66b92983a3ec819d2ce208d688b6f0aacadc0cdd619d815cd231ad8dd9b6dbad9c47e16fac098d0f4279ab52055d2ff765af6e3618c4509fae6ab00fa23980efb19a26e0a6ea4c9a7dc699121388748449c429b28ad2779f5642f05ff58b68ba3e289f90eb27ce06392616c080d659338caf274d46a90d58f2bfed25e8d4a8c62030a5e89f6b1a5f6112a38661e2f2b5a37bcbf050812dcdce9c0a939adf929c921e7da0c30815da318eb2f350f286441cc92060c970077623eee68b8c6fec9fffe780a6fc85fd7af90172951337af57339e98049132a4cf58874a7418fb7aba0628b6192bb2c43102ee6b1d7e824725d9c75d34a8b69df4a6bcb1f96b57767046c99ec6352751e2fe1075bb4092672379b3518ddc884fead5bd062b0336ea88bcbe0d22e066566347feb617a322bec561e9aa9d2177eef0dfeeaf6231ad56d0cd9e300709c9317b3d334d8d2ac97f96cf2f45b8582c4128d95da8ca207ae34d3daaccdb128c11694eee6d3e8e6ab767b6886b1f7235d85a4d9c7c831c5db8ad8323f63927a638e19497cfb308285a03ca2c1fe2ac4d919ad11511ecc6f28e7d0e0a614fe21b57bccdf83535c7e2c40840ba0014247190c580378454751eb3f2361d7193e160b9516f7ee1d683b336b873c8ba22e97480a61f002a73844c78309c0a3b31be30a192a62bdcc3d33a7a5ba1f6ae0404a8558740cae46e5fd15971b41c0bc39665a9b92eeb3328c328b073ed5b3720d37a1c097af8a6fddc3b2b067680e6caa760368b0e1c052e804e9f80f26b52596202ff2e0af7215999eaf7d3ee3e8916744e40aa1154322dd068aa15960dc38671a4f5889fbe709ce1deccfa80b9d33ad2fd963fe0581a2ed7718a27ca62819d05baa3212ec7cc1c5472bcf579ad52d5e1b2bee637d9827851c419a4cb91db57b2a6cb4433c1bd209648f1fe170abb964b272bcf0a263ce28cfa3a9d1449cffdf643e37ad97182f0031cb334a1eead23d63a5c2d0a675d0ed000f37fd2153e1afc4ac01692701014927601203ed2b8a477ccec45c1f43190e4fbaf2295e32a9383fc7915aa76950a301abe47bffaa9c294292126934ccfc173115a6ca96f3945fd5f924a5017125ad5aac705106eb852ef3190a24420196ecd37f7c67b57162cbeb97dfa", + "signing_randomness": "f76224f0024cc75ca18d75487e0edd88518965dc6dee53b98341db6894165a91", + "sha3_256_hash_of_signature": "dca59b1b9c223b8477545af049d6f19957476817c2b628f5d9a3d3c1dfceb693" + }, + { + "key_generation_seed": "1d9e243a35118bc7c50a50746e1cf19c9fc310c7d54181fb95f44753eab1b94a", + "sha3_256_hash_of_verification_key": "893630fe73bf5ec48386da241aeb42d15bd1d215608713ae8a576d8f45cdcba5", + "sha3_256_hash_of_signing_key": "640db431397f147bff346b893bd3e8813bf463fd67fb1b4db7a7239ffdb573e3", + "message": "96ad5faef409b8a4c21acb1acb596badf387d26656be3eb17987af59737e324b7bf8412a306b0e706aef73d79af753d9b0064ba9ced8dcea966543fe748e2611709ecd1ce6e4dd8fa812d485e91809a225936675369574b0d104a258e3353ee0e021683615ca5c7c531fb29a5025cc7f7323860443dc19c9858f741eb9d24a9f6f04fc839b67153214116e8b7fa982f338445830f915f7c85c88c23ba2a3ce8e2020a9d8dd7b18efe95563e3924d2a341826af51a8584cd026b1c433ef0221145ba8bdc8f73a467b33a9eb3e8cd2a4d671c17d7c28aaa539d1c5bf2f4138639afb89ce791daf0ef0281d52598f4c13d210974cfa1f099a0fc70b1dc120e5c00c33a2bd360bed57cce069060d6380be2204852d8bcfff4918ba0b70b0bd1e1d55dc1d68db1d20ae713b0093eaefa1e33d40d9bd95cff17568393e9bbf5cc1287325d2668f65dfcf44ace2f6c6cebb62f1433e69cd19e6c6532ea93682b22c4c4a62c6abcfaed08ee64f32723e56205222e4ae0831ab8fca8c265fea0cfc66aab1e367201752aec11f752b963792c071e42a8a1ab80658a0c6960147ed740cd07f307cf6a644a98e1d2e56c625acf458d0bdf6216a4f1b9c78ec3f14850c803a4207c894e61a8aa88840a27f2b439fa7cbaabbc789102a95323e06e2c324859db92c6ceaefdca389f677082180fe3d6202ff60dab9f87e3b84841c0a4eb5974d893333f7f1513e54ea4ae0731ec409f69b77089fafb121300042880ea59b7927e9435eabfdcc1019a96e145d5d157998d620e7bc6945dbd6cd78e94c2d89589f8dc8a01cf1b295a26b091847f034937f764adfd811f52b3aa187f3f49273eae5949ff34b64bc86ff11eefe378825d526509483e7191b33333e5465ffb025b269f898ce1f83ea549f1864b556c729f510118921b69594f67b8c229236ad3aee55bd7082e027b5d342c976a549e01618288944de0b2c77473a25201b61034b334968178afab7f8cd1feb6a25cf8dce3586ffaaa861471e2ee7f0c22538fb3c95d2145965c4673e6489764ae24b4f048ded77fe3487ae175f6d4898f69f9fff276470a93daf986a75f685919d98c9c609c795d4785ae941c782b551ef382f47209aadea19066ae5d3eba7bbd99e91943f1e62754a42ffc8048f7b87f128ccf6c96bd760b45f07f740e94491874b06cc3450aaf55bc664b407c57369cabd2708a9c478dff64d292d96ab71eb997f8b71cdd6ba02f52c5035ec26e8111ebf8268cb00df9ecd63bc0d557e2d2e77a6363b00daf25237e77dad03f929e5e9b39447a70d4e5f4b90958f312c80d594e1b1f3d0d23f2b0d9753bf3544061cf0c0f841c440319e74f9b9d15b91eba1e680ed6aab7d63a97b48c0a4aaf314e8e77e2ea6be9dcfc7b5557fec1b996a37c86cf6941325ec356ee75671726bced7d2157be8d4c62cf4bd0420baf2c4223597c0ef75f7a7c9533d14be0d21c37f06faa53ed5ee0ddb025862417f98d2f188895395cf2fe72185acbea952f55cad7ec2d684a5ab94b1257d7abb565b8c07b88c6335ffb9d2fc6f6779cc24fc3cdf92bb3b12ec54360a7cf3579632a2a65c518e57015df1c616c857f83f5f1aaff693acff210dd1e95ce04cca9a0bf385ed6ea2aed894e79d5133799393469b666209371e708d4d279e1ac5ace28985d0db2765d547c2902b715baed5a4fa3e7aa42645f3bbe1e9f3cdb87b1dd8dbb5aab08626591921cb49e552f8ebafcbcf428470719ae40b9ca847f31848f39e4d42049c5d40b0bff036e5409a6a12e7924148e60b64bb83386079b54486ffc8187302893b8bf826578d9ca03a1291983f21de7f6e65458f8942dc1b135c6c8c1fef4f3863a58db17112419590ae57b9425592ff22e596191e5ba7c513ec315ec3476c95a149f6a5ec1cf24870400fdf46217a23f42e0b61157c3cee23e7916b4475a94b96b917c171b1a34db13ad98833e457343f94a76ee226fa5b9f3066c2fd69f14d3aaed1b31f5114780442ebbc88d0de5f689cd910e7464d73423b9d4e03718c5c51871250d11e27e28df1268166e3af328a80d9d335f2d27d2e91dc61cddc7f733e345d56c11b6130875d93d527f93542fb352407185e7ac07051af7f642e34fa06b1376ba15a35d837c1bfe090ba67a89fc1e307dff3f02a988ecd48fd229733f641f2609ec8db14b1a5ac170b104f03c2509d2ee6844c716766d06a6a25d957530fd68a8de6f1753f83ec19ea2deb1a4f9c7986f20ff60a7508ded6547a85baba70577062e8144ba0496777a5218595e021937febad4bfdecac29e3fff2efe7d598fcb86f93a734e4c573e1496a6282a3b40e817dd3c9d631939aab350adc703899ee3bcb1b5eaf6ea8420dd6eb2d4f64a1818aafa97b73c75610b6005f1edc1ec7d8f8db1e5d3e9666c1292515105037d26f2c8d83fee1f4ef5deeb287cd7c1e11960218c1b8bb50453488bab019435065aedfecd8d218bd1e751fe736442e8d09ce7176a71c06415a30b070693a68bdaa5cdf62351ae665f37fefda9481e62ec181ed24f0d0649ad01c89ac422f1b7e27895e55dcc2fd817346d361fa559094b37894c0b478c68a1d7564d089d9d4417d5c7372a33ba475a81fc129f3259c5407bc7435825b415782cc84d85e69d9b44b32d78fa255a895cfd55319dae677ff89d93a3884ce9401775563ff1788cf3ac11cf96daa199e7f4579a0264378a323fda64fad2349c09465fb23ba09069c7fbc79e7288a82f9165268f6842e0aff0e250c21bbaeefb4347d4ef1cd51161dfd29bfaffbedf71dec93f4157a5c18995379ade8d15db59ec4a8b308c2eade1b7ddab55ce2220f3b3ae8cba7c8211cccb3846a225b438f4b37df54363a987c5c4e6b9d20ec3c0096317d11f982184b75d8effd168b7b41317d40f903a23a2649999db36caae31ba5d91998a684d30aaadbd3b1ec154bb6c92513bfc0c47c673254f42b1fa36b995cb737668cbdc2a0d1ba838e74e0e50b22fc22dd048f48b6d1e89e1ccce5a226f63ac7b8e6e9e8ce27050bf3dcd7d0f35f47bbec1caabd4d619cd77302ab4ff6f56dfbe9f5821aff2d72ee6a628daaae4440edcc070473bdaa54ccd775331ac2812fc5b9884915da582eb36f85c7923f06d961594753802efc5883ca484fc64face42de6c3105e23cb90663a3b381d0c6a7265b740bff0a1a017058f06e39a74bb07b63f883cf914fe675e7e5ad5ad44c9f90ddbe23a125d9be02264edc13972ff22ba48ece8890a223ec13addbe055a8b4e03882677fc0d94c9053da6ced34e132fd83810a793350446d60ae5dd0d174b534a3b6f5bc1b497f9406b5cdd414401b6dd881ceabab12cc51425e88a81bd9e14bda18273583cce0849aa48dba1cfc49cdf29242c73c99c87f063b8b739aa787570459c098405dccef78d6d97c21545f2959df9cd62f9c38ad9a849507c23a51714565642dd76c9103154327985f7dcc701b795a7af8625f06367adc11a7fd7b6abbda5b2ff6a825dd43b64a48ede4eff8603a82159a6011f9e626171e4593c0e963595a6e068ad05feb12378c71ae515a82c293eb7d2b01b333cbc7991b44685aa7513b3a58342ba5d094b773e6a27f8582f3dabf54def59974cb8a2499369b5b64c7ac08d32d75fe37371c578073dc83b82a828dfc325976ff282d3f6", + "signing_randomness": "070ea4fd2436b311dbee24426f43a86f263cfb8706873a4454bc5a75c5575b29", + "sha3_256_hash_of_signature": "564209d2af195a6d8992abe7224439cc68b32801c24b4cf097c909e8406a6329" + }, + { + "key_generation_seed": "0a46fda6ba71125f3415e8bb6c2d8c00601107fa563e7f6386486a88f87701fb", + "sha3_256_hash_of_verification_key": "a55a50f742b345a860daa0d25bc1029cc6e54d9acda82da9adfc6863eed5fc2f", + "sha3_256_hash_of_signing_key": "297402ca28d34db25c4136d848163639c944881a3afe7f763696629230cf98a8", + "message": "2447d338bf1a375b66b77fb96cbe7742508b57dff4d33a368ebb8451c2c67b980d3576e6588d8678b285ef288a8b5c9c2726c4a550e764e47fffa2a128533a7653e480288447509e10013ae1944fffafbd9e2baca0b3c7069c07a4186c056fd3857caddadd5f891512daeeb26865f5c89ffa63a64c85a08e41ebe7bd8786a8add571a4267d5a9e426840a0b988e197a09f3770b5b0d80d65515cd4d8390af40e6150062dc4b8661a8238f232692c152c97b8cd5bfe7b5ad863dc92d99744d769087b3edd81d2e475f5cf0224b10cde6fae8dfc3519efdbe66805ad4468d84d3dd93430363677360da8f56cb58a6b775ff6417c1f324380b15c9ba668eb0f25fc2a690b483e856f3327b2d79fa6259e30d7f76199cfd21152b7c6ffc3fc113f70d3930c08b3c1eb1bf25c100c5a930eec2c52664f092b89614943d9d85ed86a2ef666a94f9826c3d116a2bbe49443e2c11748c977716381d9463da8d09612b80a6760e5a6fc5f59425eaaad6c8342c1ea4beedd5d73151ce213c0b155286ff22cd28e3bb88e0cee39cb859900d1e0fc19f6a7237bda8e51476f4844a316752fb347492a928eeb07aa39abdcc0164d1921b61352ed4ac94b82c410a56505633bad53a3e649acaf64c43c1acfcd4715fc594af6fb9e85b0b7ddd6e8621bd12a2bee48223a97ec8502c16b550b03087b6e87c1a860d36322064f8febc52f2b7c31dae7430870259bdaa5889852e3ae6f61013f5ad0d38727cf9d90c67bd7bb3b82d303c6c35383ed86fd5b7ddec824ea198ef780be830a1f2679d24ea6e2feefb979563f511d188f409f0cfd0050fd418414d01e46db3d23b3a90b24f4e96edd4f863bfb333d6a826d29eed167738bbe22c516c59fdf81b032bb55473a5ea2a1defe71c95a1eeb5c028435ad0379896cbbc76877501b054cf1fd2f6d7a9deccd70d0c07111147ef568dce514de96eed61600029c8d103b31c8b344a700de630276ba2c5633419c59e66577659538a6381e45584c7e1d6ed978ab0af89067ac83bb70deb6f2c58e339a5a66176a54d985da6e02002948c62be6f12314240fe18b09aacbce82ea462586b8316c3e0aea00f9998922f8d956120e53b4178223f4d2934a20976fd5a72027c8f4cb33e9bbcc0abd15395151266b6cd5b4a9e2fc1725d8e9ab2cbda47b507bb25ac995edd51ebda5fd19caf68fad8eac57cb5ef0c6fc861a73e64648ee3255db4c3394438f49377cc4ac2fce1b6bc812e5d282f122678713c6c6d452a33c632c0aa47686588752d72b0586fe5ec2464a6db40662fd2106a19f67dccc45692fca03685251d512642b0cee436c78d94c6f5f25bbcb41fc7e5b1aecd52b846a0b70eac93579603e9870f942ad4c1cfc9d49b1132777c6f1c184c1537178e5029067257a2da2827a2ec44d323d13dc6e4e1b9edf5949d4324228687fd54f02ccc3c4dda635fa546a5a6783959b1c48aa9d9c9f6381ebccd979253460857d3cb1c70893ee6f04709e35923883ee3c71c7f33b8cc28b9136b3ebe5f52b9a76817f2f74fdc2f12b459dff32d5a295be374b3fe507a0995bcacf1e7b24f4501b29f1e8b4f2a8cb394b3e459a4296f6439ba59ec88305ab045ff40b1dab4f672f878de1f9e46b9326cb3e2f3457b83ead8dec28dd079af0e984a69ed882e1cf21036578485dfc2debc9cfe82fce0383b4039d147c4c7e31e315fb57b9093daa811f4ee4568e32e5625abe76c5a1ae42a03441dbe766d0ef4df607406f7d489275e8c5d4470866f9049a4ad5c428b843dec3702e86e177e4b60181d2b5f099bebcb25f04c93d087c72436e87a9b3afce78fa31e2b892400b5c1071f8ae0f78ef6f7d71859a97c17ec0912d5ea27afeace739fcf66f489ec6355a3318f79649881cd6c7e96a881ecc4ff6934c3d10d99f1dfd00592cb037749b025bd4bc2832e206c1407e600fc2170c0bb57e5c7af0756830c2a6913e2b9c60575cd4a394f2a65c50e40a43cf5ebca6a8a32335707ddf4633bac7375dd53e24df20af30203b514d3793392e38fa8429b050f58b28cad0146f385809cc7faeff8b71b2bc93d2c6f72e31ae2d07cbb3cb7f43540894e01654edc71ccf4f361a847ec5b1d23c2d4680e29f0e1f992eda3ac41ecfe614fc010a2eed1bad87a7d17468d6fa5356edb25e9008a9bb328225f85202246816e1a542e1dd746a5fd3e064faa1248579d31cd3d65f8fff36f782622402db328c7850d82d8d8a52b897353a2f8b95624d2d958fc1c3ae6466eacca2a6a5e6add4a582d27e07633ccf697fa02e243a4fbb3dc727b718b5ac0fa6aab217e241627e69ca46f05ed6b496a739a29edaeef76992a507130715be555c68a7eead6e8ff3a378d8f4b7bafdee3edb9ec094440e31bba717a9c82a117d05edca2370003dfabfb2efb29510466f74e76ceccfc41709fac4cd8eaa998357170a7a293209eb0bb83dfe5e2f6d73c28d5409c55e95068d647bec42db8098f0089ef8a5fc5976bac421c37dda6c4227bc1ae5ae229f067515cea3d794c8d85564af208ae0fcf836b6c0af41477f99c8773d9dd1923c5c07e1fd508c7436ea93383797f372ef3103546a5278a4f59614a5d182344f0431d065c35620d63d4d001d7f626993241362e67d1bf41419858eecc2626537d44e2e23619381e96cfa91b3d8054681d298509d9b99e7aa99cf8742e37637b24136f8e1b487e9571e4c24ae5df307e4c7c62e55c47132ae404b33e5367c6f24d6680be32d20bc58370145486fd5eacbcf98eb7e7fb6293044067af11879e91444025fe52e24617269be192bb71bd9f95356edbed9df352ab56a854f9f531889a88689d3f161fe6155c6c1e8011d60a46f59c7d08c477fa652b559a80567076b4eac29a85d54c66b35d6960dff75a696cdb17ec9a7b74dc6c3652dae866e8758170d055c4bf60fa1238448cc9e29160df50160c4b0dfb36bca40af0bc5f7d490e7dbca49535742eecb90098a0a0fbbbbc7af25c0ca9bc039dfb555dd8431af188f7c1d0ff786d627c058a0b9a15f26b58aa2a5992bc8fc5aa14025ff95f294203b45ea081e28f094d0d4ad671c885e67b2e9e800f10048158698d56648f67bfa8cc73dd5afa15c1e48936b2596dee34459b484336c20cd77e58bf682479f9aef2fcda86e4f3a2fed7046e5a3828a9b3c0dbffc25fe699f25629a2045a51242e310cb369b730a5e81167758d7fe843261a598e4541b02d0db4bf5616ba07a440665f7fea6213114b6b1b38bc033d70e845445dcd18e23d34d3d6f4a52f5f904ac5d8feca5af1123658d09613209ee19954174a1ac7a8c7f9ea288bbe5a0705f3ce38f30ed5ee69cf5208d461efad51c456507c3729eb338ce15c4c253be21e81f082b0847c6871ca0fc8b3e80115fe2bb8cd8afae69a3c1429d21f149b7446888bb4dcb639819efee665b6d6f69e61452b9328b4887a7c04e9949390980a2609a667267035b11bf862c1131533ddafa518221627e0ee7e4009cd48e4aa9d0753a9ae82aa0257b69d569b4c53f05a75a521b327322c60398db0947d205d2a33ae51cf2cea8c9162dd604f8edbe91f5199d19efbf9896a46389e7bcba54b4aa57cba0d4f9da117f288133ad01a9a9b2a824d54f74d4172be2b1e5f0d3de60c13aa5b668ee6a45397c2e39573ebfabaaba48d1ddb2ab6453fbbac8dcc05349404889c7de23a16eafac8d5e541457c32cdce80cbc", + "signing_randomness": "5d6c5adca2bc4003ff2a26a67c7b7627c67ccda8cc493cf2d0f782b5e25bec3d", + "sha3_256_hash_of_signature": "ca1099a44ea56ab66e3bd4e8a3be014bbbd9f22180ec3a13b585afae1aeff330" + }, + { + "key_generation_seed": "5229dfe11090effbe94ee161054cd5ff58b31e23f567b282db42eb1fe42e44aa", + "sha3_256_hash_of_verification_key": "664ab51baa6bb34eca6fd9b5cee3ac45958c20e63e4403e2e0122df29dc7cb76", + "sha3_256_hash_of_signing_key": "40253c54612cb67dbcf10877ec7c22091631dba5bf251872f442a380e89b2681", + "message": "aafa792bff719a3b794b2f8198ebd1556889c8c61ee6a51470ac9b274cb162af44a26e2ba5ea7663c4c78b4b66b322ecaca8f2ebb6a610b51d7c4399f4a64a870c038797cac80f709ca5c3c9faff7d797963e60983b584130c1b99328aadb2d261217cb95a535b8518a78a6d2f6cb8400c2aaa2daf451391f7b8ab0277a3af88e1ce6f1d3dbc386cbaff15308f073d29838692e645f566d4b3db4186c259bc84606855ea88938cec4f7211bc9b461e39dfbb9e44cbc273e02d4314a037e0a26d60985ef5a35f069d8b51f86e9b6801ca067ab75565d73581ebbbbd98ecb5af47509c8729d82ea0b35f0a376ebe6d90108cd61fbd0cec966c17264f6a87864457f41162ff7210049e6ce2b5354f8f19161e0866d6bc3935815d9267c600dc529521fd092b126ec440d49b8e3a166587657b52ae9e2923644f72876ee94a61d2db0ef4dab33abec0c47a6a725d4cdabd06d4f6a30bd7c90db3778c17b7d8ce82a5123b798d8b47c7f3e968c9e9f82a6eb3c2bdd8fc06d282f5cbf3050f6ff71e2edf7a109f23ab47f427bd75163162c37722bf70a6bbebebe8fd9c39152afeb78c37d718014f739f20baad1597b1f9c4e0b59fd82b834d83daffc935de4a3272d7c2454508c07502943e90fdb56128d6e6009ed09ce80a9b60d51aa2e4e162f7f0c362f6886bbcabe29ef6c7f38b742000b9d152ff709082fafe809c5dc9bcbc6f300b0a7840d0d36f39567d14d8227e7145f7ca670efe917e0f18b0570da3e05dde56883ff12bc0c76c2a1e9feffbb728d991769b7d0b0d34853c76fc0655ae200501c28755f57934bb9f46a3c6ab1dd8e0161c698133f4f2d7caf3392576b4bd2b6f8735d80bcf60656e132442bb7fcfdae160a2dfe3f3fb8209b5c933201785a7e8206096b84a222a68e62501846273f6a9145820f87f450d12c64ff79a843e897c8394ad54aaf4f3b886fb00a6c37b2efd0f6d4dd639c9989e7ca30e4f12eef440946b61d7a28904e1d74009b6d1aedf2fda8b5991cb37795a8ee51bbdaaea34a4c7040944761b9b4b4c12f455c536992a0852f7f07a9aeda8e522591cb4831b0c79fa977ab6bc49c9730186855986035d2c6e5a6d93da43e8825753721978aaeb433ce2f2a7d67c1ffebfea6f6059474d3022817a7329d9dd0e4a292302e4a57174b9c5346e4b6d75d65882ca7339a48c6e7af776a8515014a20e4390f6b4f4a19990fa725f5a69b9c3bd4e8bbaeae49979ac19600a3cec6de154985e236c3d0684269974bfc82301ac7196675f618182d7cf15ee5ce3b7abee0deea5c72f54cafef203d556b31327089a0c0de94f74458cfecb481adfe3cbb5da422bd3626b00c4572b4c2bd7584acd9129a76c616aae51f944becc4682aacafb8e3bb1a42a6a8e5fe7bdeb43305a34a98308ef2d49ede4f41361446a9ae4dfc1ee13d12821be0b01e55b865b563633e5a19dfb6425cb60159c147b18a6419f5085c5d0882656ed533eedf97674d0babb6cf32f696dec0f9921cb3dc9e6021fa198d554b1d83c42a0bf214fe4c0431547384f45aed9190cbcf98ed8278e8a03d551fa284c8a26218f0b0b58d99879db98449cc99b6b399dddad9924e6a7eb20a0f1fdad2f8138bdc7b445bc01503c509066b1603cda76fe41727ab5e027dcb15032e8f66bfa84544d22c501aa6f62b02c0f8764387163ccadbf1ed7238e7f16c80e6c37afec2e10ffb95ab0a39784f9fccd8ae263758abe392727e9ad442a44738d77cb61a6b1540ade751130489015ae5917c927232eed27bbf88481f3ca0c5ed2c31dfa943b2ead4a8c80b4946e3c138a61baf43a72c7a25e16874cbae254d3f14c154f7c60ccf665b566799a01e0f769b60f73c17c840e0018c6fbc10eeda3e35a77586b3a5936b363b2d5cb25c78a3e3aabbb84f1e64df47f97ae1645650fe1751a724ea9bf80744d0f33da6f313a3cc17d8f261585b62a75c167126d899219a26210dc55ab6db2b94e6993849b4986f988efb07478d6621cbf4b8ed772e61b0246a5582242fa20339b2d6cb89ba1b9210a318eb4697fd21efcfd230de9680514a442a13b29d8cb2627a6970bb97bf09c79c6ed7a27247662b25f39c8d675b0747f1a6d9ebbf7cfa7bc51a7ea3a7307ea4fa2a463bf53a645fe701fbf26628731cbc18636567ae633a49e59f6f049447803fa3d4f1f79f38026de9b07d8610c9f01befb7054aa46e523e001c1ec3a4e7084de0cce596dc63d9c1f1dc03f35f9b1918e62acb2640102e1d520e900969d53e83d2dbddc80d1dc54bee99531faa5a8d2dbf8346c7ed123587353dd63823453de350545c176446845bb3522a862f5d675419da901cf7d2d1f7050abfa3237d42753203be251b0364379232d2d9d8642d52a60f6f4cb09ef29fa1e6069f97a1175f8447fe98a813cc182e33ffd8b8cad93bf32a60f1a9e63a79a7f7fb9162783b89bb57f3e73155ced1d0084d5ba967f76c89c61c1a3e944f3b6f78d6cd3d1139a315c5276493481f3fff9b6a6b40c920eeed9efc74108c6bba5a15da736680a23db5672c5a32abda24b49f2011f44fa8ff9c73609ec195025f0456d753c848dc6296920fc32dde2174d37bfbcb86cf618aa0d486ee46c5e1ea14a3bae4952af5d4837f9b8122a19d1e59b909aceba6c849c8b452cd6cef877a65fd83e6d0c6ee35886688f1d877612cb8e671d83216a1f76693d6a4d6a2ec13eb6ca2005328b3c91f51b352a707ef8180f320d6e1685c1ef4d87e3cb77fa549bc12727e59c11bdf8a9631cc272998253028cecee8a2914182b90f586d80e7ece370979bde683f37123090012ab9243a4c145d6349c2791dc44e54956c5e9b59fad017d3ea27d85b48a896671a0ac14a73b5ab9145d8ba6aebf9ea25ac2e8e2c4d16c5009a83d0e84ceb80e95df2cec4cbefc7f5b90a84d408e8c4855f9aa2987d9fc9d8a451f32b367bb1de5271ed35ea153b5d400a6d8050ee82f519bd930245a96c9727fd24d8b94dc53d4b4f00d03172cd6b7f2be163b6d16fd6247b01988a6ee6ce7bfeaff78e983b8ddfba4242730e52b57876e3719d1f9f6cbcc81620f848d23c31e3fff7ebf2afe5011e6466b1889e7ef6281faf8b18a012ceb96796fca9b28e78335dfcb85bbeafaebb0fa75ee2d0d391ca97e05f0fe43475135b13613206a0d88438f17ec8e604b007afdcb9fa1378b7cb96675e0b19dc6fb02508e05a7fdaaf09297a3884aa051b6389a52f921f8ff31970fb082df554226c2613b80cc1adff770024d6bf011c0f028a012597ae56f36eb6b3e864d79639810b8ba7258b18192b5caa80dea4b140d3c6f1d707acd2256d676ae90980ba80e10b44109211aba830ee96e1bbd248315c804d391a86ab7d4b3a4a37fed90d9867da4b93fc32e79403e5d78ae99af1cd2acce65d4f3384d9ceab71b1e93b99704c64caf17b999234361e378b9362d14be3fd9e6c268013cb1fa2ea8361749d635c0429f796eb15a685e31dfe7a76ae870eba120331ac830f8c486f6c0c4f07b658ebb9274a463e0eea101481dd6b58835a303ace802ae79ebef51add98a67b7ff7968815acf4504b9d360f7c0120a00aba1fc558e6cbd8324ec35e0985294563a8d7eccccd9e3d1557a09885770836eccc7aee0f18b81e30f85d695440b5bce29945cbf60ff402b281942d38ea33a4b03e9fcbbbefaac2c455e8a03ff3f35154132c538ea16f0605efb788c3ca8435f6d595f776433585094abc75ba581ec59af701f66dd6091623e4676d167", + "signing_randomness": "ebd1c6baebec97f440195e3be0f8d98ea95b323dd3ac532accc676f6aac784d0", + "sha3_256_hash_of_signature": "c58f1d5575a3d6b105f1cd1212ccd9e5b5644c927ba8cf9acfb5df1f5478ca36" + }, + { + "key_generation_seed": "18aa77795aa6d7ade8b6cdced81a1959a8329677f042283dc8ca71e13eb3adee", + "sha3_256_hash_of_verification_key": "42681bc47e814876b1a0e1fe92f25adf91db761414a872a190feb0261b120ffc", + "sha3_256_hash_of_signing_key": "133f2c214d87223dded9bd5ad9ba876d76fd8b8ff4bf3cb02fad9c833683e418", + "message": "63ec08b711ddf5c66036a13f574bb7be76445a1d1f83c7732b9f4c25fb9e799d4afa55817bcb39b974af92f3730767ce7d863b6a3406450dcbc5e0145d10b7d532da6e80196157c38d1b6d3c173f74d67ad8df24ecad4d9b59921418863a38270b982c4392225edd1845aed2199e2c38b36c7e0e5d2f3cc7f6803926d977c59ecdac67ca290658e72bad633358fcdde2a4b9c40169a0c7cccfdd93e4da3c3838e9308533bd468a9128c5a141c4842840e45bc8e4610a7c5e7535834c5ec73312a50197c76ae984b3521883f549be04e27d97580e6d85d0ee84cd0b8c65bfb1aa005c607de82da70021f8f90b7912c67dc5657e1882cfa6da3de1ba4ed823789c052649debc9085c74528162243133a6ae5c1c6bca3f730525b167d816485e40c208affa8706e3d74631eb4413032730a7647548b77579323eb03d36c2ec37d2389d4a17305f607c78f3073a2f4b4395bbc94af163acbe3c990306ba3f89af9affe785c3f6d102fb2bd55f0c1044034d6a871293b31a1b38e383cb926baf3ab4b5f79a47e9fa7b77bcd58aa35a7f16ddd11ff642069a8a327dfa800049babaab4afbeec9fa98adb9796fbee925bb70ee9e96540436e1473e3ae4c56d7099d8dbdde755a7e101bcceb596b9415f52374c8a3a73ec66b229dfd8cd7ee7d2cf1c5e7f490c7d9381d9321b15f84f640017851eced1dc80d32da3a0a57adc3ef37e021031866e278c7d51ff5ca8e9ecea1082423b41d772c5adc61a8c71c3d4caaaa3433928d7931ee715875bde2bfacaa0a7f799b45241c21bd2ece4a5944fb6890bf24908de58dd3c76173373254a36b0b2ac7d67926948cc0136dd9a5079d776c297fb6a585c290d5dae1c45e91153299eedb731e527f0f62e83c1e93c75fc74f9c7e63311562b0a55459a0d41e034c3af637eb29bc789e5920daadf265f42f2707dd1ad490b5f8a8d24a9968bff11a0c364a779ec385a9a33edb9cfc7dbc672ba60ce5f421b40634270b982d619f8e7960d32e1b8a76cecd13a3b0214dd34214cb5bb7fd530058d5de1fb9e4e88adca05926ce1f5597100f55dcbf64d47fc177ff87c4bd9f6ed7670fa7b7d339edcce6fc1eae069e0c303138689ddfd23396c145b79afcf68125989c8477bfc318cdbd69d1aa6d3ee41f4b1f9be4be9fa58a072412078cb9196556ee56fb7b2a2761dd04120fcd9ae9736f599c8b96bf8f964b305530a6df1f94874f36f07962f87acc0b285eda64d2e4857e26bed40e9a5dc0327f1d91259292c608d6c6d59804dc23a34d1f9f1b69331d68771e41542fc5d669cbc3cd7f8310f87e8fe8f6201e57b475de2318ea6ef9f7d32a728a44334cc9df28df77038c37cba62ea8cc5ee80e571879ad111f35b6a154fdf8d40fc93360d547d02f0743a37ebc4af178c6ce36c92ce6b80b6350202d2978621684a19afe1474155bb962014587b1f5a477092f42bc446d7811c0eb439a6829e538077abbbf03f515f1e6ac018efb05af79069c2569d2cd7140c4b1b47886064dac695d59fde2d8fddb35318d33edad94ad4fd988095b1156fd59551f0658ee666186369bfa84e30672e4659bfbf7963c377f0039e08de2c2d9803fc12d97b5e67ce9536af12daeb3b9903d8d95f336ff53286284bfe8d7ad13ec21c2a9ba93c9a97bd7f6148de7c8cb41ca75a9ecc8f9cc68d888faf6b3e75376b5b16f41e7e6b76a686eb365365e2074fb1d7efb1b285a2357b020fd3e47b89943fbc1596f3fa8289ad844386a691f33daed4b7a6a6729526160f2d32ba7f68ae6678564fca05bd811f208a8fa62f6731f23d46027008246fd4bf3c454a39ee225245e74da5910e7937b36661548a55a2270a9d27114ddc94dd9b9d4122289df0a5700222a977f15fd8e36afa1c4870bd3ce9b658e2d83882aac5f3db814346240ff8c8fba3f36e52ac9b441c76b6f104a0931bc45e202addcaccfb93a486a7734a6d82b9f6ca911448f988626846d413d987c5ac860fcc0d5f734269aef88d41a055794dce832babb7e306f622e5eaefdbe1cf195e320a1aceb4834b3e70061ec2d624c12eb35b16e5aae73053a3290d4bb1f51ffdf48c1a7218d365db7fec15bf0f710954cdec54917600014bde3a901dab1dec0844d7ff148eded9788cc85c0cff26e5895d91c56ba6950c0ba8fc6c773ab4a6091a5de3ac335ddc2110eb0144fd89b3d815ef4a26f718c1acb5723af1da5515442a03cfb9d90623fb21d78daf441000e285e9e7c235c0f31e258e6b3feac048db652b83e07848d2e9357649372b1a55975b2ec7fcfed19d0b6613bfdbb4b5b01a9aa3128ae137bdc1d8ffc3a38b597578042cf183ba8383c289c3d92f6b70aa9b3364e9fc5d43f3cd3f310d229912e91d5806c2a11e0bdd208a2af438be77b43680e2de67918fd414338a763910e1316965bf96bbf7df639266d075e90ee9c073011f6783750764fbe4906ecdd94ee9fb7e4aedb23ee88ebfb018c44fc8bafc66e6b454a3d0e332c7a6b34c2e8d1d26416ff43d768cc36ca9d3168355f1a281a6b2eaaeac7b64aabbad2156a1d781a78a896248c56f3491a5dda8c22c231aa7ae14bd558f66e6280fa65f20b246d815bff1d3c6cee6df9b4aa7f750307a7bf73850e6bcd22ca0ad74b4afc13cd4aa2fb7e7b588adb3a46a23ec88a34f13214b261a283ae8fbce8007c6ef6be255c33218aebecd3ec27edafd252994b70bd67407620d26e8567f4c7f6d636803b6a27eacc3b853706a8d57adbf7f7e142ff149c35119a6172d5884ede7c71e6c34d1b485a684dd56c9d670576b75cacb870a68ea7ff2bb461d9e2fdbf500b2f200110265a3cf24370a3f480da66f98fb5327b4cd796eaf0e559a5519f3c643b59e3b89d05d2a9f9da6732cdc2996408b7fab5a734310fcd73fa3fa5cacaf31ab04ec0b9734407c6dc575350212239ac9092da5812137bfc40f7735bfdf9827f768fc0363fc8c5739c7df828075ea2bbe6321d5a8ea2eb7e397c3d58a953c7f0baa69a96ac8110b125ee2e9701f43eeb87fdf58a6e6266be1136437599e26e8e6e853dbb6ed9df3931c5f402fd09b7e203ab36eaa6eeae72e908bd2b9cfd379bc9b407f0c882807bbd2e91f920eb24137002a48f1aaa0cbdf89fde5c51079f1d8cf7a014207f1b40773321ad952d77ce18ec7b48f2ca054e65420c1132ab67c832ee22ffd8672803cce3de7e9fd0690e55fa1af5f11611e3e2c71ced55e3e347f4cbeb9c93bec2b98e48495585392471af0ae589257ed8d01792112c798bca5107030f207ce567594b8433490d8ff1811f21b03a42ad0678927183321355e3d6908dc1125cdce038cd0469d72458b6cc5e67eb0d78c20819c6f3c4518b15cc63754ff8679915e329dd46feaefda5249ed7e754e7bd55c75cb764b6cc36bc06267b2479cafbb3f0bae32a93558190b65c85dcdc080cd56d51d4105c5b0717691d4db1893ef8ad550f55855b4123a38d18fd67b588a3a4c2a6604e874d721359352b235c17ab1da2758712af8179ff433211b93078735f909f985f557d0de52cb9203ddc67bf9dc8632acd8d4f90196af6bd2e79834371c5e9fdf5992adb04aea186af36f56271f763acffbf94df4b0512ca6b7ca8ff486504e565bda367e044fcd0f25fbc2a6c720867f95bfd92109780d2e6dd60ce90a4ca8eeb8c4cab289dcf99e687b017b37695c3b99b4fe97d7e5d52bb9813c04d03c9ad71770fe0986c7f3a3ffd3a261ac771de88c7acdef253e5ce2b50bc5c576d132b68ccc694ba883770b80f5ed7d527cee816527f69ca2c101747a0088879c3663037db5b", + "signing_randomness": "9f62a11e9b25ed3d43cc846b3f45629e99688cfcf09af0a673676bd209806b51", + "sha3_256_hash_of_signature": "0bfe812a8572e8ffefe02bbf2579086e245915697959fa17a24826b582a02bbd" + }, + { + "key_generation_seed": "4b2d6ec32be9c5d8fa11f3fc0008f4f26b945064d98362ad912f452692ac383d", + "sha3_256_hash_of_verification_key": "f659dae26b9912a2902dfc089504c62953e185c608e9126768398812b2bbb606", + "sha3_256_hash_of_signing_key": "1f276963196e6162e0ab5fa41d0270b6edc8dfade1c41f37df0991822399bd5b", + "message": "7785a08a3892c97d5ebfe52475298ba444674086d63e17e1faec96f6b10723447fc1b8cc758d1724a33e26518798183a4b3c99a7da54038b86473dfab8e626eb3bf54de5581e04450b2821f5020c466505990b173db9f030cfcfa505aa04b37cf0a063876843a042f17aeb1728787187428f8d1010d532c94c7ab2e1193994bff0cb56415fcd2a96be7f7fc2c57c8313e795367a22b6a17ce3b803083a74fdbcf030d91c957128099d6199686f2bea618cee111aa9d55a6f9e8966c102d849ade596a1b576924de0e92dd91fbb01cd93e24aa71eef219a78430d84965672fe6af091d46dcfa9ab906f6240913c1286ee0a152666ecfe2c154cd3fb14dc0f9c173e30fc9958a75aa6dd74822af7acad243fdfb743e47e48280990c2870904ef1c902261d0bd6bcfda91412bdee9a28c628f218e7648aa0027d918b48ef30a9b18390331805c6739bf6a2cb69a0de8766a7b3a448910d181f6449565a363430ba1c0fa8b11e1a151f6cefa3870c3b1d8cd800983ebd41b48c5624269efb440df23ff9bcb31a4b02f6505dc862b2103f76137fc6560f893577bc3fce92ada27f291305f2345ac82a846854f172131b042735d4b76c6ab2dcfd32bb6258b23ac790af2af7624451172fa7a29e0c5fdb3dc3b719b274b2838ff7a8b25f272ac8ea90fa3c8010ac7f65633eb43ff7a0a95ce99717f35d3c416b0e0da30470b5aa20eb9e2b66315b9407a4753df8bf505b8066c5d57ec4ccdd2236b9c58bd7337925191ed7b75b92c9cee626f13eaddecb07173c8160540fb9f6a4d43a1e9ab263b300c08966c247514647dfab3b420202529e963a51f8d23bd0f689bbc4d67d5a603b876e8cd3ec0770f0d9694dfc30083991cf3989db1812b4ac5452358075534190f012f7c0e47734c3ba748e04910783c0b845484461dcea67a1ec731354b902557486b484f67183fc711d10f906c68cd01f46481d040f084271dd784e5b958ae05b65bf5d207efbb5fdeb25366d6ff4161ca3a1cb71b2b9f90f86a315d800935ac0086d85d907a036c4333ea347000a0755550b68fe3dd7686e416483781b563680146697d6fae8333c24adc8a2436852ddadf6061e2b16fd3829c0b55c2e9c2c89f64cb8da02a6706498cf0330742083e9ac4593a1762d32dc4e6cc2d9f4310014fb15debbea324ebc2ea1e1660782559b9b39fbcf34c85fda9ad350d195ad7587aab621ef7ffb63277ce35ab43b01977c9f8dd6c2ae7b34fa7b35d5fa37d8b3719e736f18734cb3a2468be9ca0832dde0b958925a377fe6751c4eb8ff1ad295355302f0a5ed4e8f8c33fd5162542b8ed7cd985dbe3c84401830f6a7eb9d955ec74c7f98b02388b4e1353317cdb5eadaac9025038cc01f8655c7fb9aee940fc4b282748b39d277a7fef462038833a9a8eb50a8719f68b3e858825911f294a80faede9d4c1815844c2632dd20387950003dab80b1a58e541a5e6658af7d4cdd91fd1c08735b584f5c69c5ca94f6b7f97a4761b127db394ac72e902db9eb4b3e0b884c448ff2763ff9add530753263688cf92bb746181c17294bffc2a0b3969a7bba429a481c425b24745cead66286f5df04f1e4421c56acaa668e87ba58e3b07a062d1da60cc6b411667bde6f466b72c9169965bc7781da78a818f779a9b3d7a577f71a1df49aac865a0d6f2668cfd2c77cfa8d306a14dbbde4d3a3818b07dc89d5f51e117f7bfd007d60f32bb1b6bb01e76862398371fb91e0a3d4b39fd9146c47f627a066618cf83c32e5c82592b418bd2f5dcd8d42234625974f988a6f729c60ba5eaf18c77b611dfb187a581e3a10268a965f650fe242ce2fe08aa71515b59a6edfc9cbdae22df3aeb22e773cc2eb373619e9cda23c236ca3f7845c2136e93849d9f6aa1477f4513358cd8cb4e21444c9e5709818801eadfca23f2c23ddfd5b4ebb6089daedd14a21ebf3f7a8c1c80bbf7d37973bd156ac5c4462d29dccb7eeffa22a8b6ce433b600532f33999adc39196f01230614767285089fb262d8469dc66d24ae0b77fd05c3ec02fbc5ee328319409b8e2d7b0ac6801c1c8ba86f793c2037c71e2a25f114e9ee0edb3b83076eabfdafedefa0548dae91e62cb7c29c03413235b8c6eb9f46be29de8f5d30e8d97db6f45687dc4719b1024e48b7dffd0d2b474b2032b4e69b6382e603d4777f3450e2e467c6d9ab2782c0ae266c320d36bf67bd6b86ea9721b22741684d9c0ccc774335430071a5410c1e34b4bc1a823a93a38f5ab4781cc593b13a593867fb634c0c705107cd278c6ccee6d842748bfbd2ffd205c6bdfb3ac87f693c25c832c86d96b00bba0af88dcfbc8ca4328765de27fbf1389c4ede28317bd0ee447f030990e957d223a5ec66ced9d16400af6da8663c4e4111b4584f8f0066cdf8258d90c5d7b439503e3ab3fcc55fdf933e06d704416187aaf86e6c39695dea8b8189ec1299670be03b6a636889cb7f10f04ccd67278e77886cf3f6e2a05ba8d25ab8664ea817642acf5db4d9b3ef80e169463edb6bfdf67172e88d233609b091bbd085b970db8ae0daa5048ca42d6a54042f42445bab03f9bf1accef341b7349109ba0073d3715a9073ad9bed258268aee9dd5202e0edfa5720a317ea5cb41706c0d235465becdc8e3ff0d628ee5eea6aaf1bbd3e18fe9217516893df115e979c4cffec494988b6f9b86026610898c44ab1547c5f8ed5cbf3c3a837ddb6a444bd3e803e1824e6ab931310fe86b36587f1b34b0b48d358f4b97e9774213de7d92571380be2199e703119c5b9836dadfc826b71d588250ac37de0ec05c5823573c102bce44c9f044507671c4e1723950a3c0e14968cbabbfeeb049eb723db9b23cdf0273525c29cc5165530a1f1cf830d3551dd6bded53954947d5c334dc9c71907cdbfa109ebc52d6305477c14159257af8c51c6f09d76fc0085c3d969ec60fb09145e66a8a7489611db3fdefc35202b8aae82d3cdf666034beff49fe49a45c5ec438f4118f338545532ced916de78e3bf82b4e55907474386b9c172f393efe895334f7323cbb2aa7ce7718bef5e7a23af734bd4963fbc7889aa5c50f3955b904b5e577d71b21a293d766865e3f8c212de5ea084a9d22748a8009a7d1858328a1bdf7ba0f4e3b83be9707629252b3339cef796696855a574b4a4896ca68c3d6a6824e3f593069ec0a571e61282f8a29beb8bd788f7b351a8939cdad9e257587a77804f2704f49db3305514b85b449aee56ee40cb2a75d51690194284aacd0855b02893f8dcd3091629dc548705a1085e5cc33de7726a0f521c149003df380abdae96bcda55c44bf9bfa1103150f049563e848a8750625dcfdd9bfe02e1e57489b5b3aa28beaa80f4daa562deabb4bb6a27125369415885020d237a92ccc3a23593fe2183225bfa2ff39b0bef9cb0425375e256bcd572175483f713bd38f937f2b3d4c1f686c5af60061e0b05cc3ebaab0ae8ba21e47a8318bee4a01516046363d152936a1344e17a65e08030522ec667233145a56001b8d065dc2fed0d2a9f02c981a8962f984916314805dab644a5112caa1564895121d8b1fd046f547be282cf979752883ec79af70cf59a88d960f3336f0ae61357877aaaa34699a876144b65ca5b77a684d850d09b3d42cdbfc4539ea103f8377cfe5f9e5432403fab416662c4c83226191eeb7f82b01e0819c081fc40e7b978669c7856067e8b582832dd0b92588103c2616ba2c7774c46840318ca2b1a3798ff7ed9fec087f01798ea2445b92e67e2446126a7406e82ff8d3711311be16e9171531a95c966e6befea34938e6f5fa660f7c7cb533a119377f1d26ae6ae51d805ab96a64c8b80d6ee137f634b384c2e377", + "signing_randomness": "fc6d0cf3c569484851b938f5ac018b833460575e28b2cb84f11b91ce8682e088", + "sha3_256_hash_of_signature": "3450fec7b0afbf765cc67dbd29bc4cb0094de186a2f73f99e54e03af3a7878e5" + }, + { + "key_generation_seed": "196b8144dfbfb47ec01e96a6b8443211d6c9c4aa7853a8131b5218349bd6d953", + "sha3_256_hash_of_verification_key": "a891583d0decf77b93557272740cf1dfe660767a5c95fbc6153ae6a82e2a1aeb", + "sha3_256_hash_of_signing_key": "5fe43ff0283966f2fd0daa64c66e84140755e95831fa9280c5e176f8947297c0", + "message": "ae3dde9e33719040345df8ea7e4c0b5e2cbc5cb80b34fddb959e2da1d67d74d2fbe5aab07c6357a9f3e5f6ef5379b4c75008e9077a1eb025f9023fe32fcd9076c8d2b291d0becf2dc624f9e752b1eea2cf0755fc9d4b2e4320dfd042c68577d58e61dad075bc1c3931aba78b473c0726ed495150d6a11a81dbbd1c840f5f1faacd54e3470e0d994deaca7e6e324a9fb4e581ab447a4ea026da3dc3c7e6ad55e88cb841e069eca63404cace0e3d4c8b9cec33bff6aa6341aa1eb69ad799c6cce358ca94555287d01b0192b1b49eb6f705e54fbc86465c4ba70134afc9a53c1c3a732e21b010002b49b7cc6f5237b794bc1d1f1e30a7f1eb95d195d5f26b46a704f77f80b092117ede1c340622ff32302dca7e7e43c2a4d8852cb508403b1aa8aca27a86936350264811550dfef05d72542c74d6243ab9d259202295a63f54c836cbf610e40eb85e9704041a51bf68578b10f7985c752dc35788e7b7754358082afec9e4b271d36974eb90a46f7d703b0cce941c3cd072a88f931a4ffd098634be0921d089e46637f88f9625b7df900a276b4bb75fc75921c8a8b6668df9946290e11fce4565a76d39d8fa55f324253ffbbf81536581621dee664a9e9e4f4fcd3a9765706b8ea833125a825b1cb30314b7c6c78b301638ead4311932fd4611d78572180ee441648f8bfab869874611c153feeff88a45f7a98206d0b2d97cb7ec2144f045225af5a9925ae7fd3db017e37259b7a2ff6c66820ddaac5651b2ec2e5767ddbbe18256b1d0d0f96cf5ee04266b8adb29b0ac5d55b73e1eca8fe724ee174b76ea1c0a54896e2bb565075f1669d3cca171657b66f343a634f4250287f853b52182b9be50df29021673db1841aca45e7263dce653f0dd84338e49ff5c6e3bb42f1a3c7164704a2a000149114d36bb9231606eda06c712a904c1e323c4aa3eee0bce6062a9cb956e004407014adb58eeabf486b38570955c30f2b5c28179f86cd5ffd603cd441a1fb06519368886bff9c2c127abd079346d762e51c311f196d5f825b45eddd4a48c7c2123e10a3d369d772750987edb96968c59441fb2f47f8e33fa4ced3006766c06bb6b339ed94b8fe57b20d96f1a27a61966289d8ff5072fd11d7ee53defe0014a11667d0a6c988bd16629fb53f269130b22a13aaba2e9f70dcc93d3bf6e611efb006ba585fb8e8720357e25df69c6df388fac792f87cce801fa49a8cbead1698c11b82c4f85fdb4d52a2a808483dca7334295bb3b2658aac18857878730831622124f5a254a464de459f3528c5194220e5bb1779c8f5e3866b0d60931a1a47502d99e2b186785658def57aba676626f9ccaaaf449609b07af7b57c78fa5bd06b2ad2927ab491ee461a94ac37a079d9bfa02203b09f7ef180c1c1c430518ff2d3f2a3582eaeb6668060a2b544e973e8a2b88733a902a0a80f8e4f30ac5d0223c1076482eb2ca5ae67039597514a4866061d5fbdd99694a060d0d0ee43a1b7290ffd7d796a9f1a2142db6e0f154aba8720396b6de939e668447c81cc828ff9d2a014fe001ca718c1d6acf4c08bc7796d344a29fd8913e4ce71e986c46bb66c2610fa797c9e1639df423c338d7192638f621d83a6802e72e38bee3aab064fb606962329997fe908597e7407cef098d4591e5e6011caca701994e4acf572f7c91057d3da06058a7dffd3248ee3333208bff27473e6f1ea3914c5b2056aecd7aee07f8dd26b3c2b8b9656ea4260d38e8d5f23c925a4476754240d0702c5859aec2329e1cc3e426bd7665b2a4ee2e75b41b561fce79690f64d1068dd35a294a8e8cb43a6aaa901109f0e09d985b6e323c30a017e75bf01d0aaa739102c1a6667ed48e60dd4499eab862851558dfd17229878f5bef0cc29fd19f59835579f3cdd4f85684e0d46d9618a205de3b29b0bfa5fbb36745b989211e2ba711527d32cbb5e35830df4549fea652377ebbac6d52787f9ebc3cb687ebb641bf51d3e22e98fca48f99584fb1f3bed3f97f33ebf656c5795055268f49985cea00819a07b8f4b0ecd7beda95eaf11e3498fa7aa414c54c38a08a841b012ae91763be911daef803e2ca385c9d4cdc642a0b343db6534c10d9e1755b7b2de543afe1d3c90981a7bd907e9cb14367243d9fdcaa8776aee5f65ed6dc02f633bcf9f57dae39e8e8261dc10029df7b7124beb67dd753b36892481ea7cc54ddc3a60ef8d4dcec4d5796dde0e7453bbf0fd93fcace97ce5048d75ed1f34b69a392e1734e262b2b2a1e246331a373b5cf1fee7bb46096c76349b0f19be63fe539dcd33a8450be894c2dc21beff0de6a841a533f4c9949289037d161bb97dce31cdff4c1e0ae36b4192594dec3b021e8f3d5b500c244cb122974f8cadf125de0cf832a920dec3a6f7150585d0209651b0faae0f74a36fc8779115b96136805ddd4f6f3a69c06af472f369f481359ff834a0fd2f9ae899ea36b9b061b63d07c1d4ed7a373acc40ead808564b05fb0c6e656a80fa3865aabe483848d14d1dfd66d7ab1f353642ee3417869da21622f6af551659d07e6c827c18ea36e2c5e806a9571a7b05bbc1ba283a8984bfabc555aacaeab2453573f782a4087f0f903af34596e83282a2e54773ac33543bd353a3f855bc46810930c3635a9b70ba7ffbeea95a129ccf9e9538eb11e119a072f806130d831af7e57d332ac889d7d9e6bbd1c65d64e089722f6954f126e64ea939d98084d434ee74b55c549bed21d11264f8b5e023277db52b03d7b8a8e75b12b11d62052e474e435707272d72d00d92288ceddcd1abf8e63a8a9963a48b54f492487b309f69cd90c9ff54b9c5a55cd2bad4a2e0a6b00b188fd6c527a8184bb63670bf626a995815810cc0f280131f5f652ec20609c7d3b910e4168fe273626bf0e2cbf05bc9ccd178ad91bc25cdf178b387dff0b6b40a46fdb6c975349b6cd8ad103cdc5dab8d09d9a5b55622e74564c1e789c5c185cac04fa0ed6065b9ccadb1d5dc80e90ab244ce1aac516b346adaebaf7a030d66fb90fd070ed062a41e0b70bee3b07f1c03887de5f79d70f9955b25b8c8201602784ef8a60147260d1bde8e152e8d3f992cb8255adace9d5dd2e9c856c47537742094190aa867459d20989db11841ae44824979c0a2093d7edcaa13c9de25e6eecbc5124055f17466467e123e39034502ba966cea873997ee25e52de2dbba874dc9ac222b49967b7bedb5c81be09827cab782f458795b2903d72ab16f4423964f82dc69c138eefa3273bc10376939e544964150d9df09e14be08cfca06c10bb2c315b1b676c40762f8209c0ef13cfe5fad76cfc17fe462d8330f78bab072c5465f7a26d047fec4bd3b918c9c761b91b02d820ed7ef345e79a66fba61ae13d3050a27488cbdbe693b800f1e76c188ebd8118c9432eb9e7124d35a1a038d237918f1db83304d10ab5dedf58c6951a92aab1a1a40e180254e730eb43b566a83cc71fb6b9749bfcd3a90b964966cae90fad7406a8a89b1e48c885bfe2db41c1996f20dc9a8dfcba1a6f2f307ef8fba5eeae9631c2d6328d90f17679dd9e8e9660d6bd4c8a1d79c47a5fd46bd2accaca2d5c6407b0f7f31d093ceef0342c67dde3f1ba5067ed1500dc45161b8636255924bf007c4c870990c5dce098c5a26386ad84d0f0ce4860349a147a4e7ab80151fa63882590b91c6ad3e70a68e6fec1a2cf65881a6dc38048fc14de71c702c934c5d3c4cf4c474f906c3400364bc400a7da087f94f1accb68439a9a6ffa8c6439b2cc5c0b17a7d649033798429f211d9de12b24d117583e1c425c2c0348c625cc44e9b976d319e72d4e09d5d6f36ee243f5fbcb190e84de56eb680dec8566f5a2c7d5f595116c628ca09401d561bd78356c634419225fb01cb637c46a627f6026d39ec1c62e9a3e85fae", + "signing_randomness": "1e6d32286c66aee9b6e0d5971669989bde85591faf4ebb36b343a4ec4f8eb765", + "sha3_256_hash_of_signature": "8b34c410f713adb3bad84e0bdd92e938e1be26b6e6645ac79c659c489f5fcbef" + }, + { + "key_generation_seed": "c171793029d0cbaf8d2661a823243ad50d67f2619533180f25b50c94b1310389", + "sha3_256_hash_of_verification_key": "ddc779d5dbb9a2d340964e3ef73324a73ba8ecf423616432bdb8b0264cdf1698", + "sha3_256_hash_of_signing_key": "d6233049a2a0f3f651161c24f5425476c8f03f7e2d31c1fcfa71c8a9f38c632c", + "message": "a7e941d3c14e2ddb4f971c9955868aca753a73e8ec6845ed6e9d3b444c826480f03ac771f92e94380bca7e50303fb79cba608e351a1a67bf217b9816e2af9f89be8a79f661470ca16bfb2c99efde97859ad1d217848289eaf543005f5c231599ff74299ec2a7c737ff94b7465de11f80e17d4fda264de568d8767ce822b3ab9642d95bc89533ce05fb331b86e3c5a296e4ea4c637ea458bced1f89355c0270d083d4920e72112ca1ed486191748b4f730ed52f9803d05a0f2f065be03b2603d6cdb154dd7765847d656b919b08969e41b23f9d376135bd5d924529410392aceb004849550e6cf2903181c9a395fd469b7de2c5060ed22922aa4d7c782a33330714a0af206b29b4fcbe0f12c18948f6634ffd7f2710138020e273cb0dfa735bdcde9bd6cec898c5e564ec71aa7880d97cc711412f28603de293cd5e904e9156d4f6bfe2be15347b9ff7848eb51cd0785d6a649ea3514e02695c7e3c4f021a9992d67bea1d68e5b17db2e0dc061ccb5ababa49d110055467f9dee61aba8f3e5c713e94a8a96c3a8afb698887c1fa4abc5157ced33a834dbf0f5af9eecbb5f2ad7b63b4c2ca94a117c2b92f3d51900926e26b101fbe6207ab0884cbfcb15f9f98f95b0d08e29390977f4d3dc710eea3ae7433d5ea87a5f710f1fceab26d516fc19fd272f6b0f01ee167f06e6c33273481f280ca64fda0549c8db884fdd467b93998360766d4cac4c8de783752fb6c6d7b1e47df23ceeca572f2ad3e2b628e31984b9054448ed1d90658bc658a9caec0485512ce084a535e7c8196b8bbca5d26c105c41e083f8d56f1530a8c1b36a7f3e41fccbac7f342b2d026064b304444192d4873fc57978e44151896ea6c0f13d017f683b203ba1de677ed00f2b737c4c69e53ecf16ab918939e120e9fe14b2243eff0116b24c6654be09c582f1e62e75efd8593e62e45ac36f717815b854b47a4ddcfc91fc533fa85bcecb6e560cf11e46d2f334b396d68b275e7404a70f2a805a64cd458a8e5f114a89124ba1866f917749ff32e59ee71948bd97f2d4128beab8bb0b6b06d84c6d466bfa30fd8100e48d951d0b3e787ef9611a56ffd64d970dbacfb1b4df064b1cb5da9918f5c58a10f0903b64286b1c1ae5cbd00eb8b363bdd7a7aaf2111c0c6e86e15abf6c1e761fbf027425968cdc19522b44ff3f56335c59760fae6d9028e76b284330f7510f2b55b6f46adf90311cc785d35c2bb49272be514cfbbd7a2b7b2e8c0b6dc28cb683d3d581f547f83bbd3b8c7b76925e44e6da89d5eef17ab0bf4213ef9c05b7b473901d483c647f416b98478c7100919c28515b617a27321841baa174c1a2d3494395294cebd48eea14bc3106ca9c69d9f6485d6abf1c2b1111a8bc602454685ca61ab4ee4db9f413caf8f0f204f04d40cd36fa5dab629cb53876db3e16372e626b6bc892c63c6b6c503c9d22efe113927395206bdaa4b83d4fef4feb42fa7a71f7ce2197fe282a02d0fe50f96b1f917a67e50eb79cd3ffef064542f7beb51ab05b56afd7aea5f4164cc9ba37d8fdb35a3deacf0cfb555161e7e41eb798160798be9d01e3de0c4288e0bab19ae398e94353adbe9a43524ace35830b82fcfd4b1dc2800ca4c38a56b7cd28bc3e2f69a0ac4655cd79b5789a2b72eaf93b018d4d6f4c983d08932b22c85af6fb07df0a786d98820e1b06bc17f62d6e39739790a13049252f1b9102dc692ceb20c270ffe9b902ab7ec5a4eaaf47f7e2d31b2195f5f48ad18d099c33384141da14e151ba57f6b1bb97901457202cdb83b5c713bd8a13f6e3e276c7d6c130ae287ca8931d9eece06ab7cca124d6d02d497d55ea9151a95e8a4dccda72d3f51a7db3f2879918753683b01ba1b154da83e6d84ddc9492f2dd8c128a30c75174ed1a6b8d93d08645270bde247782e882418ea158b2a2153b2d8f75c09932f324ec199d26e9f3c4c4cecd807367e3981e137858b98bd1268d2c894541ec99bbbad19a6856ea16a1e56b7b193baf79ab89d4e76327405658c4ecb5a8626302b3a4618aeac7e11a1199c4bb08c60ad78fea4827b59cc883b2ca7038d7845106de9174b2b8c17267273d23418af560265000543ed9886884912b4160fbd372fcdf706ef642cf1829493884b6cfe946ecf6140106dcbe11b3746e33fbd4b5852b732230b9047004f4fafa0d4bd7043c7d6595accd1b2771aaa76fe05a0c80b7b221dbef79950fc69147816cad0e52c05e72ceccf55fb4dabd81ecdb476417dbfdaf3b555cc90573cbed9474266c89fc55ff0bcc55602a51a1b5f91e425a1a58dcd4abd09bbc63933fb4279b9e21298f9fe0cf1a93c4a19695240e8978d604047abc7239f5053ea650d781307c50dec4d5e2360adeb9aa02c0f6fec5784784a271169ce456e1c32bf984c3323656ccc588c97e0ece5a40fc7b4ddbdddb764edc512de63270f07891bd160f78b8ecd3a4d11ec4c68ea0a0fbd0f23af9ab261a110f431f926c4995b05462e0dabf29d9660abbc660c9a675628270cea7ec5ae9b6f298b17b2392263700b8ead9c845ad29ccf109a2ed66ed5baf9c935754aaa1b84be2b5339f9bf3cf5e80af16967863fa8dca64f5fe873da4a6d33e39a592749b721fec203c0cac527ca96de7a96ce9a540f5da1902c97f960a05ebf0c32934f9b81244c945a60fd3f176dd8c261690d8ec98d19607129a50edd51135ffbaebc04a0961acc5a32fd058ffdf2c6866bf90a3e177787e7061bd2011ec08ec118ef0451cad010b53c68d0bddc701d10920d697ea3439b1a0f96e6256b7712f59c746d1c74c20b17d461c3df635eec83e3b8e098034f119b9d9a79ada735158eac3f434e805444d5ea2ec85cc8ed8f5bccab7dbb6ecfc2e385781579af1263d9fd32bee32e01db94703b5c756b894def19783b12bce2a1a8d29d96f329cb0791d697be7e0f05dd5c9dada52e1b8c1e5f75a0fc90ed8c05bdff86644b1ee61989caaa271061d4222818c894ae9eca2da7326e5c24ca1eeebe3720d2127ba997b0c572ae30615f8bc4278057f4762d46a39b934ddb2a0903fe1568c1bcc6c37e1f7c145eb7cb20a6a4b3466a7aba58b48be94f7e14cd20c87b2768358d06e3f607fe5e9dd1aaa8477975660f1e379b9ea26cc00cea8cfd6420f2fdc7ee6393aa17cef88645b821f8f42fc7dd97b0e16c04631f86ecf1cb76a6502fd1c13917ceb26a83596b117d5336387ddbea56162e8a5bf2fa35e697245bc7210cec13bfa694ae884582924168bf8ee2f61a734e37876f363225e5ae19b7c65ca6afc31c8b37bccb308a9c27f3e9902de365e288e6cc46e329e78be914b85eb980c0bad932c164671ed395d5d8317c133e2e000a10e0d20d0f408019b33d9a87ed7725ea4c5abad67e0cafbff31dd236e59defab7ff2cb40f479b56b261a32656f016deca5302a336ca15d10e0afcd168a4b922b79c11cb21881220374492d64df21453b41346a85174a0a4a3c1e973845c856ca70d6d25bb854d0c6bd3c75cd73998c7f64e35a58dcf593c85c2440a6aba4e470f87e6f9b4abe127b30f8992d8aad0be38f008d9d937582eb3aafc68f516d5aaf2503acc96e59a151d2d4b072ab6b38c54928d6656441c709f1c1b770ce6efcece11f8b3602eab63e0c629bbd8a79a96be4cdb072780f3d287b091fc94ff2c0d347fe280bbac308644bdb15a3c653863edd945af0ae725507507b82c283dc9909ccacbcf357d7a19703401b6e4474b94a6cbae575b942501a281b8166fdc70e6b4b60c2f57a4d66fe1197d301d0e0c7bec12cedf9496bca2183d04632711a79c8374b6de35c2eecb0239391c2019c720894bc7a635df18fceeb9aae16b3ce92717e2c56903d20d0712ef80131b8c48635163e97efb1fabd1500d061c93ad935be9a65a45a92e4a4e885268e712efbe5337214701baad4c73e81e73bff19af131f0aba105baabe849f", + "signing_randomness": "0b0f308ad57477b710ca5e549115be1d4ec0d6c3509bffa0e662f441f7248779", + "sha3_256_hash_of_signature": "f6a10db69aff6849be575f222fc984bfce1dc8267d0a8f3c267a13153be19c83" + }, + { + "key_generation_seed": "615fa91f3d206b908649399f216950ec7b2420eb04aec6abfcb7b4528e8e33e6", + "sha3_256_hash_of_verification_key": "0f3a7b8eabdc609aa40be3fdebd259810c00a81655db69fd3e20b02fcbb12033", + "sha3_256_hash_of_signing_key": "b9dac2181fb151771607038c8aa14ec361774640213d753e20661d0c983b523c", + "message": "e43eebe157e43d9f54130c668a153907d65bb19856a1b7c2fd5e2c770fd6bacb13baef951eb758485c128ece4f3e9377a58a45eba1c3a9ca5c94b50714088700d6fda933ece3a6989ee77a824a9e99674748a90b7f227b589250c9e156a8e50b74a7f49de036fced86ca0d4c02e217eefcaef7234f651ce4380b86389d7331c7657ac283f58c781f904405acbb68661310ec6921c1fb7483e74116378086d4a0c9a52af9847bb3ce0fe97f5a7c2cf588db3b6fd725ca83391656cb38fcb6d79531e56f5d42fc0cc20d04ad7bbf57001bf2f8e6b335cc57ca2db23c247ef9b75bbba3159030975d65b9aa7c10e0fa4f615f77126d5271129d8839a3f8da30c79174373c4ba643e4c4f0cb26bd5b8b9f7ea56de459eda15037d8772478fd9f7f7e06f3b422df0b425dbf1e91d3893ce20f78cdf1910c5d4674efadf122f41d6c7d6290df59fa029bd82e792e758ad4388f9d352e9d2fbe3e58810c380d1cc5768865d24bdd92145dbd1ee0d4724c769ef5cee12db2ae2708b4c8c7865e70ca31386388d991d46c4dc4dafc5ce66cb24d455bee01488a7c764a308c7054572fca0cc74a01a2b1f191c54146fb1aaf55b834f998b50909f3d003271e6504985dc836b5c44655b938769639799f2575bcfa92f13d32b283a5bda11177ce1f66d6b30788415bef598773e87b4c8c41f0ce6633b6c945a3b4c46b74f30945efd99cf3709fdafaeb4bd4c6bf605f89c7a9b4eea1a6599f0a32ce3f2c58587ea8bb3fe6495d92f2feec52bea3de2047f5eea7ea1453c762201ff1291afa87923107f7ff586e00d07824ee021649abd2d6e9ef11a1d31726ea9277134341ec57d790949590a963d25d6fadfa9ca21e43acb7e5ed4cb6e8bb36377c2618997943cd100a927d395376871acb9619bde9b1ffd5e48e271952613875fa3acd3e1f2e872f1d672aae6e2a575a4fdc4fae2dc6a7196e7eba94ae5b49be41e7295433adf49a6d2d945f43699d444a726423cd9164b9e28b0aa4485b0c767a9398df5dc5f23d27889c14b1abe98880e7bd5df9ab3d1321d5493a0a8b91ea4827627a9b59308cb0104cd8da7d9def2d47b27074ba007401415e900df03f251c8aa425f0fa59d74c41ba7a9288c8e280141caaf6c6932ddc4184f81f5c33f0fda005bf3fb6a0a9169a709875ae475302d57ce96d3db332188202597ff29d1f9ebad2b0ffa27c14ce9cca58c923283ba10e9fa1689d6c2b8804225d706e09ff97ae9cedc27d256e8736daa54382040648f2f6bfbecd6c3a9bfaf5d1ed23ead00eab351f1e0bb4c719ae6a1f5d12e7f09ecea62a2f554b18397fe1400da1eb6694635d7c9c626e0fc82cf8df6aa4ca88b69f78cd065c53f929baa58507fd3e3d8124c4bf287d452af47af9f4d926dfdb529a8abb8bb57c5c7611a97053a0cb0b01c754cb479c6cd3a3e867bac33e45ea0bb6bf77e0b2ec2f136dac0e259fa309fb5f6d8e7005e1696ce203c5d054e5927a87a1b4e81e73f22fafe61d7d64cbfbe519d39e716bdcbb37657e71b9390ff04b3c01c6f6842684115cd7f5aac208eea48906890248e58d1615634cc1263cd3adc14b67f1a1a8ed2626e7237af5488f5d269973f11458e3e4fc2ee35a4bf49c2f5f2361939fa243fa8f33b54eeeba9b0453701e367a7bf4d698c62da64732652c68c20a956522826f8e29a764ba93dbc98fcc87e59a1423886694057e131333c5dcdff3be7a1f0d344a2debb90051721e0226178deed353a136f69481f83651be3281c562d6127914cd24c38ffb327786086b08ebe89d03a33bf7b5dccf90de9c4d907d308e08a616c5343c116a098786383009dc70787aafb4529cd27cf85f946b8b238ad2f00df109fc84cdb48bb52b73e1de066636176e8c6c76216105486c553511df1f0664ec1e04ee0b0bd74a08070207486b7f326c3ee73188ab5bb7f8f5643093916491d62f0db18675ba4ce90b2ab310bba4705b65a581fbc5e76842a99d4926ae5bf7b8eabce5fa30cb98c1bcf0e0708da970096234d47bfe23a4f9ade29be5a8b6bbb748ea1c13d00388ac90b65ee10be6a9ac422ebddaf5482422aece19e702f6d26ed954d4e489cc48b2e39a6f168e98e11c1dfcb4a843354f1afd447962e5090ccf51ddf6643ce0afafcf3e4363187e69c31ab796132eeb04f2d4976a576b9bc8d9b1d491b74613c1af32e3d2def408abebcc27e4a915c983e10b6090fb2de6ff9e60c96cf4f940b09aec048e7a174711798fd76db15dcae0e570be3ac147e2f8777a522555b0898bcd7b04abbf060fa72b04604c9a583fefd02b2af9fa035f97de4daa4ee777f9d6985149db6c2f0a33ee1a1436b38dfdff87f831e83399c6a884273e612433ee3958f37c99a748df151e3ea011f4df5f0050597685e0230da1b1c7095e1203ea7099ba5c43e58ab0eda60af65291c3cc9a07257d71ca6c9eab93cef41294853a67a5b11f9192c96a36c701f142dc36b046218bebad9904fb765550598f8e2f49f5f0ad2608117196751e7e4c5cc4c3ef425a921c1ee15f37a1f80df1e24163ca145edb0fc4d988b8c7167acf9cd94f919ac96e5469859fdaec54e1970007eb9699342a9aa044a8ee478a3ecf8b59b0109ea7640c218ecc1e8cbc5e2fb61a1748b7c038efdadc2d096bc29d95b1be770d097afd8b0fe02173a1b3d7110f80d6c849f1afd1b01a60894b16140f9b34d96071a753545159c4ffa4dbaa938bdec287c6b83751c5e699724ab355d1fa0e081db286ec83343877c520e856c4adc65322aeb39cd87b7d8e4ff9222e085ed84c58b7ff513ad77f8a9eff2760a03f69ae5dd14dd92dd3f2d3d98e97b1987086b3eef2f2e822c851b7add83903786c050f30c4a4f4ba9361e49acad503e2a07ea119752e12d4fa09dc83f7a48ee3dcc1f09475960b6839ca736e498a128f78e58279063d839aba88ac9e5bc24bc07bbd2de1cf2e1ccc5987e63f83780d0ecf07eae21c8c752529735b37c980eb320dc949468c69b17da8ad612825a84d0529eb97ff8c4cd225fdfd1563bb6c5360abdcb3339434a298ddcf5f36188f3ab501e505828e8d2fd6dda062ad415c56414fd7557170f0f57bc5a401fa648699f3c7f7fd8f1f058849b817fadddc24726df851d3644414f55cade30a5764914675d574ead4d4db8725866a6c51bf0eb23b12fba1e101a6f3bdb98a2884d0f2b8deb3f279e9c38ebd0209dd05c0fcc6ea715257355d0d6be2c8bc7835187cdaea43a8ef9c59e88af6aa667a697a3df8bde250eaf4341a835b5ef93cff97656133b49e13213949a3f368d985e0d6c793319f4284dfada383137dc5b000b7fdd85f27865dc633562949bbe4fbff75417ab109f03015bd0f67728969435efae791ac72c6aef99a385a3e8b4c35f58380149c653fd78391a7c3b26a3550d37f9639164979288beee99e36ac6f44d0fcbaf0d210839d563a6249059a30ce6f047f5d541fc8a90a18610a8befb9493c5ac804d34d40881ca82e673788870705bcd585044b11f1d9bbd6b17d8b82b7ccc0554d1e3aa7f2762fe01385571c9fa7a103d07c1a209504876189de4b3c5910c26c5f33ea725a7d57cc30a6ec8f3eecf2409f1234a094556c0f7941cfb30fe86f208feb73c8e8ea8623640afbdb1cc589768a714cf945731debf4519b70870fb3a50f1fb368ada3fb217704a5d46d879ceff9bb72667acc673cb196afaa0db1160cc2cd7b260deb791a94d0988ed54b7e45f33e7cdba0fa105f3af3cb1521ea382b1266df304c900bf53e195ced03871a22c50da166bb9441cec83607083195d6cfa17297b678abb5e03950160130b47e25713b0829f64d2552efcf404f65798a86d5899b72150a91ba00f7dfbffe82531497b60c31c28992377a2dfd5fac8a9c16c835ce4dc24d0389277e6355c655c8a33c89bd48f55c13ede24b9bb348dec89612f0905719743c95c0e8b5653855676ce171f812eca405b6f96f2212d1a5369a11379282ac0c5ac41d", + "signing_randomness": "8dd2a9abbd92d21f6962622708f696df6957961c0e80046a9c77a7cf9e3e364f", + "sha3_256_hash_of_signature": "460a41834ead012c77dd856bae863dd4b3fdd0c56952fdb20a7601913c6a69f0" + }, + { + "key_generation_seed": "626c19b8553b2d9e5a47a758615d80b15be11fd016d3a1962d8de58ed5ca2219", + "sha3_256_hash_of_verification_key": "695ddc646098acd4ea90c3b6355d3f9d03c80ebbb49339c245b8ec130e4436f3", + "sha3_256_hash_of_signing_key": "e1799bdfc0bdbfe5e0b71c8f6d7e733955468a73122b74cb94f0e013b845b363", + "message": "c07185e0343df2a4201649ad5de4cffa20baf5dd43f5e4a6c81cd5143fe72865a7c036a2dfd617d96626995c12efad019ff44e0edd7028f29e3657ee3c0d02e9ce83ef0a648fd7cf183a7bf7c15095e0f9278b14fdf6c983cdcf2987dd0cc085400906dcd0d14aba60124f4b7494adbbae3a8d6052122575f99792f7240eb17864dc6d231721140e43f1110e73eb2e3c05049783b33aac4e4ca0a248775baf81fdb03d114508928bec3169a810296b5a4dac27e7c7f8d01cf5943cf4d8cf6ee6f9042bb300e50eea3224d35c9628e38c368ec3b42393fc820371db6557216a2c2d5a230fe3a7c6bcbdd89a2be5cdbe7f783ba379b6a4237db051e6256dce14dcf641190a956e8e85eb2638736b899ed045636ddb7a351f5a4f4108d9d6e0413f92b9d392495299128a5f4acce8c7747c675efe05ed7182db51c515b345029440ab61a904d2a390122680c951ed4575515144c5ca80d6f14d1cfdbb5373b78e09d04d0544151cfa1240790cd31165048d1484dc4d11d05057071db3433df071b367e00fd38c386dab689e4dff6fb421b2a95ff54dc29375c9d1c18a76c79acae3d3f35d4cfc385199a4ccaf6c9f0421bcf58d296ec7e0d1b95a6c4bcbac1271f94e438360a71a6440275591e41389b30caf2626a865b9e59552cb198a1d4453eba6d0f6fc491a8a7783b4a8baeb81e54f9189ce493efc1c5d830a4f637f2bf43cd86b91637611415c95685fe79966174312fdfbf33a646625f97521b5cb1f008135b824f1d6d8373006c7158e62b1f794ae34548a0c6dac8b60c559d81580ac0d84034a501516ee36cb4082732918365a5ab787face591ab02be6957ae4bb96b58e2b173da019d3e0cabebeba0af775779f14bfba8f595697731522df3c80cbdec16f6acc32659cf5daf193178307887ef1be1b48b5806d0fa9868a7fb853708b26873857786b974709c687d6597bcf6c7e476c1e47cafdbf30b6311ed434c0f998c4065399c59073c1f2bab1d46104e74ea6c976d416e58bdfd24ccd957cb431870de5da8763992ef68bb18075926b0e4e826095eb3b8cae086fb1759c94b873a1f4df477e0ee9eed8dfd7c77508b3f0c67f69be04355aba9344960639f6dd6b3a956dcd66370338617a365579c5993986b4f748cb7c990344b209785e22a40fdcf8f83061d37c9f1351b4473d6c74abe6b3eb2a7d62ca0f0c88a0aa8a46973f781df0126e8d55d3e9c41c2e3884f84fb0a06c484cfa0c9a0dfb8cfd573749c711c7c236b0f2f144e1ba4db2525c093deed29434fe43cb3040c5a374cfef33214fdd2d660398e91bf070a4f5f9746c2f08c41256fd5e955891146ffd38b155987e6a0fc47ac2a5950509b9e2c86b9dd9929378f43ef3935f1562672498c5640a22315be15b001d4b01418df8eb41dfe5c570e850582d8916c2e7fc2b728048e24bb9d1e8283615e039c16a2fc61011631bbd8f2beb24adf9552cf5797ce05d9d1a7e7f3f5455017b127d9bacd32bad0cdbd3991bbcaea5fc988ee7aec0b1003732f25489edb0a1f9897247cbc40e60f1dd276259ce19deccb90067f7293a68b683fb5232acd2217b8929859109d6852a43892098630a67d72b1cf4bd5d58e20c5c18b85d69df74ee8cc69baac7da48eb71a160f03b68c6be87a4919736f14363f004ea3f41dd37fd8e621bf433bca71e17565e060f3c0f889515d0a8c17fe0d6d734ff756256b0a62058b95422257780de000557df289f47910cc272a14bec737c0715f204c49f03150082dc904a5d170f7383f04f1e355f50f80d5461cba53490bb2e9484806d369d61fd00ed1ee5be518d04a24503b1c4c08c7ca084902a3942c04143807203287a985eb3fcae3c5309410cd9b9a548f54ded44321ce8c2a04679841daef7fbb6aa11091d240afbb467d9969c31c1cbf6b24f8cbfa20cb4cfa404b1310400271664763e9c1cd1b6fe5ff2a0fae22ab14efc016ccbb19c5dd5d047750db4addea3e7a193128a5f4d7bb6358f21b39a44259695904de3440bb28cf9466b562065c387189eac2f7522c9385dc2a607f6f9335ff8add47c7ba932659aff69b1f26ec8655bee4f97fbc846e48111cbe25524873d1db2f2282d0472a2aaa3cf491c26ddc5e1be77866a3b692e417e6717a4f4454c56f97f063b9e598865b6f71136d65ddb0f3cdec57decd5a57366ba96e4315a88b4ea3479321468ffff508d23b0701a62ce0cbc0fa37c91cff5c5a0433fd61ae11a922575f5baa714de46a58d6efc79bdb10c9af7e9950a61d44b3e17e3b5298501146485b562b1570ff5798b47641d67091cdf90902b2d762e3efe94c540de4a28269cc416edbddd4d43ac2fa82d638dd9bf11f3bf22fd81cc4bd4759d7d864eea0e8e8ab71796254b278cf9b650d1fef38b8437362b2d69ed84c54498331c6899e20c596fee7cad9ed8d83d86774afa6e56a4ed34b0b0842b21ccb67035406dedff0cecb0cd089929ed5ffa0ce210822444808bad99af603082bfe5c98ee4653349f8a43db64cf90190c96b0446cc9cd23e0d75b47f54a731e8bcb0a4c67401dee87876011033d2a526067fb73786fbc1ce696130fce5d5379cdac6788875d27c04783b1e2ef41063d57e3d6560d1ff48882c39131c95bae5a9c9392dab6cd17eefbcf61c464a4dbc08447443cbbf3fa80481f3bc1a5806042c07f7a7ad435875ddb1001565eb6b7b872cc6c853f771c1dd5d9c16bc27aceb3c7690125c1907c7ce904852108cafe76351269a3d3ea8812fae4fae35f0daec8e8b186f760005524998bb5de475e4df85209da915bdc972218ae7db7e2efa05a7d752ae61cf2f3dc26ca2d282c8e32b4838524be460971e077348290fa0043fb7616d821a71dda3a5fb76bfce0dc84aaea432df32b05133a26b46165297ebc45024777a868b8b1b0dd6f97658be799bd366cfdf99861e916f7cf06c034e4f79594f1bb6ecd9b7347911488928e1e473c4b8c73297f7ed845b9ec59020373eda57a436c1c9d1459c6114bb6258543d8f4f97b10aaef5a2e082ea173ee69702d83711fee6aee8f6b260d03ab74c3b5d8fddb81b208e16458511270dd1da295f25cde7e44a8349b60bf0c59d4b425c1fba60d2bcba47b906d2830d8d5c091dba756e61620d78b2dff28407fdc9da9113cbe82219bb2cc05e11c70d040bde821aa17b3e981558961ca571e5d5041f7de047a1727d9c904deebe561dc6dbd8876bc77c27322f512d6171bc03871eb0fdece70f119bacb41d1852220cff26110eb0eb78e39aa1b2a4c2e78679f53683520c5a57fea71a8e96e0aed33118dc4bdd035fd88f535b011d9c7deb6f406a072ae6c091016ed10a5a4ee9827882ee27c535262d1d745aa5231736f2deec8a6017bf0da36b416c98ab71c6824a6eeff3564665007c9e850fd02a1f5e201b534627b92d21a493df293db9f24de70c7b49a6e07acf2db6c90b448681666dcda318c08aad08d3e257af7e774c75debe3b3c07af683735e87f205b0fde07351849c5afd07d5722c6aa17b6ac2cc3551c305e6ac31e3601a236961f6618cd3a0f7dcf6f65b8ec82e27e44c8518cdc16ecf79374f796a3daabe2d5005b25576b35b021497c5a8f9b98da68d80e56a1cc1044c04dfb11d36cb147eabfdaafba0a93fced8675d7d6a9f999785c0e7346f4c68eb17c0a2409e2f5bd4ac5551ff66a9857c66f642f2a385131377b6372884c417e01bfbbe1ca748ac8969bf2c0bd8944767746d1d57d862795e8ecf9e8a5ca122d0259ffba822588c5eccd14cc6ff4b7354cb572f5bd695ed9d85de131fdd97dd5d6ce7844ddf9f3d112028b5125ae7a77a4aeb2ebb554682a26f457c43fe96d67c90be7e49ff443478e82d3a48680d737d1260b8210bbe962efae6505e496b1b6d4f1042a7b971605e2dc50be3bdfecc3010b9f5618d3a1b2c1f48888b859e4d6b63ca9d29990b6d502fc22b738b203a83d597b48d73c41860e4e99c57181f5b02f108ca193451025f3b368cf2741244f42b27cb9e57260d2e127ca166b32e0b9c927b247b31619b1d4", + "signing_randomness": "78becf9804af979bd36022bcdb8e2b5d5a5096a3f0a3fdd0e82b0d636cddd1f3", + "sha3_256_hash_of_signature": "45277f86d70f2478c4788c65f4a5abb1fcb2189e2b511d31f6ed06b2c4b70eff" + }, + { + "key_generation_seed": "b0d4ba39adb4e8712b3a3e6495aba2f04a29e45c68671a960bc0d8d89900c97e", + "sha3_256_hash_of_verification_key": "8fdd525a8a29c743a554d10ec88ae1824edf40cf7c72f5087ff711a34c35f77d", + "sha3_256_hash_of_signing_key": "00a390b30af49935259ae1aed7cbfd5bb0f482f29e78b18c6a4a36ed1a120df8", + "message": "836254422c7d13f1120012fb9cc7cdaa1d8b72f6fa3943aa7de75263d3df814bbf2e80c3a204bc0f9ae33e4fa82ce893d35c57e41c7147602be12455b00b7949a3195264a3281cecc3fde34802b28c6e1f2b505ab6087d453bd6aa067b2370124840bcac4605ee4f14edfc4b4ff19a4d7a828e60156b49b4027ac18dccd20294f89ccf03d0cf47bb2f22d3749eee69ee17ab5d8e4dfccf36824d23e3f95e959d0494ffbc712ce3975e3a661b3f9e149a0234f691c2d820000de97cc016c43efe958da469f740610fd22b64d4bd2e30075e22bcfd4ab41d952d2394fc629f016ee1cd61aab4581f62a7b8648f8f8cf02462c81023cbe2755c91195a5917fe5a8b5058ecb8daff91dd3f73fe38665666dbf79cf6f203faf94a5ca3f3affaa2c2bd5f5dbc011daf46fd7ceb74b5875e4b5d80b6edb9817106b91865267e78731662218c8ede73e588256fb1ad57232aa5533d25bfc54452612f0c2aecae6de19355e1d508b888d18ff9f6d7d68199755cf5c210172f65342269ed96c77d80af8a244b43a99deb49b97a6f358aadfcff6aff72ab39540d375165185f31e0f1a6f97722ee365620bc5d642f8cdc59f7e84fd8615f4a336ed340be6ed8451997d87b7904c1b9a3a0bd1f8a01afd6a2d9f5b995e3fd0d44df8fbc8389b6cbb5537816c91f0efc3d2349f15eee747b254c5bbf9418bb979294423dd6de4d13484408362582a86d082350cc79ebcdcc05b70110a038736034ce4f3dc1d17e5d11c9c7620d40730b61437906933193d1272f7c89c701d495ed682f1335b7e1c42c994e090a67d932a8e825f4b9eda8f2a94b9a1f11f10e91396908a9d436dd01bae1d1de2c6acf458c0880e3f81adc2240a99e6083c9c188982713db243028ab07df407218ca6b3c4c93989ac96d92375834b915b724f2a105d6240e52b9d7003c67ff76f7a325d84abbc229266bb40d1dc8784ce1a4a6bd17972cdb26c274b06337d525f61b5bf952d23fa13757460b7b8a3b99eb023831f4fbef72d62931348622041ffd12634947579bc6e16bd1eaa8e8b2dfd54d74efced79ef4ff31ad42036debd0fda3b7f3f8e7a3f45955f82936a67122cd42e38af646cf565e294f422fac1e7d274185896f58e9d0fa1fcd3f4d379ecf5b566586246216556939bdf86d6a417c3bf77c64f95d7de8197ee25b44eef00209d33159710df001372c3e3d09f24b9b08b8938c522690674a7588933e1ca37d2c14df50777806ef6fd2285771a44f6de90475c6cc314df140c3962dd9d70c54e58cc5fa3302d69c80c6511d9d42a51b7cb7fd7fea8d8bd65a66fdb2ac80d945fb7ec72e138f5566ceb570968d84b60068df20c6cda2ad48372dc97424793fea8d2136923070c25f47c3d10839d1747b613b93530968d5e97a3fc0f563bffcde7b42c839efe66c3a8655d0ceb5af7a37d23dbbb52d05cf6fcbffa7c7491703349819ad94ce218912557d6c87937b2e7b0473856ec78713c29a02cf7b2b38e0dfe16804af6c2ba8607026892138011e06b4af179d63dbd97cb917b6507b798e58d74f485d3f063c044211e428fbffd5af2d7941900299602d3b15d5d600b435d9a21948b8d87a35205a3af9aa9ba491d56573a93c35af6683655e04a7a17f1b9709ed83e70d82a3df59a2fb7c051abe508601f322ffec089c49dc666ba04366c038ad59d397022f0f6344255f4d98bbb17120441cc75107005a74db35459c63770547a4afe59f2703894deb67612448ba7c4f6feadc1717f6ace410c6be62ac319cd33af285d17d55f500e364a0abe71d357ae0802af464b6d2732f3fb94bdb3baa497f2e44727bdcca5a4b65ae9df189ff1ac640940ff4d479a8072d34ecc523dc8fc7c87fc89a540485ae7bb3f29b041446ca427c0b48ca7515a1e31788e8b53e1122d372b6557f8d2a97cde893b20e60283954e2934af340a358a4376dd0cfcbfe305a2ce7b72dcfe2de105cf44833f548d1bce88d34b60bd29b69309dd87f4b91de10ebdd7d7f87d6231307d0ac784e0496db725ab97656c34e60b34b230f37e30fe326296c4e1bb88c0bac261df0e5f45e6e126103eed6b1ca146d58140a8893d847e92d9f3a0a883e8bf830147cedbdc7dd42c1a58a826a8a827f9ab26eccf64f68e9ca6b68261260b659b47e0dedbf5b077982b24ed9b36e8466dcb21ee69b5e2bccc49a163b4860ec2ccbd65032776dae601e18ecdab8e35c2760d5758592f6cc074298a97fc5e82e7da84036fd10e0725a0e4e58cc4db30499abec0c7d95d88bac2c58eb093312779bc1b8619ff2762fd1ff009273456d829394664c31ff6d7848b27174b36e59fb65d6bef6d974d5038a28f49ad465b28857cc12baaffabf3652c2e22b46b040e579fb040a0fb4b1daf0c157d35407c0b78e305ceeb232e7b7426c95639b1cf7b079e80521faa538e51e69255576650c3a16e143d0f815d2cc89eb00aa13af20394aa23cc6aa99a9f297d886ab9af2655d53816e066a02cf21c277daddef3d7d0825d094fd8fbd5386139757efd0b7f8501829725a4b70ff1dabf2958e07ed21db76266a88483ee7c51a7d215e1b41d2464911abbb1dc71f9613ed5446e4b0c97bdd47f22b372fb7662956fdcf3b108e0107f74301a054fb004925b041af354c04c20fd370ce1a014ebebd8311f3265a2f78b48124521a4aae240d3ba9f94fd33ca4a92d24a029e0754831869b58f670435a44dcdd7bf75ed9ff06dba52980dce49c1c26ba0965de3623f459e36127ac6afad4d5598fc45a95173d039cbbe2cdc7dab2865fb6bc0fa8dfd33c4a826cfc77bb7f45cb5aa73377a27271ae41630dd3d4e2722581537fcfb233e5af8f04ca824012b5c429ea498f4ad44afc249de2229fd7266fe84173a5ce44632b3650d6e1f278625d564b374c10c1afa3f17432cbe4b65327c6b6e0cd2f99b68ab043c5c6c99d7fe7fcf940f4887d309d7bc0ffaa5dc4b90c79266514f46ca2d5477f2b84b04e30dcafd0224170fa6d4ba9ad2a6dfa8ed73dff9d5d40d43f02610032719a7c5646ccd453cef409b4325f3fb6d9b9201fb115e4dfaa0b4d29959a44518774e94b2d4d6d06c7f065973becd203f5cf6cb59f869340ec6baf0121049db3e1146234cee4657c1b821af817da27bd4c9b1103c81f5b5161e6a9329d83d6e4dae1f3299858cd201222d34a85e2991bdcf32e9771f3e701897f647d62729c9805cbf118c9fa727b056a7271a23181b92f033de1ef113a856a884ad527b8deb92085af3db509fdb0265fba3376b31bf753dfa477dd5e247d939109f31cd430a692bcec4d9fc7c5b4630cab90c64b75496bc7ca54d5621fe3315ad03ebf1afd6d436bd2dbcbe707b35f916cfc147bbb5b8ad2e80abd692834e42e0724c8b901f5924212c4129f7451b9dd860a85855d1ac59f0b6b87a66b6a395dd81990aa3debf64c91cea6862b5793bafff81677fa2928e950d94a6333b0e77a15ae461e710be70afcb9fe6e0c21c5ad188e439a6e5138a2c5ad17126e759d48491e3f3f93f81eeb77b7b3a6add96917cf0beea202eea5adb3d5593a3dc9ff1f8f05dbf5a2707edbb6640eff5b65a0003cced2eb480942a13c1f1ccdf9994f1d11dbef0d3ba7c3801aa508c17bcf287a928b635f475195d88adf9f4c1ca7d3d1462dfd0f6939b89e5ed95f177bbb12253391876492bc01aff1c1daaf0a1c7821c2a4e33f52badf51987e010b391fc984328e020206ee98e9c8e6763120055f99725e48356fd800e11ce973d00c800c353a5df8b028e1e42f817c7433084c440e47532fc639172533df35f0ff43257841c3e4ec7dd7f601eaa81e9886fa3253844c195a62f89fa5d292536be8cacd80c94bbcd1a83c985936353c9233e512431a8863d7d8340e89307547bd10b16bf2c7e0bb01ab8093c70e4f4c8fd30608fa14ff072d81048391c07ddd82475a280d4edf81f739ad1a13bc6483c3c37bf52ed52ce8d568aa81864acabe225bc6467c79fbf43781f29b0c508e6825d4e56d25e45a8c0c6298765069fdcc66b2c5492fddfff69d6f5975fcd81041f30ffd7813ba3219b3139583eb588ddc57851e581fbd5e20127ebd", + "signing_randomness": "dbeaa87ff265e2594594bce653125b5235dbdabba4586bab30c34b5a3283aa26", + "sha3_256_hash_of_signature": "1d19e31d75e875f31b4de351c8261b9794f5ed5bdee643bf7eacbab60ad17780" + }, + { + "key_generation_seed": "e04328a783c10dacd96702d2e726bb11ce4ecc571564ce7cb10722d1c98c2842", + "sha3_256_hash_of_verification_key": "6412a141f083a3a9448b2c2f1091ab0ce1aaef4d24f1a9a92e3ea4c95900aed0", + "sha3_256_hash_of_signing_key": "03ddca346e330bf3e1615df1b906ebc9ec635554ba7723d1f14523f77b24ecf9", + "message": "bd2b4058218a15c008a4bbba29592079583f684fead3e6b3f09abff0dbca23670ae4496077d47945e5f1ac3cd4add5763581285d80dfb43bba9c0730858293ff6a15915ab203fbe65c118b87ea37dfa1e06cbc0f24eba3f43a8be17ff1daf4277cda2cae8aa924e852c9d60524b98306927746c4eb26dc9475e8a0d0f920f33e1aff9d07ea5561e70865b2d8161b86fdd7638e7a72345dd72ee95bae1ebd2c24d2a5510abe3fc2ced397a067d215f6088d63fa63f2247427917e5c4fba14f0a22a04fd0ac1d948507751f3523be2b0a0cf2f96dc61f8187adf646d6914667759d49a6df9a327830effc9470cec6c82ea127a8b0c6510203879faac4323145931e146d962846bb1a6e84cb2c31bc686e388c853413ea7d3ebf7c752c6aec774637ee01f2817a5af133928af35f23fc3541fe7fa749a863a048efed2f8cc2ba86520b97fde0324c68d1ddde1e430c30ded0b25664ea676aac6b1f22925a40b319caa37dd5dedb99de4d963630a6fb0e8b00ad8f2a2b9bcc497a00099a70a9dc190a2ab2a058930e63fd6df342a625e9a095ee79137caeb8885117c7a9fb8df7a35d5a300d6f7eee40578a7507edc38a0d6522474e672f156fede7e1690c3bbdff40342f1f3ad3c34325bcdbff0a68249858c777551683a9f3af225163c9323a4ad5e666e0a9f44c6496269038aac5dc2767966c1560c5a09207406f3c47157d2fe5909346d8acbfddf3e3d19fe48b7c60e1c8cfb2eaab19e736b2595d33a0aa034726cb6146a01ebf5cc72eb1182b9a4bcef90a1aaf74079862cd775f8f773bcc490f6015b4d5469ee0bd95c1a32a1fbf283fce1fbf6f8cdcfc1884f4d2a899f3e7a95414de419d56462f502ee703cdba007c3bb78f20243c35b882c90cb7de3cae3f0468079c546645977347bc183fb0a6cd24481391cbdf9372e2d6765b6caf8eb0145bb269a47a1b4e2cdf9901d6aa284d919ba57163ab9929e715341bacd81f35bdbff36d59a1edabff3cad2c122386a6335348a3170337b94e4336b2b74e791981656cb5234a6f84db4142d3f323000fa98be61527f7548dab6e83928e9dd2e461f08a5bb52f241bb42254e5746fcce0f3620abc69a6e275b5e06a333360f9b809562ed116aa6cc2334694aaa4169310ed6af695678de22d3e551daf61c0a6c5f6c0f36fd3469a3b977f6d295e75abb804a43e1e7ac4708208a94e8368dca40856f1d43c9865d98f69f1c0ba9c8b33ac9ccd18d400d2559b1cdd82a0c875b5e136b97c02126c81a81eb5d1e421221564100450531dbd97bda77c1b0186527ecf526ce6bcd0add5668382d984af9277a21d40c06eb4bbbb0ccd6f64e90272fd632d47a388d301377ee745fbc9cb4c02e1f096ddf303bca4e1fb4b6df867676080cdfa6a29cedd15003ee636db8c74e7e293a087b1a5f62334585369d12d9876ed0f334c6711146643fd598f0d69bb3475d219d1f89066644897a9cc5630bc84c0cb5844087216038c8fb6750d0968d3d3e2d29d93639486c76dc045900ae1a13529e74beceb3338684402bbc3eb36870e0b37584e9f309bfb0dd9b966f0be1298dfe55d1a94a6767cae5eb3120133b7d7b71c9f2a538a97f8548fb176b0e8923b14af28ae26306214f1d392ae63c3736b9f9374ca10ebe93370c11bebeb45d066477f374866c8a7208ce6dcec404194bb1f833de0aa4700ca29681fa0f72d98679dc3e1e142852347b01daa08e5cbbfd242f7223600804e066fb5c98c8358370f5d390898fa44023a30f824f1c6a95b8e23308b4be474d03e34cf72be65f90d698dfe0d2828a797bbf8397ec87ab9ee00c76a1c7b3ced0100d3a1030136cab9a69f05cbe58a4a56a9c700bc591b87783de59369f2e62d5b885da09f25835a6dc06f954c19b347724244fda69e3356a4ef60f6a41cff3bb7cb22ecb128415cd1b89a9aec12b66f1ec23b14e7d7fd601ef7b000a0c96f386216f75710eb2c12817daba1d1295e7535331cb90a9b0d8f7542e73de2d93fe554063f57274df27bfb39bc4b78b72a88473408086d8df531e53b5be018e076032d1f8ef86d7afb8e8867b9d7728a25acfb6856d83592cada4494977678a9f4d134f49a8598a8e0f23d3b7a09b5308243410ca6f47e0bf8c43871600817460bdeb74e7d32c2ff7c40ea4bf924e795516ff7c7bc8e5fd5d64cc489f1894c6bcf0e9c312b1ee7e2bc68739372e7402e6aa2ecdca39c18d7441f0ff373946559c475e37d4ada64b98283e5a64be7bc2d1a1c148d2cdb4eda35f591d3a7e7ce15162f50ff1b025f87cbb82289fbe7f9c32db8f23012cccb87aca7d758d42019b9a8c15f508cac9284928f46f0dc1c1b6c6b4da030db9286ff8d3762ea4a83d096ae04f98e9416d3dac59e04f9e4e4359ad76926bbd9570a3d5811f69a1c4345b646bd946d0168ed62a7a431d920d707d8cc7e840bb9cf13d8abae8196d9177e8c28ce0dd9ef647eaaf0d3c97e52cb31b560ea7067b45aefb5ec2b7c7bdfa3996d1c7e467636bfa1bbe11d1ccf86b64ade9faf9287a23502e9ff711ca97d6cc09de814a67ba6123a8e4e67cf6e8cb6f7b36621bc6192ecee94d61860703ac8411b16e19644a6ab01813402629af52301c9d76a94cee22b1dca49f13b130028991c8ab383c8461433383da92ab34f1ebb4124b24c6c391ea44ee6e736bbc7a2d4660a878a600ae39b7dccaa51adbe90bd705ea51ad13c05e611749d43de336d396352cb0673abce7473decb0fc708ef28dcbe18c85ee0068fef64685acc3a7d0da9a21dd0afb10b95d81f6ae437022218b6094ce35d01248ea85a9ec6fb56a7a2a8453eb03e6ccbea0f2eadb015d8be3d09739eac07ad9e3f17d13e5f71cadfa220ecae90ea50bea87b19ca6fc5df31874d51723becc80c8845c9ea718454d2817ef8afd99b63090cba6c8089afa78770222fadee3b3b829cf36a8153efaf2cf28dc4651ff37a8921e402ef81a0f457fc1802ab06a759bf4071f082bfdc100ab612a4584b5ae19354854101ab0173d7d6a5a0637ccb58ae58978a8befd5a2c51d3d53150c336c0c0c2a27b442e2bce120c4ccf8d97ea4584434a6f48c0245b63b2255bc52adad4eda9279412d70be457f7dcac492fe53c06edeed766b46ebc3419e6da2a2847251f75c62a5fe7ae74f0dd5af50a447da6356dcc828c5f1a2c0c873e57041eb1158296c038b91f2e13d3d4b2887b284384a9ecb8bb378bb311f4abb19e1b90eb3a399c03bfb4ccb29aad80c55c1636559fc79a6c894b5bad8d529bf680631541a45eb0e57ba5b458a05f456c60fbb593dae90ae549416af96642a486f10843482afc3989bbd1e8e4ddf0791204f4b720abd2d8995c87c8a388ecb14860cf83b7a4406fb6c8c9393475082d24e516c5f1af91ceba444d8e460d0695746be057ea8d76f8c0c80358f3db2ae5b996272737516ef5e4ef5a1fe5967304cb6d00090c9623d29f0d4bce8ca3cbd54a30f9597e01e5845c1cdd8777e18c5d5d86492fdd0606f623d11a28dd9f02032e3a378c71b757b52021dce6ceec63792cea24d6dd7150ac8fcfca6554f7b08a5529d59628d0f35122504dd1542f6291bedbee09f81aa744a0f6c6dfca6207fbfab6b9e17e8a4040741f6508471e72d227d0fdc50c13f444310245ad17bf819ffbbc4e0485fa68cf1f0a4423f251538f25da989abcd008c803d368f626438432569f12d1612370e4c6c971079371081b37d8df7ee709198aaa2fcbd443b96732aaa4e6924a461b60ca4f4cb13e88d539aad709a3db84d2d6d26671a9f3877125b7a358389bbeea846a32e949db9a7853dbc7d5add92729ce1b5c00680974f3ddc6a8235c7319b6cd1ce5e0b66fe7c2f1115206c42b4c02990d79efa8be94927543c19ee93d0ec8811f9330693696c878cfadaa2d56e877d42a3680ab2f6a576fda7bf7957f781655cc664a0a4a0d16ce34d04d7c98a9e0c93d2e6d42870fe66864660b564ed4f881693d466bd68b6470af03a5a6e703dbb40515af5dca7142c4c8d79f5be4bb01a1b56be9d0936396a7eed9a84da86a4f00dcf676b4942d5df6e1378ea26d9118a54e17fc623b83aadb417ec82f9afcaceabbdcfe2f0b6ad4bc1601b4e24f547d61d1c1737adbcb46d98287372c", + "signing_randomness": "e5d67df73bb08e2c77720037ee0b4b671d14efbd493cf3f935880dedbb2edb7e", + "sha3_256_hash_of_signature": "0071a4c1bcd5a010dee13acafa73d30845210273c4064040e658393be2b6a764" + }, + { + "key_generation_seed": "cee2e53099d8cb576f8f76c5c155470f87a6ec5f7d73256a0a2aee62cbc53597", + "sha3_256_hash_of_verification_key": "5e45a02bf595020d54b459b8c3721b3b386679f9fd052b8c24e592c07c4a3e94", + "sha3_256_hash_of_signing_key": "2ecd252dcb95d09294df1cb5f0d6a25756d0d59cf3eeebd365d14e6f006b6e4e", + "message": "4d83349dd620dc2cc0e9ada524b9be9b195973a839a042f4342d69e6b38918507a9747fcdd8b751d7c75abce2b482b3313d4c74ea4e7a4a91f2e08a059536b651508307b7f4c3aff5cf1579f90f32ba1e847778673e3956713c14661afa2d11ccf61fd8f9bc914d4b6e6d09c52aff7fefae325c180147153c9ae1924c9a2b8de4900bfbbc6797558b000c5adb9a8dc4cafb458ad328f19a2c55d5434bbfa7be5057e56511529709992bd6527e913b46abe38dbff90d4ab3c024a66fc0f8fb34afb96e22535a0ea8f313a087aa65355d7d5989c486e103fd526a7a6d812c0e4d8c081bcce4dcfbc64b68436739451be0c4b67bfca71be955ba9f9a23c223c7d0ffb1b2196c9c9845b6af341a363951e2008bdc4f3296dd0e1e3f480f2e4b0ec77a002eccfdabcc58d24cb0baa26eace96decaa0f6bf1cde0175afa65ad5c23c5e71b50df778208edbe426aa6e876c12440d7c4fccb42d039a14509092784baad37d9b8edf186cd4fcb3d9f8b0397e951777d602b8af613060fdab6b358302b3fd28437a06694f36ce12a035f09d677e48d077cefd1676d8fe51541bc19e3a6d6a5d879c4f9eb4713b7c0f3a652f3a05d74dabff79a302fdaf147531fdd57924f49e52b298219b03d6df166b481f232fc85c7cf52838969ced2dcfc18dd8c95891c498fb49289d1a982922a0fc02c849ac3bb7fa92cf43a64464d5bd919f75ada287fe657bf61dc07b3808c0fd0d71ea24de5353268b2c17c989c29465ba49111cc479f51a8cc623cfb6ff68149e52c77a7d85b5ecce66c05900ab9957bc7ed39e03649a103b5b6bfeeb168b7c1f30dca84aea509fec2b215dd95558a2708839396552f517a8fda28c3ed61f84e1b2e0dcdfa708de50d44bfc65bd4e70260c437c8b5b7158ec7e2301d9c7aaa68e0adef89fdb601711ad2998379145b29ce3681b513dc3ba9b2eb668c1b53697833670466e21e767361c0a4362e5b8ddc38ee6a9c4dc5205eb808b93c72ffafb635b4254e4f4496bacc753c8ed0bcaa88db683ce77c8165e8ddde665392cccd57bc07573d83cb3aa10648281efb08f92aacd8ab6f9b5d7fc66d29526bd57e421220ffe375b26c61a0ddbd9807022eb3b4b681a43e7719f5ec255c1e19ae6c542d6deef3b94b6960c18d0d7c8110b88f995826073b874042faf97f1ff034b8257418ca269f5ca588223393b0179f9817e08e7212d0d410ea259ea66bc4a00e7fb1190a732bfdbf7adea0e4550be90c3e37bf33baf436955742a2632aede259235702ea2e079d99a22c9755ed34c1e3ccbe746e728a932b1852f692b103112b303033ad3ce1172aa066860df570d21ebba51fab72d5afc4ae8995f532ae384cccc3c4a295af76a803fe076ccc920a80d82a9b614760ec43208579ef5dee164356d62ea33953e55195eee9b2e2018e6fd9d19a9f49258702dbaf6edbfd093919917b1b6734f012e2beb4f758dd481fb8a8d7796e755c6647501e28862b9f5b16ffa1c5d80dcb07141806fc348881a5a8891bb632a4ae4292a102d71504d0fc12c79d15bcd0799d30c7b9e72625a7df7dbc7ecf9eacc627ca9ae5d71e264f2f2a9d5db8593f3a90f3915ce480adf800c99fc2c8692f2b57b492bf9d84171f8c29af8d5549f82d3730927096ca18ff0b0c0c0b8b800508c44d5749b92d7d48f7fbd5c86e408ece0eae639af475073df5ca2cd5083bc4ff8852ddf5c399946a6b21b0841d137f583e0dda3a6046f082872b783eca3e14b21a2af61bb150847026f2371812b1a2be72024226f4613da860ac2ffc578dcb171dc27b896eefe49f885f9be4cc8766f37038e01cf20dbb661f507b2ecf2b023203a6259b0a018fc00b2ca9b3107b605f04388d5493ae7cc4bdd093ce761a92847c2a167739e0750b427b2aceb3abc5ff751a5f32d36b589787d4da509c85ead751353ab2c68a9c14b8b2c8166aeb6f27c7f101221c306aac74aab6b4e795525fe12038725d7af3d2a6d60e1ea85f2b94ea24f1b72fed9ddad4c8e5da484e80a2150de22e6adef41153d7b4331e8f011a3cd48dab02876b067312d0dc736e465f99ac3c9c56321507e79accf652e3857c749ad92dad15350a6b4b67229a3905db18ab2053e2d4f92f156a1d76d0aa891364002c991e632b53fa217aac1709f37f3402f43b0753361eb2f595f9fae3d7d96ff050dca0b9657f4c3ab49ebdbfe8816051c4e0aff32c5137749d53b062cb61f7201171b5dd716e9ccb38d00e50955596845dff602200b30d375a854ca4e9a7276ca1a1d9ee92a04bcd78854be251f7080aba6d8325d40b37054596ad80211a50afcc1dbc177600a70e648d8beb4fcb8919214894cddaa6d63b6f6c445469a6866721d4bf1117f25dff9d65fc8fbe5b0acc8b9039c7f94b2a5cc6068a0489e2e13a731dbe1094fa8558a601addb9e4dab04fa744cd5b95a9d57c52c8124ad950a5944dee2c55e5c8540dbee5823daa624f57fd5be994bab3ad4e74ea9443f8b6024bd6b49adf3972442d88e61e04fe8478ff28916584ccb65fb15686991d5781cb7eda067745258ea671e0a2665f94fea1b5490669d1ee8711518bb911094957586c8075e3bbedc47be059053a7658adfa0aceabdd46e0dd9647b34eba32e56b6305653ed386c50e79e15084f00f003b1d12504fdd8e47d03d9f7572276047bd22b82b8e81f87c86e6f20d2a756b16f291179a97b010f993c0f839c9a1238cfc9bde8074405cf1b35df423c7566ce965681f21c969e4f3f8fdca72a18d5daa80287f53b5f8429fea81612cf63ccf1b7a13512db4d1dd2678fe1189398032eaeb4368332972c728ad726b7290302c3c5acab6e73432e825b9046f846adca9d93780a36095aa5c51e354cc6e9a910cabbe59130e98f4acb3cb6d4efda9e2f78748ed58465937fc81c548ad038fdc32aec46b078cc5a7207658a9706f1c9653359de6c4457dbfa71d300f98f9bc5daa14dbdd5ef20dcede7e9d3f7da5c932ac3338ba40e46b17d89fe38f725129991983d4a81321b394f2d7b20d66e3deaaeb6fefc8cff0b68a766e27ccfba66deddb1f541deb3c1892ed2ad5d073162f0dd06b82e8878477bc96e03101c9b5d9d0ada10ec060b45e144b31e6b4de283fd43538b47178398fdd15b01ed421ee2c65847f7a4e9aece2f1d13971ffc0157040782ad4b591dea0906370820dde1000490ab1c27c03d02a0f4b4bfab0e56d7257288441cea63175cd6bd11382e6c873154332e627ce82e37c63889efbd8537ac35c21ad7a09c986cfebf13b19d5677c1104b373f3b55198d075aac608145ff9d0c4c12c83bb41036ab32227629eeb4922f172281a66c23c35b8a3e92de0a10d5e8c18b9a54d6c30230f3a8263986ac535b6bf63eddaf6a02c9100b712ec4bd49851a22af0e647f259c2e19b9acaeb6147c476c90745a353f6252ade8212a9f7c215c0b3053bf2b4e0ad225e8b344ec14c1b839877349c3743e8337d9c1eb128b06939c5a08f60a46fa700723eb6652fc26440d9bda3c99c10ad0742c2f039be6b66749b77e14f8223509365053e87ed870fe3906a16da6c62945dd2112c96a23942b1e14431aeca7dfce3fd4d6633e0b661fb34b0bf05c4d21e689cac9b6abd9f507f08e4aab94bbef1c629c0e1cf344e66d3a3e100b615bf762dff0cefc5e4cce0dd908f46c94e7411a151e713fe0c18ed33c4c03e55e12c0ac366da5c757c7090e0f94e2c34d93ea3b226adb2979d23e071f18c2eff33bcf41baaf52f4b44e38675dddec89c7bfe858bfd1ae70d96d0487972d70f8d8681982656ff734bb6323aa91ea14c6330c71783d235d9f094cb111abc4990319bbf163891535aa5f870164da65fff395db68b390084d4f2448b98cd56103e49caaeb6cd040c3aba8290284e9b2bc423117f4104d89b1b1607c6d34ac30aa9e79d8753b97cae90ecada6cafc6100d3d6d91e20393e0dc95b981fe0edbcf88e046f74184a96705ac226fd26089468e432d525643293bda781b64bacbdfd6c7301ac42aed7dbbce7abb9d67af315bcc3509cf03523fc887e27edcbd7c74dadfd0f126cdb49e28ecad38080f18a775e6d824c18359935d921744ea72fe293f299b530d9dc9285ef174ee60e2ddffccffe89960baba90d955cd2c96672513c758142d29a1ad79ca9291bc6782b64717f11a71e6d65a1a71d", + "signing_randomness": "608d2f9e284f6aad9a362af4a3b89cd2abee755a0a286e8efe4f973f6f24659f", + "sha3_256_hash_of_signature": "c3c79912edcf38c09504b2dfd9caeaeab2e3359eef964a48421e3a2cc6eda3a7" + }, + { + "key_generation_seed": "02d9755c369932e7f99a2e1614b03e2c86d713563785965e008ba987a6c89f49", + "sha3_256_hash_of_verification_key": "2c1392957fc005054ced1895357d761ec661afd88779c89a37894b936b11b00e", + "sha3_256_hash_of_signing_key": "0ebb76eace27c8d4f603e3bd0ff515c8ce51daf4cd956a729e0b99e780a04e7a", + "message": "e0f434dfa04ec225ff6b6db802a047e221bc064e5be89a5fc13937ae9d3f22b4439bb1c1bba01547a64ab3e810bbb09706d01959e2e906a69ffddf0c56726bdb58fb039d66ac5d77c7f0e9a8617b0c69176770da328d38171f39b5220279186250139922c0dd0f7c3f96d48615fc66db7568810931d257b230258ffe9cb35f87859e08139ebf7432e948ee3f962bb9015cacb8499bc69597abae4b841b606657e2e3c51ff5a8961ad42177a9e73950e3fa150439e2063b6555624a6d8e3af4fd5710fbe722b8c6267ba5df56846a085c56444573d692d5412cb70e443761751e58c41953bb9faa3ce1f4564c825a02f0e1339cd659ab1480804dd2e90e3086aaa292db39c6e2aaf1b001b47a21cc721c0c502c46ef0479bb7d8cbdf8e9c136397febc2d83c0fdbb3ed4fa6868068477206a26d2b7e0d20507aecb2756b888fcf5b446217de14ee6a20cf7e7b732fab22ca3abbe81b2be18463acaa3132773acd7476460536111cdcac98b1cc9b2c36aeb3fb318340f7397b4b4ad6aa87eac94ab7d98cc12ea5606162877465fa2cad276cbb5d36c40a0b014c53d2d3a96825e237342dfefaa6b9456b5ff1dca859c5976f77c3d3cbc9df355237ee9b4b4c90a9dd941294431db76dbb539dc48669e7aad21808332c8a4fe98b8f043fb756b526890452fa3c3527fcd584cd33e38ff9ff783538d39a184b7b3eb649e1c04c289fb65998f6cf5d5bbb0609fc3403d85c6df269017032cd24ac540e1b294bdd3c3a0c7117cab02b1a0063a174ff26fcda687433a667322320c0dec1ea3963f3b14375882b3478aed43c2c74debfe3a734f8b1a5cf92007f8fb627cc3aad5c6ae4c31846b72e7573041270ff40e762c0f8dbceb7512d44dc260a97d5ca7d60699981ed8476d8651c35c8ed498fc2961d1e38af46f3653630773209a63838a9222b813c23db0cf4196d6654126ba2b1840a7180e653b3d6e10c4c7ac3cee93b0399d918a52e59f0215b09a119e634e6e8a9886c877f157bf7b7dd827adedbaf03c718ae037c0b262588171839e952721de72180f8eed00b01f53e098b82165199c53129576036fc753a3d33aec92060dd19aa078a496a2b214b1bfbb747a1ec64071b0a078d74d0212e6203c9698c7449326a42bcbbe8d9501db916c64307d5f1083bcc36c0ffa18c0e4410b0b17d443481c3673d17bbd7a366a5fd1c3c5b3391a02eda7596b4f869a91a32b5a02a05611371231be035edc716f534724b5225e1a72a2b2cd357f4c326f1dee963fab680721d40dd70b750a019e70885515f43946a0dd3dd042969139f61eca0e9ee3107d3d28ac606ad53f236303e1fe986c38825318b7c4597b14e1a83b81295fef49fd0f2c1e14a0b146540d853db9706cd224b376343317bf7330b0c2721a409b856304fffe60c24c441d5e2797d4696c0fe046d305aee93cc6a2d89a81eb19643636a8b424b310034612105df16516ce9607cc0a2bac5835642c6ff9572191bc45e44d9b40da36b607f570ae8c39d490342786f31ce6764f3f7a764665b6cb93e54922c6d89db566f494e0ee069811ac82e8132f2f388d68490cb1c2172d2979fce3659d7076b4f457232eb839172963f8c342e2cd18969f086f451d33bb774f3d00e6fa2be02292f2e5cad3adf5dec28932bd784801e69364962bf39e25455303e1f289052d2f0cd4964e0ffcde29e7c074e5d57e43739dfa42aad636c352d363e3a23bdd134baabc7cd1621ca638ded7db7051f0456641ca872ecdb4d3c2603ddbbce16637010e782c4bd5230992e2ee7dd904f8a83ebaa7b4c3cee15b10794ace894118304bcda9e9b1376331d2248b802557aabcf913e95f783715bb5e90a4436e4bde7d651397a70a24257c39e0516bb1f548da36c1f1f92a416dc1114107cd863f3bfcb360286e774b21296259756ea6040cb61738eefe29a67895ac69797c640e03f0e9e731647c2da93373920341fdfbd50eb6b737bb0d9fda8ec8784920407d4f41486d8fc616430768d6431ccd789deff332b239ffd1900800cedd9661a55d6d96089007e9089a117f03d7858eb4c3fe2d07e91d8cab88d2ba5421846069fa6d4e5c9161a140cc3a288100bfbe61c3b0f0e820ab12d8fc54b054a0f4c777052495b45a7d1a883e67663dcf50c2230ca5319ab31cd76435dae41ce1ee25ecd3fa0c7e83b0168852b2cab674127cd7bc9ddf9dd4b57eb40128988c7c8994dc6a5fc939ff957f06c70a4056e63331f9aad254ebf2b8fccd580285bea486d91a0c2dbd5823ac8f6846ddabcde25a2252f8da1aeb32e6969276bd2a7f94cd7dd3143f3181489272b1589fd385ba844f90e35982b53141daeaed413054cdb935f3412e31d99c1147079cb487feee85e3906daed18106b8c407bbcb7716ef9d4d34e2ff04709c7457997ad6fadc55a8fa70bc907815805578a11a012c521a1325754cae2e3f7c9e1fffdbd4be31dc534961c318d1a894838e0c33806735dd11e408e500995b86b6ecd20d325347f792a3381d2a45587d9b6ae0aa27533732a6c421ca621aac42335848d9c0dd89f14eadf2f92ec532756cd5697ad752b6260c598ec9f0e9976a950b22daea8b74fcc87f28b5e9ed83c0339e566259ecf06e5ce209065de87feee5d1e9c466004b34583d6ae89b590ead6a96cd2951705ac764f329e28c996ad6db05f6c69ad2a39d3ee230f6501f1760aa41ffd936c9dbf20de3996917322d32b946062a3c27d8bf35ecda22403ab684cdc680dd166562d018d943369caefb9133a4bc4515cd5f9c08e7c22d153f0a7733eb4eb2cd8a74a4c85e40dadef6858c5927b6eeb2b01e9b7ab02f7048c8869991068b00fc19b9545ab42181dd5cb5488222a402e827f60a8d87b09ecc88350032f998e3c10a88d4733227334812ec97c5e5fa85faee1a1e28a58641531b139aa58bef49780dceaa408986cf3c40e226c60531945a20f91e5dc31ec86c9f9a0545e5fcb79a13b9afe9b133867ba7a38152abc6d9f8ee10090bb71e6adc6a6c2513b066f2565138bada60b0bd339f9be1aaddfc90dd272b4146d0f5830c6a53e295c849c15d001176e7774fcd7619d6ef1a30ba93cfe278ab4806bbf25ce4a4e94163f614e81dff7efcb015997f5138e22b80b2b00ad7579cd84db5d1c7fb16e9e8c5d9a5ba0ad0e0a7de79c18839d673632f3d2c7da2062eae844faccaf23590b2fbf1861405ac347eb9d723ecbde54cc96bc4d8ee2178f353310e5d69230c5db2841d2a06a3a4e03e054d99defc6004a6e405fa89b198a901ea1ae9f3112a29f3aec5698a42794e04d74d761e4aa5ad23de271969baf124450f4796da1eb1c01480436ab0f5d0b1b2e6717dd87eebf137420961f978896077e40b2d2ebb5664fd8ad89bb9333fdf46c33ef3bed21bcb5b4697451bdacf364f85462f5cb9f546657b4744edf757daaa4d3a9a2a6f281184c3576b1db0b540f3b36310020bc6ac0c6454a7cc8ec1182422b17bda202729c270194cd6044210d2b98731565812339edfe5a0dad79ba826d8c566c7d25dea9bff0badf1e4e5da2b884966e03fadc51c6d9bcfe877511157201dab48aed1ab038999e5cc3fe58ccd37d40050dee92e0bd5332413a7f0118724084ee5545fb51942df1ef399f734fb9592555b5f32290c53d7e5017efa2b61e29fdce90cc3e7c1b0e545425b1d3e1acb9089daa786cb0122db3ff27ea0367751a5462230f0f248147ebccba2e16d214e9a0baebe989bba020f95b623cb14acaf2be6f157dfdb1e32627133f0d26c7b65a189f39955ee31d9b507b43126b06b9e4524732c8621d2274438db7ecaf736ab7257ced950eb68bb868581649232793ec83379a16f40781e76f5cc57c48c3f5c2989bea803e1b63768436d39ad19bb77db46aae6e8473ed5dfec983f49e4b8e7ca6bf476ab2f0272c0c2dbef1bcb064d7400bfe1b9ecce13578a20b1d5b48133a74c5c59cae0115bc3b50574580bfa99d58bcad336ee2cca5b7994c784bb90cc8f1b9a0e21b39d5eba464de34d46ac0bbe436c2f419d60d8ab13786f9a841b52710d1b49bec290de317b66b6855abe156c07619a4b998cc582e3f54a7f457f1d2839bc3ebac937ad3ebc6a9e6e845379cf1d66d7c59000e3f6cf6823b005728a95bfb0acd044eb35d5adbe8933a3637887cf91ee74bb910fdcbe797b0c6b1b056500542bd39781bdf13ebfbfe949d7ba0b7f31102e63bfc6e22693f97", + "signing_randomness": "3564fa8a5675b141d97e6e832cb5ba14a8472437d7b64514b7a9440b88e3675a", + "sha3_256_hash_of_signature": "4b79677c7bd6ce29c613407704d0a50d3085422a4d6e99f9eb5e59b208c742ff" + }, + { + "key_generation_seed": "2b2bf7cbb0957a86bbec97001b60c7c6ad98a56e94542ff561f78fed211da755", + "sha3_256_hash_of_verification_key": "9acc56e7c0ead6d866f42119e9687b6ac35fad4d59609b746bf21a99f63aceac", + "sha3_256_hash_of_signing_key": "6d128d239a4724d38571fe618a71982bae417d3b25076aef21e984dd9fb8a1f0", + "message": "2601a39b6d7d91de539ef11c3b67ae3eb1607716f587bad5f60d311a9f4fe7f04350ca085eda6d41c4bb6c6e13e376bf8a314ddf791ae18be2ec0544afd3cc27bdf270c4550e9e78d497b92349ac07755bf9167b2958bde919123439d6f49c3408e8d88021e668a0a5fb6799330188e35ec5939b77097e3737c4f664d01d85faad0f583b3e95ede125587e2a79991750d5cf804325c72dc8ddf3471ee8fde02519d2d0ca7edd651eee30b3be335ccf7fb02059bc3a47ee3c056d4929ead4fcd82c8cf49625d5da460daa299718556bf0f77cc5cbadb99b64c8ead4474601fd5c79309d4e63aac392853072619efd7b958f0ebde5cbd40acd57df269a8810776d6dff2e637ea57adbfaa08df8d2581c38cb262dbb4d1f3c65a4fa068539d2056e08dcf03baff006edc688023a20728b227a99fed3b8f2bcbed2e3e6ecd8b8665a2e4d233b78d7c33f6e3bd9d0a24d13c8eacccb53a21dda9e7a34f9a0f031091e65f749c9ebccf3ddc4097a121d8c68eb7883405ee34f6a8b0208ea8d5a3fab53fe2cad1110bfa6e094f78d5314880bb67bfdfbc2df8aa250f1d7200ff9a3247c4976dbd1bbe99df02a3f246e5d466f85ed2f68e0b2de06b0f2448a7b98fbcbf5872bcae71bf0db4e70105b020ff130141e8de86dbe05b7d2a234ce2ea83a38e23a262e46ffbc837e8a71f657e443052e9a49dea4e344d497dd2de2afb4009d681f232bff4feeb173546cbcc4c80c9f85b1ce125be678e5ec62ef04433d55d4b8829b01ac165a440fcd6594f2c0cb456c8a47444ab05a0f0717b8185930d9738e885d24dab98e11ecff7d7a48a4527f94fc4c9d1b9d71f5e6bb39cf92b1a6d0509fffd42e77ac9ad6f50f8fc649b96b8ac08673f78ae8d0ba2b7243452b33aac44b06a2b9be1ad6a12583d3590a3f9af0e0dc35da88a257170d315f32f3a889601d6729433b7ade0f719386723eb2a008634749f5253cb7d9b2fc99a1ae1bbbe7f00a536cd38f8a7237d3992c3897df412f5b1d45e1ef5b5dc974d49cf8dbf785160bc527543458fd9378b3d4d3124214ae5676185794209ad0ee73b063cbd5b7830d00f817ca0d5cbb597c44d28e4885d935b7bf426c1339c500daf4f2033fa6a27a4196f233256650472f205d2c5e00e7087fb73027b0c6c9ac5c1d928ccd190b8a6bb33f512ca8e2369dae6111156de47a24469683f4721a25652ff87474dfd92a028b3ec5bcfc244ce442752a7da1da6c33fc22573bf0b13e371ca9fcc86c76fcf7a1654eef4442e47399835a06336e62952770c6e61c573cfd07b3ab631b8831fe3f5dd2c6df68ebf2f8e02ec9f6b90a371ed5e62c8463780ac453ab6f72d38c8f5212c8b650f63b98e3c0886b6a85ae8e7256c1efb30969532cdbf72184aecbde2a17b9811dd4222d080049c5d36c532cc0e910779d64af93d750ee96bda87562ebd3830fead07a3960cd6de7146603199563693392d3cce1332df35c2c8a2c251911d38e95815ce5a4ce5596e2d77711d87cdd54d22e8f0ab431bf8b24ce9c7bd6d077e436543c70b02f338841af0fb86b5ea4b6a47e27c1d83e1ab06801044f546adada437f3ce7d788a1c92a74ba540664658e70d4f2711979153ff1589792859c3bf122628479c7c35eee951dab8cdb0d4d150c2da338346988d34f8c5e589b231b5e00849611ba09711bd3a0516fd515e6c4ae1e8a3657c282c8120c97aa7a2e3baa22b6eabb8d8212a9a48e7759a9daaa51b538f662a05fb897067b7cf9d2ceb47a1897214ccfc225ce47cd60e86f7dea49e220f7ddd6894b30b66460decbbcb2e42b31f4adf0aacdde544b9124ea5ecb04b03c448b17e8094d489f516d23164d2317d3a1332e0500f1423136c8535d69065e880af34cf7e36db5ff2c18122e41880585b4d188411e86b370a024bd6e28143ea2eae52eb46be334a21a02e21c6755c0182b9a055a7d4c7b056e4930ce63edc79c9fb4e2fbffc58f776086f3487f02f8d1e7c8519c7f452e75ce5686a037b3642b95d7526acd4a81a47112cf96a8da7548016a22e9359198e871dbcc5852fbe14eecf3ccc5eb2fb5ec31d10474df7d63482a03e11f4aaa2eaedb714786e21d03af1cd644d06bb05ff7b3959601580bf50e5f7f82ff42e9cf2ffca0c67ffc52cedc53c7a5c9efb6c21092dda374d1cccbc78bbd9f5ee0fdf6da6ac60c95f7c2e96f17e3c379a52d5dbd1a92dd76d1f5dfa19ea0408e0e7f7867445445cfa60bcefc016e68872fbac9098fd6a8e84731c285570b1beacca6f4728958e7924f7a7b7730b9bdc9aaebd9e045f464071843c650d06c96d487cf8397286f81d93d0cc2008a62ee32421e5231998140909474f6d98541d899ea53714aefe652a3d792e4c72533332c3133707a49293e3b2e06ae18f2f81d601aaddaf2fd09ec59350e0979a5ae2b721771682a1bfb5748d000f9736031ca971288f34993df10fc06a16a6dbeed8cdaaa8127f3b71432e723558f0281459820a0f4a75a3b2716f976bdeb88be9c73f31623050d7c1a96c84988b01d847309e1b6d7b815883f83c9bdb7fcdaefa8ba69e25b824812b7d54530a3ecc96611897661158dae1b4aac112e9ac13d07fdc03dc7d5af23c08c5e4bbff737238fd3f1c06f94215bf2351dce9cae14b4dd4745ac0cd626054469c6a5286ff821ba192706d47ccebc443dd67fddb76797a8b78dd0daf850cb5d181c82298616e1d3a92f7fc82fd256857915773c7ad97cbb9710373299ae8516b8a1d647a13c7be848e0269ed6c8a91dc50d0cad21430a3bc9e718a13d1966a0182d9a24fff7ecbc7876c868af2baf2d8b782172c6719cf140e8cb877fe6d78779e1bb31c70c6c9a6a77529c51cf78a5e4fbd7ff6153b5195817f80603e5c5810c38cf43ca812eca52f73f045e33df4e3d04ec8c5f8b4a7399f6cbbf0d39dc951c476b9bcc002720ce89f09c3885673bba9c90d20dccca4a82ce5beb38bcd60afe2ba65fcfb01c8793b7ecc0f0b17a9da74f2e0fef4c90b5132fd6baf8c010fcb5e8e7faead7f2e0db29bfdd1811072623cee274ef2efb0f7d4191f332aaf20cf36ff89a2edf15f7b284cabbbef46901271d8c1b180f736125c8a44fe164ac7e687e9a58c3b1775238bf1a11f99bcb583d0e3c44bf4f76dcf9496a06f80ca52e24d55b54ab849d3040b4798bf5292b0574672e9f844016a52a4d4e4dad2053207bc97215bcc1bb93271c03c9ad2dfc7485ee2ed399236aa06cf9a12972e21afdc587a6334cd1d71a7539362d714ba26214664e3b4bc39cdb1db847583db8e002a2aab451b4e5bd6fe200730bfb2745d03c82b640f4ccf58701708f724effdf98cb04c78df36b7a866cfd596bf5ea18445eea0e34ed514d0dc2625039049a0cc82711dbbedce339c77f9fa1dc60eddd8d58c8f144b0f3d00227afd8710bdc66d29809728d7fbe85f08aa38aebe5605da29a09cc0526fee84691eaa54dc3744bf5a95275037fa2f600b1f91e502d5d81af48f8ec4c1834fe625fcdf2364067048727559047e07062b4d8a7d3851853bf28be9d2c511451e5fdd9459270328a2612dbff42e1dd34005a3da1226a023162f454923c0337e6c74b44bb27a3b1ac82dfd68b0a6daf93473d97a9e4591ec01a51cb6b47e2c7a85c1ffa73c35e5ce3003bc4534a2d9b16ebf9fed6464cb1e0cc665a451616a62b6a8481e4506a73883198c144a06331224d358196c815c811b103959edca35b26bcf86f41d9c7638547496787885ee62b14af431cab2ad4e0224d33476c58b8b0833bf13b50be2b1d682ca7dd194b793ad2c6e4ee25aaf95459302f0b4daed907a317bcc6a5f8d76ca9aa0d799f8ea39f330d6244bfb9f35e6223a0f665a65f55eab9bcbab446d7fcd424dce87f234864d2c27ee84600ed9193afefb6e7681bc94f514fe0748eb32d32262cab880d79cd4fe5cc963a4f688d448f2db2dcc5b0ca87ac26dd8506512c100273b8d4d902fc054d48d8bf9ee818ad9619f68a8904b613256db78c881cea3373f0cbbac336a78cd91ad9d60126e05cb8c16e9aa8482cf1b806b2f9c57bc8d63bf008ab2e49ede8e788bf96b9f1db2918dc5063f3f1d5b9b1c0327141acc0b4b248ffdcb8bcc127050d27c805e154a4825dee6be9c8d4e42b1f5efc1eecc6a45dbc119afb15ccad19789eaafa8b1715111ae32e2aced2278803b60e2fd63a43317498244a7cf7342342b60462510e19d83240dff5d58e762c093df326ea503fd347d2a92a5a4680d5e13b305671c729179fa21be83b0d83144e63", + "signing_randomness": "2d34d02a0528a9fed0d2ae45188404317d4e5e5dbb22c710fb65897bbd3e582e", + "sha3_256_hash_of_signature": "5c5d5ebace25e7d40051847806a81040ba7ccfdf12785d3629168dd5ae32b5d3" + }, + { + "key_generation_seed": "049569cc5fb969c6eebb8aea1af1fcaf46f8a9e6cd6c796fc7193592bca9cf23", + "sha3_256_hash_of_verification_key": "33cacb578199d410a3e586f88d9e977cd28419497d4c49542be154185d4ddd93", + "sha3_256_hash_of_signing_key": "ac57c2294201d53293ad604a486df2670392c554c226e45f3366d959b5b83288", + "message": "9163116c86e64d90d35cb216fed71bdbe6a0797a48cb915f5a40fc8d31ad340767058b28cff0c240720327e12e653c1f98b5755d8000bc01324db2820781b94c4434fda76223845e0613e2526a95f28fb4a768b1487aa34dadb28cbe8df4fdb510dffe672ff004f37c7ac32072a24c0f12a050bb396ad56346f4e0ba75c0efac162288a7ee8a63255dba5cf451a0932fd56b05e40edd491293e045a6081f6586bdca10b41a6970d8f9a7b3b6b58aa772eefa9ed22c9a24a384d6947770862be4fe45c5e0e56fa4d116b79699ace41e5d9f2e4c245059cd798dd986a3763f527e0c9d5a88a09c4d76d447348509fa7d9bfbf3dea59ea57711a3b1a9352123d4a74df273fa24a89bcab42a6d455b5fe3c503f1ff638280f87c740b9e4c5ff20133cbdfb8d08caeb7de9f26811d437e6ec8c3143c0419c2f5135d25c7f40c7908c03f295fd26f1a03fbc7285196be40adc6fbdddc912b3bc94b0bce08dbc2185ee3cb766325068db55c31ffebe4b1f6848ad4fc201a5fd056916a397abe6a66ff9bb03b037b50ac509e46ca441ed45812e3334fd7036d190a7991e55cb817ec2a63cd800f293277e7d15f086618b55ad395c614d168fcedfb274fdf4fcd50cb976f68a266c5365e02a1ed0221ba4e13e70304824f94251249ca23c089b4d54e02ea03fb7c9841dd30404428aab2519d68cf564d75d18530c7d062496c120a8f5305aab23ae52255ec919eb0cd875422b144bf47f7472349558e746b0eb5493f1fc40abdadd2ed84a8b31221a485052369fd0b552972c9faeb1a78e826ba4dfb9e91e301db589e9d7c256e7051692c48534c6a5e2bf0f45b78aca66d5f53e549827e15d64e2f294f93d43b9f36bedce6cebc05e56ced3f846635ae3c384c3fd55b969ca31e8c625103c2b24e7ee45e92984ca23a331c5b14281b20116069c619d82d6080c6fe35c3a3fb2e73b695cad9c5d3300814fd65738dcc3eafcefcd24361aad13a25b3570d2d509fa449612bdb5b49e0605d7eb78449d1db40660af0f3d8bcd4869b6f175cd28ad72fe2668c3dfc1d4963d0eab309dd50b74b9d2947f86fbe9864ae5d0dc69b55b182ac1d914b11f631193f5f1f897ce52cee97d7ae95631fc2f2a1ae9b672165432eb2e5633b55185afa5e883268d8503aec10774d25d39c800b74405414fb06c55b8c48835577884d6b4f2f128246563066f8f34d76213e0720e899fc1f11a3b0a591885d82c688e40d6b44b54d6c7c6973156e2dd50c40a28d2ebba60f5117d64646caef72974f4b8362e4820ec04f2f373da8d883af27518567688146f16bf4e10969e70be8ace5d2ff6a135db1dd738907ea355fb6d243904f6427d11592672060da14443b55a9089167fc9d5efb2c64b0069795c341f90daff684e566611ea87bc40a4c45f22c23ab6888a754b89e4c95bb54629ce74ec999889c82714b5aec703de7bc080b0d2e622ed53b645688ce164ecdff4ed66c86049b2f9077f2a94cd685294f8ea9cbc1de29a48d39f6b308288dfdb47731e39644b576a298646752f5c53d7943a5d0f7dbbc9604902b61b8edefeb5ab7e5bfdbc1e6723e6047894547e440e918038cc13b47424ccfe1a207e08a40524b553c750683f5f6c960f05836fb9b28c59e1b471fd5331f1811ddf3eaff73798b7ffd6c9714978988c440ca906b4782a410372d70ee65a0a803061708003688f576e2d3a22580b706149a24b93a162be9f1b546680a1db2a8e54a576c28b4772c50a55161b2994514369c2192b2c90017cc8282f41d28099f38b2f1f0d2c0e46b444417a2078755591f00f01df0ce72b1d1bd255a14d2bf67ab3e630f95a5da9bd9e10f08efbf6fe722cf000c32460fa3271f18b39eaa4487c1ddf828b6bedf4523837bb3425ba1c1606e8d5d1e6182aa6a74f068f3e90b42641347ca755779216afbc99603391fcef4e8e5aa202bdca24b83ff42f4f01232d3f2831cda2db76fb93a4cf6e9efb71b5438a4b74c3190a8901d73566c50727559ba9bf6317d116e8f5536bacf064d3f86282e0f88dd40b63e75519c6a8e5664af8e1029fae87930f523e4dc7c2dd6dc3296a42a59f178d438866d929a70951bed05533eb1d818b7c7c595971c26b1d436d26897d6a6eb036a13511ac4a3bd724f2ca57fef07d2c0730800d35683d745125f4237add64b538b7dab0d0f258daf7de1a74f74a2fd010cdee810f514fcf6045f0cc84e2054b5f4ec2772718ffb4cca9c9be77f8f007333860180d60ee4dd8ce976e63ff49aa11dd42fe6946515e59da3e602b1861bd3f63c89362bcfe8438bc71959a617d8d63331a3d903bc5734b777fb14f7a2b063d79ea8637ac52c758ef88df217b95fa8fdf1009ab28d8a4f318f78772568cc7aa9e3b3e001c0111b1751b698ef1b66383d6b3ca942fe4f66fc97613cfbbc03eec9d0b7e08f80939d9a2ea1f72bda7b0d655ac3a94b4c699d3eb1bbd6076e63ef5c1fe9ce258b55d21164ca7ee03bb53d8ba4306f695e648093542d769da95a35ff3a2c071dd8abd5a82e217d82317065d50a87b689ae3a2ec7887957bb243373cf986490961220ea61ebe12ac0287b185070e124fc518c300620b4b6d4f29402b18c2462a7985c00e2a87691053b1fdecb7aa264f33e27c6b201ca6065ef79e5266513aea92e8d3e646453c089b5eba66d14bc45844d0240d2e7737c16668fd53e38a93d6003146019777c03644c300d06927ef6994ac794914efc5be0ca81680ca8c9752908fbd2d56d7fd1fc1c76eed755408f1d7802f0d3d0f347d82b162ee6f0a2a890e083c20b822fa6c4ad627f4ab5d1526d83d897c244d6ed4a427b23b4a0c19f4e8889257c1373764ab7063b5db8ed9c2443cb012381a2b3365eb568649d7ccd52271f25fd22fdc397e4c9c536ebb452cd2cd10dc5010bf433f88cb58d2b9edf2bcbfa83b782ffd4388f1bce3f8f9af5ae6be590bdcecb1bfea846d2f0199eccdb0c7e4d419f69b6a428eaeb462b67aa40340417bdfebb6039aab8242e39f6c11ec136d73fb315cf71414a2a1203af08fdee34ed0072c27462395815f7779012a41ec526be53da954e1f7a7ebbb68feb15cbaea8add6cd0f2fe3d3615991ab54f4c7884e8a80a9535f13be2ed944b3bb315de8af2a70439294cd53f041f41d3562be840c78efcb08661b1731feec46a9091ecede3a9fbc2dae42c72ebdd84308e95644373595db62157dba7dbf124bb45de6c2837b0066673bfd215ff915a8d41637eeb029c345e444251ecbbcdf79e246a80aa4591976a00da06c759c6160ed1986f8e15a562417da55109174628e7b11d49586882851205755b4f99a875ab3599fdcc094e4a2164e1764d24de805fd7b20efef2a8e23fea4e206dfa1fd9c31d90c1fecf745d3eb886190827d952703aa6a99b5000d8ee9d51de94a82dd053b6aa89cd7e94e92d4aa93a9224d3f688b5c834a53f2993638166a3de78aba7cb930cc5845f9915e6523683715a187e940fa2a978b5ca4c3b80db62e96a600f1864bf0b1aac23b1330b13eadd3a2f07ce7181d0a9497c455d228278e5cc3e4c00a2ea3eb8e5b9ce2799256302b0f8f1f829d3a3ae8aa7cc4ea229c5af476c01b8d48a9f6987df57c3469b6ef6dfcb488a3d5b91fe17b5798fe154ab8399a2e75f0d15b2a6aa91302056266b22a38a604edc374e2d2155abca119c11dc6827a47e3cee7032f6e0f59708dface221e47041cffc59ce0334d9b7c5e91c2c320a70ec2f32906624128363c893909f47bd970df652d5e6c2324033f32b1653a039f8c051d9dc8f839c50f5696e9e08f7f1cdac4750b429af03176ff6e643eca1d8fc710c6cdb0d26074d85316f4c9084d5f453f6d36c1cea0e389f3462e1478e2503c1db99fc46f3f0627f173672c21f3cc3b483998192e81efa689819d0007762adbd141a058587e030a3568e412d25662c40acdafc3c6ee30c10cc23e3ddedb6c73085c90c89b1218d67a328f06c3637a786d4715cb9f9d8b0b22d920b68b0557cc80a56fce0b6e2d6627de576e308757a8f37821898e96785ae323e413d3572205b0a5710143a2621c258c76c7c3ff7100a2fcae99c84d1ab1cecf7fc5b1e4698bfa3ba2a0856a65f2d4f291a4a164c0381d70d1213f7e40fc4ba42c43ea8e70043e27c5ab0827559b7cf7f2587d0d2f93c6382cf54e92764d815280d68c554e5b6fbb351bd18635786299dde39fcaf3efa708a3f18701eda1579bfb0bee4fa1f1ed6e09d450d427e4b91f4552f87f31f06f109e74af4bf301481452aafa2146f6375da467ea008bafc3c8408aadd61b07c28c55249ec0c8bfdb00ea", + "signing_randomness": "4847d6414be08bc04dceab0860a93a697d941eaabbd52a6dff6fc4ea33d4b60d", + "sha3_256_hash_of_signature": "2c2521643c48d1bfa0da262ed9065a80f6e80cd9ad1aa73f0bc867958388e754" + }, + { + "key_generation_seed": "9d89b9a327df0d341cd2968ba9218bbc3e934502cd88919d8bb16dd3d39febf7", + "sha3_256_hash_of_verification_key": "5df31a04ab9735734fd46e0f2797203ccb8d5f48c41ba691d9bc9cff3f7ce719", + "sha3_256_hash_of_signing_key": "2e7b55ecbd6dd0bc9104ad4a2ad6372655621ba9861d0a132626bda8fb9bd055", + "message": "02c7c4451da90503c43fded1ccb3dee468a6a8d9e56670cd8f6a58e7941f1bc5efa6e2afdc0141a2f7e8f781d79e70b4813263a9dbc8d8a67f89371cfbd90977ec96461b28bee4c644f2c91e96257b1909b84ecb25cf438a3fd6b835e20d5cda56a1fb7995fcaa0ee1b5327fb1288e3c57cbef0554ca5ad6fcd1f1865c6aec6cbdb24495700ab5aaf078d8516ca4fa3a231a97c77bd150b127cdbfb42c03702c9027b2a5f6594b022ef55b63bf3eec27eb0e9529eccdc82bc6ad1f011f167d602ef1f175da5db4028bf08a053af2c728ade93b37edc2a75b7b6c6cf38cd1c07f359c73b131b13df76139dee6795f1d85b47f29ae97d0e40cf5dbb67360044f78940a1e80d9d99fd5ab0185210d8769911bc471650df0fcb9c3af038f7882f677790e146e612fcdd6fb89f90b7e5e46cd648f4bf8f736d69f8a91e4806346b4366fd48d1481c0b47add82003310b0a99b779d63ede1771f50221651b2d8af40f48b92ee1327c85a1d2ef2d86378076beb58556fcaec6029649a0ea5fde517a85d87704210e071fcb6f63317aeac3eb3e9746018e1028c50c790a45b1beda6eea2d646dce401ad5d7850a5f69cd85301920de77ab0d01b1361efa3e70ac05881bc02190720acc75a691d6064f9d24c79dc72476309e58cddf5fb2a253d857a79c8e898ab6adc300eaaf208820cb02f5f2cd317f4052d40de28e52c55a0349dd855d64e8da8296d4f572281e221a3d27ef76fee67fbe5484e6460c99950763b801fce828e93d2a633a1ca5d7ec582d7c463da5a9aa8056bb2173306f3820bd0a3273742789b61af89ccc42b81cc68745800d2a59231d5d28e832f443a871de5b6b10b58a8aa7cc9816014d7f3545ddf1f481b7f0c9dd41b4d96e5db767b74776c2253fa230df65f3e0b944b95ecd4138e2847418b084d9f9e0798cb5247238ec12b88c10a5c0c645e1d09d09059c72e33c28a472fdd8b88eaa93c63be7d980a12195c2ec3105df2bb81cc9c3009f7771b6b813cd12303e3a9961d6731af55ecfe5127bac68d06f835dd5f2d584fc0e648c3a4256e2a3d4b81966010964657f33d1fe0400724c488d5aacf9f2c0b802cd812c8452e5b8e2b17ff4a1289d33fc405f5db4ecab4a73fca3634756dfbf9012c413b6f64788fd0f68f8ab7620477acd3c14009377f3dd54b9eaf2784433d63341323f54d113fd63d7456afef885f13c13172a37a5dc82336b9515f8f7f4903ef6dbe9cb34930743b6ed11265cf94aaf406dea9802d17bcb369ad0d9964792f74d338dafe47ee88b3b74eba8e70774edc1f16fa876fd62b0bff880ce252ee4435b1debf36f0a06a4fb406f01d618c135e6103e2a39f4c9cf41ec93702ba76ba753ab49b5836c20f67d05943edddf47ab8c5b81f4bc22d773305076f7e5b697a7b25b016190072f756f19f397884e0521595326ca591672684a3be17c9f5cc8e8f4848f7136762178fbdcc7bc6a6c6a31345fee687b0505f72bf1ab7eb87bfe5f896cfd42dd67a239c70648b39bc0c84da33ca17838fb4213c38b68f22914fec3dc50194e883720719e9b5f8d037debb726dbd899abd97853c54b0bc347a322bfaf961c6cd6209c98aa81b8e2595fc151b1375bf4fca2dff49df40a3d1c694edff6e9687e73ef62dd42ad7a05195a7f206f097196aa0e4d68f8132d4a00ceded940c4f6ae02e6d3763073462c7a4bb11778290e744471ec554a05917e52c5263ff02c07bee055234eee10b79175dc164ab2051b03598df1d4311e87acf4aec45c55b1a58b0f05ebdabe248a27c0187643cb8f9529d31fe0ac4a28d780196da00dacff5f2dd64fb04e7c159dbbcdd3343bcb7ae188de15d923d2ac0af232c5389dc9c949fce554f7a0425d4f9b28df2ee4b81740c2b5a5b93f0f7ab75ebd360cbc78b11c28608b5bafc970cf3d4455a20a198392d876edcf89e2639b50cd84ae21bd50fb077050ebffb210be711d8ea807ca66493650e909911fd3cad99ab94b2ab2edff192d9d75257818272e147a9c54e06c53210fc091bf4175f2f44423669716fd9a6c4f96a0c4be17839769a806453e55d7357fbfb3d7a458e70957d524c0e896398e135bfa68a0cc136fb93ee7d30ad463e32e152fc32cb8e7f0b05a30eb13c0df98bc187ec0a54856d2efcda10a82b89dc8cd21c67d9b6df3d7005ef3b2bc9dcd5d55b64db40b74fd322cdf9d9911a00b5a02e1ad5ca9bf65d90db709fc1e5fc84be97574b09c83b49963a51228a667bbd84bfd8e0d90ec161fe5ca73bcb8d95fd7afd982ab7ebab51bd2b24cd6d356eb850d2c65593313d8ebb97e7dfa450ae982918582f86a356f538eb05afd460566d79f040d36c93d3c645b636560007d51b121de3fafb3ed70b475aff9617da4b52937c628678b109c3b76bc15bd02b766a394893d8ec966dfd8033d12a8d98ac5be201134325e32cb6786f4faecd7dcd05aef5f3739122b817824a672e71deb312cb7dd6a77116b30715076384297b1962efdfee6d6d2b2ed2ea4dd802f4784872d825db828557d4d927b7232682ad91cec3e508854f529853a8797b7bf7bff8e3c180980ddf4081e96a12a495acde0c73282ac78617c68a55a94573e5a37b859858d1e19adc82821b316b9d346ecfc6dbffb3779f692a62d20d1bc4e730fde2aee826e76638ade3dfaa11057b0bc8a80e8905b15e41d9a4105109f18e7e1362149ae9c568d1d642d65b94253be2b13e7230f8bcf34dc87241d1de72a65bba111c111cbf5bd618cd02e0a06e37f60b3736631073a6be004c1ad5f0091a82c87b276f7c5aaf6938c886a6039df23482e2064f6af05636b4c6ba6b24a29aaf2174af4bd959177203ae9b160f81ca6764948afcdacf6bec0b987c6dbe178dcf47c137c64809483019c5f2072d0301c19c500c60b5ca913c24a8f28f50e1578d806ff9f9b810ca14bf5f2268fa18dec67d973eb1d975aaf871abc980d06222493d900cebd8811fa20d5db8f8036430f8bd7f9554f7cb47f9ebf389f66c3ccf9f42db57affee074ffee4eb3e11612fd8a8fe02cc4e9d2f8bb36c505cece9dc87512aeb5d8ebe33328c5217ccaf2e1af1e38bfa84c0035decd8d8c250fb4d964e8f0ae448aab740d9ee9d794390686fe9a95183f0d5166d479c51014f1f29d8fec616e1a4e7a9c86e2af790bc7bd7bb6f746a2266332e04affbe6b9512e6620681c3317dc846e4fd7974e8ae87e370ecf9dfed574e339cd7e8a663ecd1a7bf5842391913d98686f7f2145bbc420f2f58b89131d5f3be41c85752e13504bcc549a8f690cd2b0e1e29e4dfa3cc76bd398bbf28f33a00c3915dd719f7cb985e9a0a7cc8190bffc8bf47310c71418d7a6c629c491eb8e455148bd4438ba6b7014608b0ce6a1bc5b035bc174c9bffd966d8305fe9e5619bca3fe4b39e6732dc652531819ac828f86ea11360678e786eaa741382d713ae26a608d582a3e4583d45744acedd32670b5ad4a1310301b28a174dc9858a55f0c1b7486cd66cb0635083b0c63016e40dfc533ab80c9cfaf1378d00769dcbad56b09da3a4e6cdbfd8f3fcb951680020dca58647665462e42f42dc14e7b20f262d3ceb0b1a2ba807b98d66232ad7d3839c298564bc36a134cc2447b1b9fe69271960459c0a6f897c1878140690da7d41fd8aaa05a679fdc3037eb2885ad3c82374f4bb991745351292dfd8e54f565e0093776b7ea65ddcd500beb4d15af6029f2630a0062f2d4fb331b47b6a5e139d385016e1fa490eaa209636b1383b7d7dc1148f07ed2cc2c03fa7fee09305f34c57b3ce899c18462b4f1ef88c1ac5259440aab48c5849652aad9d3cf3d31f36c7f64f918868182d36345ba5bb7a4ee088d8b081eb78fe977f5a5295177aa427215bb26d1de33ad4b2d610a47f8c672eeda703a04d0fae4c5961f13ad6fca81863d8a394135565d8b27904a511fd0621a532f84a47ccf4fcc2114d4c369b7a76822959f8caa25a6495081ca9ec3ac3348a981618592c090b6439cda2fbc932c8697b3709323e3388af8efa1b9cdbd65a65c8f0c302330ddbd10e0235f8030562452ede447ee5a5a9a636af6f615b1210aa7cbe69572b3467b643bc5f5ec3f9ad15b3ad918993355e209acbd0f1393076da3b0950803295b6571e476acaa04d48a4627367cb7faa83796c4178ca9071dccb8d3ea70381b61f0c56d515e0a765e266dacb13056317ad8737a1ad541aaccea1641946e331229f19bb54c20bd51e63d63bffa13110a552fd0a95ab984ef53bd639efa0568c6875b2798e3a0578c940c0c4197d3587bcb1cc45a99f5d37b1612dc1a4178a3e288fbd79ddacd049159d6a5416f9ef3f38c74449bfb2e6a894566c5c17b4555e154f29a93241463690", + "signing_randomness": "31b225a35a621b7cc7fb412b79f84624fb7278d5450074cb3e1cf467b589e64f", + "sha3_256_hash_of_signature": "b4c57615a3bf964125e09c580a42aec44d9c5c573811ba426262f4d9f0ebf5f6" + }, + { + "key_generation_seed": "4544c2f21054605b0eee46f62a87dfcbc3bfec473b9850886266f478bf9e33d7", + "sha3_256_hash_of_verification_key": "bb481b212ad8dc01cfb6ca605839c0d58a4c4ca8658aaf747fa4eeee72e7a7af", + "sha3_256_hash_of_signing_key": "d99157f7407370a86d9ae4fe5d6876ca9e31bd5798e1906dfa8973fc8c9b74fa", + "message": "e13692e3cc06ebe8ff9a292d890f0a34dfe9a4f968f196b475ac4df553a30e2fd5df008df4d7508302aaf6389b6a5a9135e9bc8a5accd2bd2df98ff662b763101d31e24e8f182fa50840be27f76ba5ed645bb4d3f7f2f6ce25179a47fd7b6441a9b3a28783ceedb425b2912734a75d7d03811172188253bd8f0f52eaee84a9fb025f95ea1b566c53297a6a090f7fd8b21639523e073adaa750d63da61631f933fedffb2819e0eb3074e9e11e10b102ac88e2c8d6cf408fd241ad301f9b8e18a88b74cb4b0dac76347635dfbb3eecfdf84229babcc003c6e4efb7394e25667dd7fa47d36e027559f53e98789e6e732e6aa23a71607677fb975c2852367c5ba5e3d10b3017ad26f9a38ce803929d08a43646ffbc3980b359d8bc2e9615636d4e5de8de6fb2465a983eb1696e98dd33faeb7af8c2d30506b22390d7f9fc21c7a016fdf22d21ed2ea4175fe9f5f44598ec26452700dc9a495675431e1236865f2f4aa5bc9c9a10eee9e29b1fc4fefcf8f24bf94342fc7e19aa6534c3b771d910aa419ea2bf70e2c1915891cc630a3397551e4f34bd2192b70eb210ea67cf152a35a3f5d0878e153579b42afafe5068b2be2b48127ffb54553b7a9b6f845e7d72c43938ae42bc03e33b836ab212909510aae7dbe8ee6d0eb8ad84d60832f3151273a1e09c514c3aa4cacd15564643f4255f36059022b91ba4137ecd97b34be3308d40ef06bcf4f45ec625b54c7347f52a21815508199c8b7a6212779cd171894da9fc3de2a6ef5d76bfe03b8199ed1dc92b2a403e4da009cbc0fb597c5952be32579eb8e781eb12d935848c051029c528cbb68cbc1de0102b42561e21f48e72e028c2cd8816a9027914571b49d2f94c9189e1a7f18d7d3d0a09b3a36edb8a084ace5fccc77e3e42eda0fbab8c81eaf170103ca757981839c9448362bcaaaa3f20c8dc653aef36953559f3597e1915f02a8d33d0e46201fc794ee055e6d9955b91fc7aba1f136c280367404725cb355fc2f129413581401f98236d2a6f8bed7fdd7ea99060dabe3f0e8ce20b0e98ea80994d1673e8ccc6a0ba4a9d544f3d31bd95c9d3847527a978c1f155efd84b6a7becfb749628ce82e80285fc7272ea05f953404e437ad557f38fd9bbf77a69b81e4441605b23f2aaedb00c7519d8e9cb4cae5f8c3fa74faabf6c12595ba045f647aba7168c65c8a6006733d1341435495c7088c3361b50c43787ec24c24f57323466b5c088e8097b44666453010da38ad65b426e72140af78a5448b2f93df3820f013fb9dcac49604c86f2b2e4ea565463917285f148e8bfa9e11943ad3b86b14ed59a190cae097db26daf8fd2a642676a37dd90c23b52c82ce028b80a805d9ba05457f7b6cbaecba4094822e16c14d6e2291b731d581b12fb16802653360aaa6a7989d61c80debfcce81a36d9ecc84039c4f086a5579d36ff5d0cbe61292e4fc3d14277af380a9c1dbf36c2d61f59cfc0d62524e042710bff5ba719e56ba367ffe849d660b9f7f3b638e113bf2e1a4db1b8f65a0fd680bb2a168a4fd5b4e0edf3208ad47f1ff4afbaa726e38763cb5c84c03da3d1e32cba873b9a0c750922cd3d0a10a4877eafef602f5c875fbf0ee2f4f0af7f308ef934f7e8e74fda62a860bb594fd061d1b2bb32ba613339042fd90e749acef450d204072acf58b18c365e4f4b815f1e837453c4255d53bb68d50f3677e7173fcc23d2b592149a9f3dd615868af91f705387547862d34553fd45b8df643f596dfdb7aba47bd5d91445826c86fd4d30365a2f9a3cc0913de19707d072f27a09eab906304008875b5be3526210d6b8bc8663975a1f78eab9cd7f7305cdd4c00d6277622e50606e1cadd639730101d088bc2bab295ad86ba8e26f5ebcb3e9c7c543e533a7b3c20f0f89001775f714825dc8547bab06f5b99c5305ef18372a184569323fe269d45b669b9a222c9defbb0b2c84f42a57ef343a5c12f5712eec33985df8f0c566d471a9403fc103a3eeed42829d8e3e5c517bde29447841ce96c8ac587df3e4b6227fab386140db0112ed0d2846355c4a45e94f3a0718ceec13fd3caaeefdf0b7f89f502aacf8c9d96d01b5549157b7df2be65bc30c889e69971700286c561df91c8cb923001e5f0e21d2c7a3dfe8d1af07fece1eda20c031b29a4389f265d2c7be64ec37b2884849ef30fc8a82d2f766ace68c72f0a4b72f3b50884749814387893db2370a3410f794c64cd24bf0d13e44ad500ba9816f9baed72f7593f758592c2e974d1207a664b869130baa1fa71dbc55875134e7cfa276e36568f79483886099a1070c14c6e4eb87523e04c0154a2250624261211723453cfad185298de06d08cc25fa18bc58b34ecdf5d9dbb02541bab4a2af110ae09130e12439f1cecc34f9ab5d7be36c827a6f2f6708b543d4ad2e424805e2a74895742b0a5da30cabe4ab45f40cbfccbeebdab9b8eb8f78781168b5bc79e04effe1757ab0547b9bd0d2625673ce528d2b4874d46df0e09c24fc413ef9ab4c3d2e803c1e316d77ff5de3368bb925b2b1f6ffc340525663931f5595c8aaaf9fb0dccdfa4793519a66d4fde38bd2044c60fd1de15d60ba878fda570e7aef6db69d2527a1f1481a9d05ff2f6f621238939acf5d2c37b2bc3a194a9e65e7441764a5ee37b1fef3b8c9c425be1b5ff0d05bcb6a3b91876ec04ed89a31749fd443c2b85f8f388e7070d77dee37e2b666628cc9a961236dd24af2769c1f613b4e77f8e82d1f410ed59f63f1df19bc53a448106de4f8efb8cc37e40144b0f658a4135e25a3cf36d8692def2677e4bea3a9770f19e44d55080625421d5badebef3b39be71c08650b5718a9b2fcefc4becb26c4b63c43f6557dd66517d103907f82f9c2b965b7c5e36059d2159183f5acb8b5ff5e6b92e94d53ab25ae955424e80edec4650be293e836da6148392c500ff4b7672932e90e068569b81ae335b2e5013ccc95f571948d58127eb1269a08d6e897d2d9b60f3e49847c05d0b3ac230a67eb6d38ffdbd4b8d82d7b9ec803429c701f080be86faa165c0111131712db4957fd84a8936ab55558c69d33d5890cadd08d7f0d4962cf9e2f69c7517e79db14b76e6e188f5ed95169a2a7e4c0ebc2175ec2dd44abcf239ceb3e22f955ed25da41768ca5fd9a9ae15faaafeb431958a679249ab8bf879185e8fbf9986b96a92972153b4cd0d1be001e5afae3ad1f0b1191f1483738e728d4ad240538e5ef7bc9ba4d5903929d74cb64241306fdbaaae17b1c3134aed2cc394d3ef9653cc62a29c4b0b9be04e95e072ec98f7a80a7b575ded4a1993aa884c1edffe056ec475d934b4eb0ebf418975728c6e9cb3919b2b67d2c71228a4df1fe2c8388e3a2bdd75549417fe795f1947f857b1c0c9ca021515fd4d79e691493b988080943c394bf29e4190082a94f224afde5853323ea51c06b41547eec0da5cc202a048d77c7b91e794c51e72b02ea7c14578c11d9df48e099465783e496029ebb6d42d9caa52902a4694355db01dd7f5d7c113ae06e3f712fa577e937cd4fb817659f93964e194fe7d509a81c258c69c3415a8f11d35b414339fd1cc1d4f50665d9111592d1c3a3d69fcf6a971c285a94f5ffbfe8d2fd2746dceb3b218d970d670d10135126e479d92000d41eabdeea4c04d1748a4908dd39c60a52aa5fe29c8aced50dc1295b5c2c4a98e3c62ee4f370f4d3e500fe27b66f65bae604fd558d66b7f09ce36c36c8b5b4fed193ef56d1d8df0fe6fe0031466a1c633203966fe83d6bff843657dc0af176aa8d5cb7312cb4e072bcff24d5f3828e29b2037e8d1fb63537c70c27011e9a97e3f04895f4e84ac69c55d450b46d5792a5d790557be64f765fa243afa98527b976783e7acdf76a7e1dcbda72431fc30d7b05197478d8d74077626ff7409f95b24a1f1bb6b803b9f1b9ad5b06883fae6c4b587c309a63f3b2fc9619032157b98c1da9608107e87f4fee0dae995ab86ac9869446cde92441f0b9f8240e6f7f7aa9189d92b7faa3280fa749ba8c7729f8974049c5cbcb8c6650cf1c16b8194c7ae1a82b40b8b04488fcc69e674362fe4821d4c1846cd9bc49234bcc464013f5f9a082fb83d63098c331d4b1c9129f52259ccaf4a9237f8ec5bccf06f230c08ddaf1d0c21c5930f55d3d5f60cbfc447e7fcbc75cd199733f8d17bd043b67b0c138cb0c9c8f2e477728f27dee573796f71b013689b537aead4991e67f2f5eb94bfad9509d7c235c9e55f68f26b9ce8aa90834d170f8b700a40ae9a817d5d17b1644d25bcf1172a5cf0c755a6ec04fafc39db06aaa05f5988e187b9e110eedea9c84b99ad29a4b31950f2c870a1f91daa6a5817faeae516fa42660fcf56000f7365d8c6cc11d4784c6fc02e4d0c727806e9d43b957bba124c980c31f81facc6d46f6c38d227eef8f0", + "signing_randomness": "6df6d37e181d0f28606b9b1180547a805bdfe075eb51c4ad47de897b89a29a43", + "sha3_256_hash_of_signature": "5acdb157f19f0a9a1baf48746f5f3c13ded96bb6f17068f439509ef20b326c08" + }, + { + "key_generation_seed": "d9931e321732bd82ec9ca1df12ba48549bfc7d3e76a404b71892f4198777ffbb", + "sha3_256_hash_of_verification_key": "6a3918e5f82591b42eed35bed2ad08e18fc149f9b59a86bb0d4b2c4049b80425", + "sha3_256_hash_of_signing_key": "ae662a624ef494a2ed8988df6331de7e191a4dad0785de5fc669f81bea728f4e", + "message": "1f7ab96e8c14d1a5094672d7034fa8f81703a2cc18983c972cc66736cd98b031ac8a479ced21a1f634938df85f3e83161646db81b9ac3ea22f80980b8e2eba4e9975714e5a98985817f426c41f3968349686b69af917564a2648401b8fa127fc3200dc16a9e663d1d345ea83131e21229dd39e70d7270de7577a7e9635602fd2c30efaf204a9234f0a73d21375658b0b0b04927e67f3f5534614edf5137badfed914a49aa301000092da93b3fa4a0ff592cc3a53f4a75b54fee775efa421eefcd6e0d32fb5cdc096886076da940b26c6e07f12f6e08fa7b3e2dc42055308e5607a2732717ae592a6909c6e084252a5b08685fe8c6c1da387b0aa9800b67cdb3ee2fb21b9be5e6b79ab545563068441c0c9c1e68cef6028a5cedf27d3ca47d95094c9e1e68b8449758be3ff8fde148abc420295dc76e3eba8e11433217fdc3136551a5a41c1c7e7d6ef43601946897fda54842d8f73faa7eb7ed0de544fef2a95c6fecb13c8c0f14b5b22493f54374184b73d5bd47383bbc5dd7bc1beac0cb8e66d2f413a9dceb7e1d0ee2d63b9eb28db232c33a95b792ae67d2591f5af59ddc45771a0e7195c4d25e7f4079359597678b0c0a87df3d66a686a9215dd566d4722c212ad05a23e1377e37e18a6ab3ab8bf5cd47bf1baf06eb05e4c150ca67d7e52bd297a08cfc97b575752e686b83575f425f3a450bb0f596a60e41f7183f463007fd019ee255bdef1d98b7a0a12ec33b3e2bc9bf0cc8f4860debcfbbd5e40b2adc2cd10ec35a341be7a49f8d204fdae86921b7de5ba700a61e2b041a8ea7040acee844892e5cf025ffec5322ff6d765bff1107c967a12eccb0489f64f8c13bd7057df76485446641aa7a560c7e73008c46572628e1a225a8d3f6d68ddc9759a952fc07cd43de4434bd3391089e900275e9ebc92563ac1403bb7dfdd182092130e3e6aeb7b666f4ba66c38bbe1f726f40a07df6c42079a6054399519e26d765ca065f4ddfd27a29cba292699cd826fa9d3e7ee31b0d76813879db5ec5c7f454095dc3bd27323dabd2dff949ac760d6137334507816330fa67d886021661adc69aebd882a07e01b4b6e5492399ecdea99222ee785c810b30409dfaf2a3ce5a05d699c2368249c9588d86feaa778b4860d6dd442088a21d2d9d0b49b15ec579776812af8ad582f1c44bb6432d7472300b5440a382ed87ab64b20373a0abdbce391d0bffc9c543ec686449fca9d04b7141836a416720bdff250a06d7651a1f98eabe4b340b2303591d0847aed6ffe423b6dd8c0c03459c381db506f531343f82c116323899df1e5d8db8997bec12eb70103f0bf2b3d53c4d4694052606ee32be4f5b35450358d7d85062dcf7f0bdb51364700baf92cd6ace4e2c10e6cd9a332716f5f4bf7598466a99238357798a499c9b8be77690635c57e7d87a904b3f2278c0b1b23e5860b0532f152e1626c86fd855f656b5d070bc81ce4634a87c8ea6d6a433c02dd2e6d6561b25968b149a6f3bba40b749f188b84314b5778a000cae91a53d59860ee6f7df38ca0935cd64c08a34bf19981c17951b9c39a847d0637441452e38ce5e1d9b99bed51b86705cebb8d3244c40bb8d70f846936a2be29c21604a7e6bd3e655022b929954f6c9a5743f5fc2127b49956d80128dd582ceaa06fc174813e5f5e6a0a4d7d26756fb28a6588e9410722591cce2a6c6ed0976b98e1fb0c642d5df8f08e96bae1fe10375fa1d7c70806101570fef1ebc8f58664281e2b61df2081b655013aef54616308504f5f4a1e8f156680163489d3fe7bb0a514f1d2d57ee6302853d7d03c767c7bdfb79e2b8c80403f26f6edbdd6a890a0a0b9b76d334e0f729ff9c47bfe960a1c3faf77e81b9ac156367423dbb4d766a1f3b1e67595effd76287f22bc37da4f0204633e804002eb7c1ad0836fa4d01e2fcdeab8457dfc3d8b7f1151bef3574f8f4653aa3780003787b8891901abc8250a974c15f2dddf9e1be6798647eed710d06cc3fb4c276bffa585680fc632d8efd1614745bc3c72b82c53feae935ea5014e2b321f69badf570fad878c9590fd20fb7bf1b31e373da93d1a8c63ea45e698ce060fe70aba0fa84f37e836f2ad2998f07101d3fc7ca2b08b1398e1687ed5a8ce860ef9b4889ff436b74d13281d1f6a7edf1dbe8989bfaeefe6a475e65217643e757006871e664099f5b3846553603cd9eef8fc195807361fbfdeb8dee6a0b79f009c10df397ffb865f4ebd0473d458d553358029c6b5a95d6ffee9b645311d10a8f479b7e5249aa87e3ded08311b4ddf3a458fe61ae294a22643861826acbbc9b0ea8b73157ce15d1ff35098ae67159b07ca7499398c26776dd9884b5d3786c87d48e864d8bbe2b73e2890f217e135bfdfc4dc5e805d9cefef5268e33db611aba6a5d57ec82b7246a63dcf3eaf3a51cf503d65c206d2362421de774158aeaffee45a6b5ad5cc0b1de0e2ea74e97913729a69e9c00a309ddceb7738baf4757ea9cc96e055bbdf692b12d8b01b92ce5ecf3d52187402cb7fd961a2672dc1875b6ea22ad7f5f42b1b52ba2d780f2e6c5b25fc7e30b1b663e3a09c8ff0b5c302e0e7f984ddcc62dda65fd996e17da72f02a16c354bbdad44c5b5044759bd53789b98bc58cc25fcdf10a9cbbf0fd6abd58a4cedd92c5d85ef22b3c5ee5d9440ce42995517d2f7352ce997f51a36b9fa5703b4c6491ad01f406fd1b5bf85321026d28b51354dadedf057b37743499a986469f908a01f3c1b74def5d8e2f57ed25a80720b540333109a0a65e7984b557f65429f3d3bd7ec3732a10d7af36dd5d2414a09949a0f57f37bd9021d2c482e61437cc15e9dfdd92d4c212c4fc6c22c54591e5afd48210fdc88040135e433f50e45874e0d5ee2bbc857f2c80e2fa4fc7acfec8eec0cab351f677c790787c715945c21bf923edc0a58878ae09acf5fb5a003c9c0b6e30a450ce6dad4b626108b88e89f1e6a7bb3843e1ec8aee35af69e81773cff71190f819ccf24142d60ac51b80b61019ec7ed2efb6c5f18b499fc9727bed2e3324f8b94a522092e0a98241e29f8f14c6561df3fea0824f9cb0fe10bb497e427ee62085e7aabb2900fa47bf27c1638bd116c5555c076deefe9754e8ed333d72ce9423e27ef640fd5199c0cafbcf2da1c5c34121a69e7e0deb3c268fe60c6797056383da43e6f472d225116f63124498271d3d43aadcc5871f2349ce040be068d72eb57b7827a7d9aa01405ba0ab07e684b91ef05418948f6713aef1f4948399e0e6130740cae3e481a6366295422be3ee2e892aa9fee86a6e23e2ebcbe654989fd93d1c4e7d62910e1223bd66b7c54f8dd7d373986e5d4141bf0bde98dd13aab7d598d698660f11fa4bfb0ad09d5c27b65386c8673e6c4ae9e8e30f8dd1a5a3fe557a3c29dcf99a7c376200ab595c49445e740e3daec07bc047fd6ea4fc6cfdc23d7449f9d1170fe635ca36d3de5b57f1cfb182de240cd4c1e480600c449d1a8596d8315906a53954201929e7665dd2e27d590d481dd394cf2e8ae19217f1ff0cb511def7460dc9e49c21607247857ba744b1384344b4c2d8ce987512376f66f1a279509281242a7a2a58ed500395418138abdb9c5572a258d157f4d3e88ed216bbe9cee3bd054fe61f94c59a4ad19aa62e456b86cade61622a6fea877575eeaea20c76ae8a89e7b44396bae0eeeab1c23f221a3df2b2cc683256a4e5c8207eda0b235562ad3b510f9d3fbe0b51cd8f238a0abd2ec182681606c8fd111d8ce1ec1cda6db4572303ddeb925ac1fffd75e321468266790dee6bc0e85070cee749d9e46795936324dd1388e1b11aa617500534b8daf2de12b035f73111b770f5f56f5c6a4152c45ce0e112e650faa9f3c7e59e3410745c29fa59cae5cc37fe4c6594990e50df1576b69b2b292afc58a804743f49dd7c98c1768fd19ab4213ae4fb197492af5bf7fbc6c8b507673539d8515dd527fafdd8ca3eff629caa720aa11e65922678447ad4ddf5ff943873df5203afea4130ca5f633e104ab083ec690cf092d208a98006e91bc7e33731d18e592869e564e6d3ff8bbbbb9837ffc1f1b92de0f5dd4a029c51e3f64592cac3de1b4ca5414f894b7b0b7d73d6bf1da4b908aceab47771da56a8b0536301fc5fd270caa55ce171332f7db2eb4619c4b2c1971ebc0ab8b0b11fd54c24285da8428ab9e0150d8897216b133ed554de8cee532024df8b8d9314d7c9a3ec60464f9c7bca8c3d4fba23a7b543ac111aba8c8f1bd54a243d565dc062f84cccedb0a03375fdfbcef8ad8cafc440d3e6f988dc607ecb947673dec4ad48724c91a6be22a0027e42af6d94d26d188d0b7b3a5af012880fc0105dd2f11171742321dd41a0401415c58ad4dc445642a2cbb466788f54d270bd8df25602b298b62b6d0fa3ada97008a99b73a807092f8957f17eead9d53b1128fbef1defcbc607ea92afbd353e95f52d33ab7c1ebe2", + "signing_randomness": "798a5665ddaf05bb01749ff874f94e9d7064911360c455e47054436ae1bba8a7", + "sha3_256_hash_of_signature": "35c86c71dc2a0fe0f8e8d7e036440c8e862aa4f41a8068e0c648dcdb7884d8cb" + }, + { + "key_generation_seed": "f838451e4a5929b8bae9084b40b1dc0edfb76a9354bf27f981960c88b0ba3a11", + "sha3_256_hash_of_verification_key": "b72d2e09b33cc9c250e847936d3287c5cae8c060ffb41aa58a517ff87760bf97", + "sha3_256_hash_of_signing_key": "0875f7872dfc6948864e9b9b1c110375fcdcd2713e14c92abba85133351da06d", + "message": "de897f02ae7292abafa6a0cad52929113410f2ba972b4184e894c4d31081420751560956f49ce2b772635625afc3ca6698fbfde4d0a05ef243df190ba1ce780eb572590e01e6e283e1963f2b0722b0ceb365552f65bd405f1a284ddbed07ba61c4453d30cc28c83e41590e09d7bb6932d231285205d61332fa9263b8a2d3d7f7fa20f521ca4b49f249896780e08c2dc41669bf0777278f87bb1f72cddf4b998062b1642791f81ad474d6d8f963dcb4458ce11108544c41cdf19145b77038c7e8adcd6501508c53b25be6e787313018620d1ba647cca4a5a8399e11815eaecec6ae66dbc576699bb0ab44de111ab6f252256389efdc0546e641de87fd6a3a724716257a9174f39542539a593864441eb79d499fcdf2f1d053cebb3a1fcc09419d2c553c2265b3dc3943e0341bb49130e9981ec59945fa0b23e9dbdbf352aba0d925c4333f2ee1f2c83c847efa78bb13263b893d7cae029bf08cea2a5d1b5b997e403a489c6d9a124fb8386fe58c2476894e7754b8e5a162102a119482b5e59f8d89c8b1dea70b6c80641c77bfd12d45c5b3ce0021ee500a1665abcf740794e0d3e7e8cb5804a1e0d0c81a107dee80bf63bff8ce2ee2dd602df279de39c579b417a758356d2b48b41e83495dee9adfe4506e03f19dd096e81405264d408b2fbcdbf41db5ced6fbdc2645dbefe5bd038382993970c7686dba3fedc24e1f91ba4b6cf70b2e832b97be24b6393273a519db0b4446e98d77e86ccacfbeccb18939013c66f7a29b10de2e88fcfaef656b858b7dfacc4f21ef5f328c0ef604fedd993510ba40530b79525fe8d336def0e5c303539e664a9360edad7268f70df4de199ab3f70eb2ba65e2752bf5fdb1e853e6f4efcafbb31d8cc23155413be31082da958b01682894a9057cab66d4d64a6f3b1d81c5b75815a3e0caf6486b17339174276a84e11c117b060302dc2ee06a03c0e15395c0dd32661638f059a385578c1b792349a41c511d12ac7185b060a831ee296e6626459c2750faf3afb579f6f6836d566c00c979b5130e8e50431e914834cbb3d26f6e5ba50bcf05d50f699faf10767aa2831c3557a53af14bfd9f23c00f76c2680c7dbf4a9b2a425e34c943228c3ebe55a0960acc757d7878f7943e2e8a1cbc8c0d2139a6a6459d3492a1a7757f71e90a58a78e0ff9b04d059c5d131f6e3c30742fde5506ae7860045a4c903de96dc43ac6a69273bf8edab7e7fafbaad9efa8fa609961502efaccde63a6d98d8d017075487c608ff701a7e3381d7a2acb134b198950ecc6970a75af5625faa4eaf968cce48ffb673f4f365802a984c609c33ba312140a60a6f0924e945d11baacfcd643c874d352a90367ea4c59b63665364832b1a9a9a01eda92c64f393c357158973fa7c6047b8b5e27eedb28e26359402b63032f8b230f5aa968272819ca486a8bafd3d66799ae951cabf04ea81e1e7e4632b915d4e8387c7d1f4fafe1c1fc8666fe0318403ea0027487e947d844a7fa28c0523a64ebd95d2a8abf6a71fefb5bc059b2cbeecd4375f3a3f109dead98539244ddcfee9e42db3abdaf943c445712ebf19508a1ffa6133c5078c1da69a32cbe729a8876c4c73cb232024a87d87fd5f9456d3d4a936cb4ce2e00ef415406d66d344000a4a95cc9651425a16021336c4beff310210324c754bbe13cd0066c507413671c80cf492b4655d898a18a2f4db5a393400c6ad821580b0712d6c919c62e87fe212260eaef6876c409fca1047a67b223e0766144f3f676f051fbe912c4ce4a9f7b85459da031ec47c621f6ef06cd1621421fa52b047b51c944dfa94807083b4ed40d533b19813477193d1e4e96c8d76a5af3100fa44a985a6513060b08a7f3848159b3cc551d43370b223037753b824a099a7c7df59305be09e2e79618c83818bd542f39380126a927190ea5536dfa63b664aa7601c6d82cddf4ce4006e1af2601ec453971828cd09c29d2f3ea6392b58d38bcf40bf6b6497f6b848cb853b187610cd23880cb09787c76087356c66565c0399be746a81753442e4aaa54e84f1d8c2ccb2d00a551e960203d61e71a72e131ed1967dd06e72c99264ef2ee5bd156fc869b5031ba23a6d354d7cec58f339f6bc2dd1c547f07aa733994860197dce5bce6024a74668ed89a2c9cafe1f78b31638c3225d96009c260fbd28c1f0423e75c9c01a0f9e62b7f265fa3817f441f56ae79ba54a0c107fd7946a2ddda60d0eae428715fe2b4ff93bef83cd10e5e17760fe028f1aac8084a43edcc12bfd3265d13fa94d9704809a50881d48f0080a976c5bf31b353b9043c0f0b69ae6f2b8badd056752f2fc9e90c4b35850c2d45b9f354b41ed7826b976528875547a0c389b83725e26c006cc8240e380e3eb554dbf2133a131743539b1d174cca6b135c59f81d499631bda4cf90ded836e8c24c074a0bcd83271309ffef320791c9030fc2b1f53fd2de870e54eba20ce9930c279b48b39cb481737f012f65933650374ba39e2222191b0e3c7db9632ce9cb077322cef97ed832ddd8aaee53c52c03d2aaf8eb5597d8d6467a406bf428e2f16462e0c0d486a1c1c7348cbbf92633ec4ffa75945025a3c92095317e32290d4cbaa6ca40f3f201975f3fc8b733d1467c094e075e8415352e3ae51a6c5169a4aa430bcd66ff39b184f5b7174042dfcc6840eef60ccdcac12d012ae4f24f7184a038d8d9964ab405366740600b98cfe2e4737c8d846fd4e9b22b5047110d85b37bdb9e7e3baf5298bbdc1050aa20f14e34dec283830f5fa9c570c22ca659c1276be8ffbc0ac3551db8488855ae7ec21e239e88a0f68227d17dd87ffa3b3d0535f9e57807755de56a65c0de9f4a79f8746b20908bf9416a86f62ee2c2545bca2d55cd4d45dcdf06dc879e1b6270a80778d0274aa658395d800eaef367df4f4d838eee0a66093e0f419b9edc5f003e31cf0eb7e1cee9accda7a2dfc920a4b5222389dbf12ad17392850c434a9b3c260159b0f52e78e7a66d28dd5b3c77662cfed2cb3dd5bc3cc26a34293ebf1fb3a9bc59bb0c104c5a9387f3893a65d145d424ce741a375f9c65e733a024e78fe274b29ff4b0eb6f21fafc31453eaf7e48fabec5711d3898b876f59952c73123281a8e85148cef5a166bf45df36053d57ae6f29d3e334bb2395fa236d4daa8a4fdf99d80a9bcdbed36154bf4fa3d463d51974032d7b88b2504317e14165b1c3fe3d8fe366fc8284321d80f9cf512f418c63f73b7c29c07870332387bbd1a870ac39485f64086006cfd68c8299347615a423736c01faef2da56cfb6fc966948649324e22d4551b9f50654ee505547f7d0b8481adf6aac3977f49d7e6ae5c4248df7b43bda7f082aacfcdcf1c1bc04f2d45f5e028498ecbca47ec4d1ddeb03a2ab27be9e4b80585145676f8ae7a5017bc5efa317a576ed6e423d5a0495b8dc619712a2c3e6162b04b9bbc7de4be6532f6c1c019e702c014c60189a2612594bcb18317804c630264d07b7396db562777bc305b885e00706ff6d0208737bd229bc7aeeff5fb770a4c057b347601f1f6c16f60d4a53a0b32631ad2d41fa307f6630228e1807d22475d5e331a50a680896dc606f3941ac08f8ba46de5a49f5ed6a94965334fdfd69c4a6c7973d9615b3fe576b15aacb9b98d9e498d2a3a89b4f8eee715ed5f29f13dde7629bb386f7cc800f16f3b5ba8bd0e14cd8d9bb0f0aa615be9d7557f6efd00f7bbef9989e7f463279408e6ad77e100ae4457d57424f2b1caef43052c5b25c896baa1c2fe67d1d6f669311f17d39460f0b176a7727f53257a36faacbf3dfe623d8f882f8ee41ba1ce387e1d1860f4babe26ed678395b9979d84dea5c7b38905d4c7fd867ed7722d066bff3a833d3282bb40d1cd310dc8dac9270a49b65b5181eb30f166caf0832a8dc56b9d135550b506d98d036be7876836aae669507990de6d03e78a38139cf64f65fb410f192e30b045c93fe259c10e0c5b56a2b5f0605da0851104c4beeb4e3b30135cae5a6c68403c63121b0993832834a3b5ebdd345c41b26dd219560b624024b8b945a10d385b3ce4e0bd54e10a64aca59d283302028a9592120d142cceb1cc30e1f96ad041f1e17bcdc3c68c2ea2e0d65d6ba3696166cb365cc461abc4d67d504e8290eb452ecb77f6d5faa5053d01317646242384c5c510bd43c5780bbd01ebc3af33d29d8a09ef39ac85e70398d2a64dffa72b3efd8d6d57aa2f9dac0cc6eeab27b69fdf2403a5fede0bfaf441619be03fde44c49ff0a34e9c37d2b9aeb726d56eb646a67bf349323f397db056d71de72a2597d780942554c8f8273e307dba6bd02e944e0559509e1f28b511bd709d03ea2451ef234df6f077e06aa01e2806d5bdf89df29f1b3d8c6d8014496ad83857f7465f1072e88709d0194733e1fc8c9f092df5b9802fd2ddda8b142217b9532d8604e2f32d06f6400025930da2be9b25529788e6bf4eb7f84c272df455ce2ada291cfdb5fe815129e4aed59625c879e99b3e3c1b6c5d7", + "signing_randomness": "dc1a7dcf4839e6c61d47317c03270ae81ce3f2bd63957688ff37326bb587f8ca", + "sha3_256_hash_of_signature": "c9b26ad620b3d3a6cb283cc6a36a7f0e2244d764dde8ebfd6c910840ee614275" + }, + { + "key_generation_seed": "8e4334b2589d0caecf0fd9ba584ea26a4123d4543a8a0fe126d4a7e07f6067af", + "sha3_256_hash_of_verification_key": "85f232ff813b8fb629cc74b11194d67951d712dcfaca0f2c79d2a067f760ef42", + "sha3_256_hash_of_signing_key": "35dd543ae0f9e18eb4349cff934d8f9ba7a19dcd35727c7c3e864b012c1b198c", + "message": "525e8b98c55864849ffc71ebc953f7a0eca6298f6aa15a83bf6923bd5921b1c86dbbfc544a39c364ef6d9281481e946c994f96829d6639727a5345560d8641e9a510f913f7fe5592c2a40cb278f5afd8d4504b5387c20945654f08168247a98f56a43a5020955f882d2d93781f4a83676b08f50341e953a5d1b67de7f6d1be3d78d5d060aa85b5ee4271763c437ccd595890dbc8fcfaf2754ae9349ba2fdf89847a15188716c0ec672887a4b9a15176ae0c5138819ca232d012be1dcffd29f677442083087c127cbd80b0d9cc0962bc8318e734910d1e2653bbf700c84bb0919e12df331ccdc7128b41f0666f6419afbadaf673be16c9177d3cf113c6488504de088149bfb83eacbbc400309b7ad753f7b2f5aa89f070c9d14c084c32df91c5f7cb6a7d869d64f4a05af80a98be7517ed784c17b0d7df96b9987b7ea7a398ce018ae6e13e1c0f7aa040ac3ffd273bb9687ad6fefdb211061a6228967e9dfef69bcc1c5d02ee56d49a93c8aad46d08322a2ca246ae8c3edc071d063ad605a97b8ae94d58e897a4a6310bcbf55b0cae1aa81769d30b46f883eaf29d4b5fea32f2dbde49360cb6235754bdc305abb5e5395360097378656e2bace675448889b0149d6086c51e9c3af07a76563164864f131cf9c0cd475cd4a58726ad237cfb76aca68032351fb24711da635871386b4bfc94b0db6d35f07d0196f75cedb92efbe7d653e0ff9326a596f9166ff6cab73125dad27f361d6122ca531d86910187e75f849edb52db26c96fdf05925dcca232480d3f979eab07cca68fc9069965d12bb666a180989ad1fbee3fe65e746c5a8f64dab2e370f0487d001121edd0d0d760531af46da65c75de11688ebf31dd2ac95c188bcfa07ea798609f3ea8e6364a43742a2825144fafc05abd17476480812eb2483734b13d075b3ee3ad510b67cf7057014351b2ce5357e3f12f43ba74ced614be3a9ac0e26763e9ac596f87ae98f72abe0de213a81a9a03e2b82f2312c1a186dfcfc3db346feb132931c793ecf837f57d8e326101f59705b77a3083e712ce347c2c29c23468b0c5857efa410197833987c61ecbc2a855ef78b3d7b1b697ab9844aad07c4b8ef666bd80daba5fcac900c5d358a11676ffc89dff4f36f29f14d9f9b854dced41ffc4b36381449d22801c19bf8e8ba1f07a1b38ffb527a34d009c4064a1e606ff2ab90ab2e05c156150ec14d7dc792578a16f46650d0abb61175d1817e2c38f109ebc01a3abb358673561691185da32eeef566c1ba1c72c1f08cd1b427b552425501b8783116f2eb0cff73c5d2def18d291c106980135821a77428fab20a935ac8b6dd8edd1a936225344eb103de0d5879cca09359b5b882291c0fb1fccf167c30dbecfc324ac315713cd10f35b72f0d4871a7cbaa2b4cc2bc2598f23da607c94a063c9e2013b0eda5f3bd5aadb2c429177a4bfd7b6181ed5f9a55c1f043da8155c9e7bebda7ea07dea49938fe07743df2295c220eb53348310842b1000b7a02ac025c3a94fa82d46ed7e2712de71b149742731ebe62e225d21a7f29d5f3a8a62b71fe16258570da412c07cecf82b2064ab5d98761c69fc5e899a8e174875b3179deaa0bf4a0261da9bf39148440dcbeb0c887e41fdf751505de79aa1f8593f45482b659f5b5f4cc3e7bfee59def49458db195a1a692b8af4aa44ccfb00b753ac761181b8aab39db82385ae776cfc585f7873613b62de55bb10a6b2f27e631ce41436c3fe390163e6f4ebd6b501519c96c06fadcac8f75920fe1435542fdf535ead6c0e3f41345996063b95a208defb6f110cc861580979bf4422ed395ca218cfc3b22c0ba8b31cb9eeeb51c3df35fece92795cafb8440f522b44e21b3a18d5cdbc296b887a4b927f36715e4ac2cab043d8b69a8704d6be24c725b0c2e814bca7b040c27fe8f4c14911051039af13f44e0485eb767f5404cfb6fd19da24d82fe24b53033c83dd8634e2e28aa330a81f14bac1c57dead7ffe39994d9d094383e14322e146a3df27a776e2f09a11ec9014c809f8e543594d6b4814918a129b36fd25015a044e04d3f081d4d201df86a0fcafbbfc695088170b8246776b6a28e59449c646d1e706cea96b12683cd3a7c60459d42989ca46694b0089cf88e9aec5e110f69fe0e3fe20d18309d1ba72a83a34813b771484505b08548fe5d376aaa0c414260ea4bce5eb81f6545cd5203026264938905be1e252574f4b4e71c6e12f99f6efd35effd64183cd0665fe89d6a357b1908e083511dce2cdf792a608044c31418c433f86719e156af3ff98d0f54ebeb9f9fbf24588a5557d310ef9d7cf5dd8a68512d8cb15114773c69d7b40c927858afc049f7c6a89841020e1c313c5c38b988ef505ebe6c15fc1d6ccd8b472f90ed64da895d06ac01bb99f455a195a670d22dbd5e3f03ac84a08831e9842a566e9785a0fd4c460c5cac154d705dce1e7fd1c45baeb23976af881cf5628f3cd92ab19bae8d45a03a859518e4a1e558fac2b48a432e46cf274e6496b63874ca4e4571132568aa43eec3d2a3948f40d327976a6d28cd816cfbeaf8fe126913384061d219f51179f679081503371ea0b6bd7e9524b0ece2573304ecb4a16eb471ca0817c0c6ede751f283aceec5a60c2796c6261ffc6226e4813241619f465dce67b38e1d5a647b079503144907307c7d6eb6e6ec1936b5c94fcc08a882b4555b19b33a9bf22384db38473a313966d157daf8aad41ef67d3a5fe723559096ab1768ff69773eb9d5c88d6f35f00dfa4473df71c7e9e35393638ded05d05c105cbf37711d38e3eee35e8cc0029b3761241fd1e56969e09e949690d4fe25735d774e777a2ca17fe058e14ae6806f611fb1e9fcd516e20499a704b67990716703a4287b50ab45d155d40edc0aaf97f5b87551c236cebe9cadd562b27957ead251f79caac6433f228b50167fb1a753306fff08b53a8a3cecc226857a321700ebe23ab4d6c35415ca79b682d6cfef6b1341e7ce00cb9870f432b63a2d9a9a43c87d28a95c514582812da37738bda6cc76142e08f69ebaa5acd0403100c2343e2fa088441e9a55c720bb509bc3600c27c1d39157e049650d1749751efe55a72349e2a5b714556ce2188ce972287be2152c7e58d3fcad43a214a4095de55cae9f627d8b9018daa01547842fa1ad14d67327cd47eb9b90cd94afdf5244de57e527f17894a410fb4210e06632e88a398400b0aa48cb3feb9a90acc668615d193d5a98158092fbb59ad2d6d4ffee433a2a6a971a228685ae5bbafb3ab28242c630af4656c5071c545618a0a765fce41b19970c2152d44c349d0cdfb29673d1a42ffec139d1c9958b0962f7b57f80cb8fe6331553b0df93da9bfc722b1c001f48ff9c0fef032610a1118ac9ebaf9202dffea605272a50a90768f031c72d570c0aa5b0d4fee4ad568895274388104c0bf88d03fadc3159d6cf28ac6a7e3e5cf6fe5c6658128cbf81456db8c29a76f9c75230f3837f1a94cb83c3aaabdf4b29c9045b45ab9552bbb6c0844bf2926267c0d74d3337249d5c9610e0f6ffd0278f12f39c48650c048d61a3fdb8e1a2e08ccca68803a55b39bd39160b0420cbeac7d8a55f571f490f694a7aa8b725ba84238ee1e711864aa1f74aff252c088e36b79b09c80278dd442eaea8c7d5833cd1baa18bdd866689e663eadd0eaa6e0c78a3e09dffe5f6f1f4003de24336586b25dc5ee45d56f31d8bb2de31b24e87172f3f1b26d400b08d50ff624e456183f269cbf06b3707260383174fda152e4d0c528a90c54114c4f278d0fb35b74dd3ecda14ee89d38e3227a7e18b068f134b22154348867a61719c926ea3320d1be0b9ed78466b2ded728ca04c15ac144185fb2f5084511a38cfd765659351ac1ac3e5f327d9f3de9b2b003758da78dfd08faef3625cedd87c8a55a3cd0257aa71b3788fd2449efd1f48948cb304468e3ca07ea7044fa185a2b91f9761c6532b9273db74c66b2de95ab19e5102cb90c719ec85671e2829b182bb6d09323248d6584f0ca67d422bcda65a0146d8df27ab4ae651706d5fa33b5bb88adc2a1a95105d55cca8439a5060d110760dee8b855d0839053be595278eae66542736d25c93d8544c6e55ed51ad6e7029c2e6d32cfa8844bc14972809e31754af84bb479c504ee77cb65ceddb6bda613feaa2ae6598d1f4975d0fcf9d9dc787eeb5c03f8b0bf438e83c38e2195ef1d35d40f5a14e194bc1bcc64d02ca722e7da28334e91fb6654d708c5b07946cdf58747086eb3ca59d095eb27f1b7e6806d3a35335b2265031a1120f28eed8b4c5d9af268502727c5d23152149c98e6970d4dcc4b9d0fecfa6a79fef82cb233e71fc8aa999df66ebf5a1db2ed1583c65803fa8958f49890d13bc05c6a991f26c31766bdef9bac601a47c8c3c5e395fd8f47e56f04439e9bc8e9b1901a529395f2d57495d70d0712881d298a60e3e013326cd56bf9f1319ea8d6a6511eeff373f081478a51e14f0aa4a33c6c5ea7816380c8984f7a5da45b0c4b6b550644e65a5b2df059ed050936fe6f073b4e8056accd3eb65a0b", + "signing_randomness": "6d3fd5876ed3c172ccb3c100d4b71d5a33bb4472e4cd328e7edebfb6dbb74d38", + "sha3_256_hash_of_signature": "b1ad5f75b37667c9a815cb2461aee5c49d302f1610f58e08deb6f4792c914b3b" + }, + { + "key_generation_seed": "37519a02e8021f2257259c0d2e499af3533c8ed8dd5bf7751cce920d79b518fa", + "sha3_256_hash_of_verification_key": "27a6cc2c42ccf258bcb80f163db40df45ad08bb4140c1e2a5c8f6d323e09744c", + "sha3_256_hash_of_signing_key": "0cc645bf984d52ceba11c058a72ac1f73087577d7d82c1dcd539489f06bdad92", + "message": "00769683fe7bfd74b3acd21af3898b74ca73dd126c8315538937cac4ef0ad4588765a26dcce1c90c559ce691e7eb3e0a497d357e1ab583c761439c0a66d1164518f01b6894067925753cc2866a91552fcd0ef029c2284c620caf364de6c56eb41ee0e4431d9be22b76451d132a3f9ad91a53449be820a7acf56f6adbc7107c7c729ec8a64fff6a24b4cf83ff4e945def336dbfea6067fccbd1cd6b5698adb1ad6df03fd0a553457b8e9feb4a1243feefc2df7f66ae3eca5bf169f7891adaea8d5c59012c7aa00a5a86b0a33d0006f8ad5a01c60abbda6d249d3fac7ebfb85103a3a747a45d0adb7def52ed3a5f1a620ee383a9c0cce1900e413fc74a7a97646111d54783928b15bca783d01efc67f49ce6f781e82d25d3f30561f507e3831cb4ea5b4a08d5489830017270b63d8298beebf48eb56bda5685d5e1e06404eb9a6c3790e9b29c99168b10badf8fdb03f3c568672773eec96428149ca272ea5a8083f8208bdce361e7d40bc4da75029d4a18b0b6ad615dbf849935d4755cffd270a52fa290811cd55bdca38ed89f0066adb9ba7f58366379ffe1caf3a9127e147c3af3dc27279391e0c09537e81e20e7b9fe4fe3da970fe50bfc96555233cc9e61d3c356aaa8eed5a8aea2327d7036ee03e7ee40aa35e9da4544b121514c261ec1cb0b2d75b1d5ce129e47f89825f69ba8254163179fc1331a917ae9c5a18556a10c5f983871b1258cb6fc8ad207f97a220c5598860b6c56f1eff09de6000241e901a89e107feec15833d34d6eb12db6b188faa0b858a5b9e32f84f783b43b6f8a3b2e4b044cff8902e1eb0c527bb4e29c92acc9dc7e0d9ac6b3a021415768b21dd9695983ee89c871c0eade0bce4fb72e682dfb5a2bb7498bf4d2c01240f67d1b62baa4e587069c16e3032114b14a1c4288febaebb4c75c3c05924a358c4bb7df95ecf81d67147fae3f605ede61b7ba164eba1ab36ece97db0ecb32a673e899b24557d8987af3adc57a9da609914c9b2d6d8ac58e5954e0db5aa9e75b444700b8f704e15a6a7bba81809fa8801c6ceb5747a44ceb8f99cfe6d8a2a03c03451e5f3d392725207f3dd28b2c00004425b7ae05fa3769183ab60857b27ab08bcc4321d293c93d1d850d4e7a81b14564d7b15ac0e3bc1bfe0561622c6aa06923eefe163629ede8ba1732dbfcad52d3baa6e11e569ea790b36a8472b2ca37bd5c0edd37d8f164b874952d00d592fb705c6b3110a12b03829c157191d33c579593e7828cda5c24a284ba2f5a42f0bfa601a8f6d3db1ca6d703ecbd261629c9f96ebc0458737b9951219e5b1f86192e2a85b47d80610a0acc8b1a70db2916f89cdb2c7f8943471ddbabd2a3536c5dc8a73cdeddeaaedc86fa148d2ee479f8465558852fcbea0dd8017f1b976281a5014319c2c3caccbf571d9550215b24134f6daef32716802e7945cb3f97afc1ab1da17d0c41b545a750ef345a6f88ad5ff52d512afa6558335b5eb8979d8e6dc1da562bb997e7d152d9fa3eaa09119c3474e11218230d8a56c19ad87fde483fbd6ddde9acba813bebc8505a323c601e5b5251650dae9334562e3dcc38a28bd7ded6942d0cc2014235c1b66cf4a57ba3010b83cc7050309f57a27207512d195d070db3d10ffcbacdb47e4231142bae588f92c5b0a71abd67ca9390c2e05fd2cf7a1fabb14c5a7ae3773c66db1f055214479e388b5e6abf0df8fd1b0e4f90828acc397643cbc274143fb4331262a20634877be4c7489c1ae9eaf90bb2a177a6b5ac15cbda27da0616e5f87461554f5686a7bd6d047ad0b98c8cdea3db78dd2970c78fb861f2a92ddc277876791c4a30f525659557831f4377065d19acb384cc68340152a6de6d84cdb58f433923d1fb8cc6b10bacd95b9ab1b45563998620d192032269fa8301c09a29c4b5b20ca0a3d63a4f5984b7db0f5b17417dc7b939b9b177bf423e2f3d57dff296e6e4ff0fb1744b13731206ead54ef0aa1da09bea8b0ac0ef71b73d009d30531de9fde90d86bf5f20d8e5a9e324e657a98f8c0031adac4385157ba4e28b48aed957a5b36c3b49057f8eca7f56808f794014dad170601070607010e004f42d01cc63b2a1761126ba045f1165e25fdd05901fac6b76e777faaaee6f5ed94302e2da28046b4bc60228e1b9e194f364e377f84681b3011583554b76fbf8d7456dbdea665adad6aa0556c8cc714f217a518a98615c4c1cfc8adbbd4d12c5bc23ad7a0f849e32fe2005334b55d7bcb43d1c95d4793e7c3882740cde8dd24b367294496a3e2f3251a66cdaece9e0a73d853f8d4e3a4637836ded68cb28ba4fcab02d61fb5cfa581792e636217f3238d78912ea0863816ffb2f388823174b19433c2b14bab69e12c3b791fe683744d4519455a52555af0d7e12749f6094afdba00fc6a609c7578c531fc4c3c3065ebf78414f112014726ec2230f9bcd9c15e36283144ccbe0d1785b65cf49ba8fefe92eb6907c0330bc98ac172ea9e8dd4df8974dd6b6772bbc6ca8e8562c5ec0b6592de7440ac915c35e0ac8087f22eba110ca3037b469b1d5bc92636d81881e38d8bbed01a29b3ebcf0c19eb95bf999eb848022592aeaab649ce19824ed9d3a32d75fba556ee07606a306d1fcec2e24b38274c361b7bc96ce37b7f4fe434eba17ac2a097051a92e4ec32e4c678f7762e8b96ebfd2600c0f224b04b2cd7e9f4ad327d53603828015e9cf45969800f02fa5e0ba26b8c844ba1fdffde44303ad0389c1b31d582877ca6bfad4973ba35fbb90ecdd95f430078bc39aa89434130a5fb8321e51f9624090d0277a9f112ee8ff65d3dba999c7c08727d0f08dcf00ce22f62c955d6a822f247c8065ab94ac442e1cb5f31254816794cc2556891a523b8aef09d3b9e07aa8b67b3b87567adebdbdfb93ba9a082f72052572c97e73af16cfc42d2a51a3683f84748a338aab56264753ba4083d356a27c71f47221ed8340c50afd46cd207c4f9634ab5a44888a4234770c46232c35eff83fa950b0a6879137dce209d5a1f26809b411f046f51ff084f15bfe03292ee845d3044235adbc299925235462e67f803daa1426f0e116b93f4532dd2784f7f87ae360281ce21f70d230c242e1a98de8fe1d6147ad71edec89e24a5980c45fd91e23516758af71df8e0dd96929d4da61a3baeabb96c9378986deb4c9101175e3af1e102b52a8da27d916ee4a28263ca485cfe87ee5436249c1a2f933669f6e3274e9bd93092f4a798ae85d6592ebb54dc65c28ba08582e275972b0a12c22a7792ccfd4a398e504c6fb2cf5ef1f9c268540b4fd7d07d59c49a559d86a56a009c4c18a3fceca109fc7a45c6e842abc22053e84878c4805d96ac96ba00fa40fc3b50407141105845055447ca94bd27f234183c2b8bf37f5cd249ed0705afaeae59c8be8f6b38069d67fb23f74284e8185c176b58b482900a3e09774383c7ecacf4fe5e580df99db102ad4018db73c73a635d3fcdc833b000c948d846aacc92ed54ffb3acae1bfe205d6b2312658f15decfa085d13bc3757c754c5704d8089563e0ccf52b04a49df293cafbbc2fed5d9551b5a3897ec7beaa56a4034bedceb4840a9bdfbb8bf47d66dd3a4e3eb1666372c6b2c39a48d52761bd36403cb130a087685e2eabb8711c11005ea09f90ac49665415c56cab6fd2719c45b6800df914f8ff327eed29d9b9a5bbd6b80b8bb31ad1522803b2c8d89166d5c6b2ed47bc5bbbc4abe6709d46b856ab81ddf15f098a9ab76a8257e7e5c2e7dae53fbd691736f0d6bafe0bb939172614e99c7d7e37754af6c3c637d076a43dbd70e5eae910c8170cecff1621e382d2977635b67f4fac555419f8a0bb76ccaeaef4c7385d293c9595ae10e5201c4a31b4c3ecb9f3b304efb1886f9c58a4ef04e73341b95d9bdb85d706b2a8d3fdd153743a8bb7b3289d0fe79f6a3b9e0fe160dd6700fd64fc87d9ac96858a6d395fef6f3d2193ebae7c3a92e18746a7f12b244fbc5b1df0086cc7045036519d9d7bf8e92b850ea0d3d1e775dea362362462dea2d3501d39203e2879070d1f7ac92fa1576f6d12886d5b979e3c788c09a769ef4ee45e14cd8e7553ebeefcd31ff3d43d4988db08f6630ba8ae8c7250ac42a3d78edb967d59310a4a224567d8797c42370cbd2302a3f49abeaf85fad9455f98b61ef2b5e34a5c552583872145e191bbffcaa526f5e38e497a1a1e1220a0f283a935ecd366a9069d5a2a80baba3a22fa85a2557db72d7e29eb4e33e8ed8bb4ec2ec7c2e9cedef46ea955834acf8c9ab23b78052446fd73c9d61683d7fa0088db97d07cc350af0b6b2ad7e66a493af814c11f8c0f2fdf0df40aafd0d218c00319c367e98d7f10c74ea06d31276f3f216e1cb2f12033915008cc83b00ac60fc9c2fb7f97d6e8cd79650d0f9d82bfd9cafef668021d3d165f3fe84221998bc8c29aea0b5b7e0f1f25a0d7447e806cc3fc39e6038be3df9ac01f46222d3a609f8a026744ab4f58a734e3782bec301ea91f2d8e2242d04a11e82474002143223f29656b1a7675aa5ad181004c4f1381df6a0f95a0186e82c04b4de881209e9ccca3ee5b1def0b02353738d92a07314403a1a2721c256121fba8b8ce9b460", + "signing_randomness": "5416d79e273c74904760e9c74983293e4075dcb9800e2fbcede78813c5c72c1a", + "sha3_256_hash_of_signature": "bee640368e4f17c28e803c16264030ed8ddbd8a5f53f63d40790c7552336d520" + }, + { + "key_generation_seed": "690482bff6c1d0ba6c071dd395adf69e55e1bfc4e0992a8650ffb5e60a02b172", + "sha3_256_hash_of_verification_key": "3ffaacc6d11cd73fcb77e43bef5de5102218f713d48c287b0538504b44e1867a", + "sha3_256_hash_of_signing_key": "a358b2257093960e5145f10b96327dd05c5ef3de8e97db6233fd51a3eebf54d6", + "message": "d21a6bb3a2356805e678673c45fb055fc5266e3f692af9935aea307f14a5c41b979966a5dfe42ebfed1487e4822b74ab5af28995e085ec8007eca4977c63ee5299fec63dccbc42eeacab488e574249e9d856146750ad97c8a443485ec1c5820beb0964640010f6407140791e74684dbb91052e2d8bef7bdcd78b2ec03c97a53295d683bdbe32a70dc19a2f75b8613aea9616ae0e280179492820f73fb7fa4121e673fb5c328f41b67ff8ffa7aee6564adaba046d6e1d6aa13fb24965390f829246dfa8763851405075f76cf94c66ffc3308214df0960c649aaedc22926ce9357d3875f8b71d68d75999aa3663c30a9edf07228bf7dff49ec1e6c7a33d2053597003b82392e826ebd701b4c981aaac9951c79e08f592c2c0637c8e5a7f9dcda599e859c317d4888b4098992e0e2d979e41c703686d577e5ba6001ec4f587140711293d664963632f87ea0461e0e0c5e9d8d292fb409f9f9ab172ee17fc8afabad06e42b437ce22924eb5dbd3a80a06962f3b37946259f9c75a233cb2b4abdc5cd1b648faeb1be8630db40d151b8fba693df2c5bdcaa14dc4783f450b6bc407515ceebc5c9a47bd1a141384f0b596cab1135c075651cba989c190f3171dc1d72330edaa01656813c4b7811715060b023fc426745c301b2a91e0d08ed3bded438c4ce6799c35f3981c882a0bde4a2feeb1a52cafa47b0c48558fc43f98fe08f03a71128362bb6fb9da6a22249f4d4352ae7d3dae85de497e2411eadcfe5bf1a3c075c45811e0097ecea255fe15bd8321fe8b546a8cacfb899eecf5419db363c7567c2fe7360b36de14674f500a31d3eec71451a7c0d5576a8939c0f6d4d9f2f03f3c516ce25ce73abb35c73aa94f6aefae6ad87052d6b195fa43586817f5bb974aae7f1b8608922411aa5b0d7d574016cbd3ded13395623470a108fa0e1d3f9faa7e1e5031843f2a23dbce8b196315290dea5795e4115d53dc570a444064cfa3c9457dbf3ee323b1966ecd2270c32910f8f430522471258a1f1955a6e1dd8c84ed9a566499bf85628615351abe84b401421da2cfaf575e2644c9304c075ecfc374066cec713fa4c0d89043689fbc59ff54b8f97ee0a3b0989bc5e4ef83cc9833e75bc8b67bb5ee3c06ea156611cda95a6702416807530ea206ed89835d20805ea988b1958569cdf7f809996214dadab4e20bd44917e3410ec6beac98fea07f764e85b66aed5e17cf675d2ed8e63db728fe75158cb31779e31379648b43d68ccff3780854cf03535c57122019456e73cf06769bf1fbf558542241ce665bd10f921828553585e0cf664cdc6160f9c47fa5330591b74194f4716056ca83993efec4a52db9a1fbd3b2f504ac19667325167407375b6d7de739f07947b511c8d475744e5c29d6e286a37f1ff8317bd0178f0e306a38fa6e75f4a80427feb2c91235d3e7f20d8101cfc03bb73f44ef59af3526e9afc580027a1dade37654238b8ec7af0105248fe30784a88b72e11fc1bd807e47a349bd29075befbb29730ef8e85e3abd5105559bacee74aa27d90d360a8d629dbec95eb34c7f7ca20096ff7b521e40d3944a975436896f372eeab6b8615eb91697965bbf955779dd3047f7e3bf029e3509a5780247445d6223d085afb4291d976efadc41e42dc2c0728d18f6155654a332fec72eb6aef8b92c1d177e3dc28c31971bcaff76ddebfd9588bc244b116d409e58dc5ada1648663d603c47faeb814aaa7eb9b6264356f926c18b9357bf426b89ddc8eb9177eceb5c6cdc64dd8feb7b326bc1ba89bd9035235da0e644ef959c58dd97b88d5c749b36931ac2694c67151db0894652e99254222d37cefe9e27b3dd663a152dbe29a3639afe42f4578937076180563aad6ad739255ea012a17d2a56627d84c44fbab261d392a966cfe19278799cf1634d42384323c496190d4b9fb662694e3887ea66ab9e8b195488c8dca47c8bc0424247759137cfbf86dedc3641904cb6facbb30a9fa84acf69a67b4afdf4c2aa420fc0d90cefa0dfbbcd3072d9f772fd6058e2bf0e251be93b00dc43765b53db51b22f12d3ed0cc5655e4aebd9d923f99a43e4461dcf5992030e66a1cdc3a65558d9bb3a39788d92328387d144850dd3706fd7a079e3d2398f542f91a8aaabf0c5068dbaf1fcc5160398abecf74884beb04f3a3ea38bbb80d798f5981b3f2db6c7b33f867b7dc06a4417e30f94cdb4f523aeea0be12bd75aaed57520db0d4b4f013be3a1dc7ae5c58fd1de9637f7d82f697b7e92da427a78feec6a5c0255eb57a43dea6cebc8805bc04e04fe789e222b1e2642d26edc14fb36ecc6092b3060e45eed6c5b35de8741f72933930ecbd7338cf39474122357365700cb50c5eb176fb92814fa7f4032570ccee6b859236ad5da5f1730129edc7be218ba9874620f6f0ebc45e0bd622f8fd1ae6974994af95c6519ec1c46650c073d194fa6ebc62f405f63a3416782a47872c7d77d648d0a1c802ffdfde5fdc112c94cfc68f401889efc522fe488fdb5384c0d93147ab6587659d936f98ecfbcdcfbf8b352d605f18c855e2559743ed97991c5d50df44a7b929303835654a3955abc5bee6327400a7ccce460b318d8b5ece5b12f606adb3d7b5ed59563b8e675e78029aabc234442c2463256fe02b04f556da35c4615d14a9f4eff17db0db81de4bdd894f6628a120be2d4cf3e1f46d53817899657035a76137e23c0b0e8ddd29465d7f15628fd435e6caaca4194fdbf85fdcc31d5dafcb52568b7c0cfbe713bc85fa424ba3abe149e4035fc86807a8b876d2163b447cad5ec0e6ef38a1d591afb46267f9dbf142cab1cac1f73beba212992fc6d4647ec17848d1adbb1901277a5078dd72d9c9184e893c0806e9b4aff0a824670d438620f2a7e8d2965b619d291e5824c014fc888a36fbbe17356431f0039038f9b497902aed969f9c488390b7087763638e976801127baf1f53803c4dc9649f0ee85d67b239e2bdafb2bd75f1d1da22a56fb3af10a9dde7ad306c4af8681029316c0e1949228e6bf5adf942f1c0ef92b2bcbc0c70d49e5808851444240a78b14d21b54f66271482f49b85f5180b268050327368496cfa8b54ecb97ee6d28eb74a3742f68583da046809002c22f7b31fbc0566969f9a15cdca892c4beb101a2ac3526c76e9d30982c9b4893450fdec4001d2431828d24d8b1a67df80e2e10ed2ea8d723227055c48006665f7da8e032efdc70bc7eeb2b369b551fac542ad6df1a23107e2b3c0e3ccacc25f26404c085cbf56e52d35d7948db9fda6dfc24709994719d8ced41a2cc9b3c4b2bef0967cb71861cf0e6aea9bec9395726aa0e2f1a7247ed0f6038e3df4bf566786073590dcf97f8f0a99658d8f630a2d130c46cf4d26c669360d0f70b75f904c9f923ab285d5db129f6c25ad21f9e26ac844d07a8eed86c4e224ebfc5b3f720d6f94b0a01b1433c46b40cf84e80f7a6afa7bb8f9acf818ad3cab2ddd6904c067bea4f1fe79b83cb0aa8fc75b6b096bad6fe94abfd48f8efc0f2b9a02ebda8fdbdbe1c77f1854edba18aae7f31ced9cd34c1b355108df18a8953932f7554af05b203a96a9bb93e0eff51d7f93b56e351562cf85a2d35eae2c2427b89a8662a1c723d4f14e6eafdbd636c2bb7ade29c1a6bc8a463734c808bec68b1e9a31af6e29b412f1cb8c90a9911ac5c3ea71e46113d2d7b1ae2d8802b06a770fd0e9e4652895e42181ad09bb541e9493f258711bb7bedd3e7ca8b8ce875669cf80a6880eca3f13800de7011ea67f443e505c4fb455608ae586f922b3c83fd33b306bdedb86223c33e3aa65edc93cbcf3a03adaf9f328997951d59a9200c0ba2618e3596af176b43122cedc52b1e006ea6d12dc236a6fcd7cc46825f2ef7ed71683a731d746fff2fe54e0b392a8cbfa38873196bb2b835dca7cb7c3ed9a004c7a329b9734a111744bdacdb669e69e9df1e52f07c513e3752a0ccd81d7ddc4a64868b7bb2bbbd2095373480522be10615248a179dcb61dac90f7fa5fa9b84f190a9c62b5ff9cd473a940f03e7107157d7eb60af1e3e384ffe8a67dcb2389b3b0fab7c789cf100ca95cd6a85442cb9a2c243fb9d454b20bae5762d72b8fe79b4df81163d61de4578cf976992d8b9989fc68089f811f53db1e1092b60220552876b818bea981571898cd6ab7b5f13c46b0a076526e3241d65014f855efd7bde08ad91f259dcb64e94ec3dad97811eb024ee1d341521dc92ae5e93c73422088976f2d27d64e1d193b955e6736ad2bccf3c1a53d590576434acbc0b687f27f255fef354e68aca47160efa7126f908e08e4548c11546d9c412d685fa84d2eb4dcb2bdfc48e2fa8023548198ebb072a48044f4391143e3bef4ff9066a4b0d03adc826819d67588ba84f99da27424103652acc039ddd3b567851cd78e4117a8b93afe01fc8eebdaa1acb8ba9d095789e76b9d5ab9ee177a15d666ef171fe1d4bdccfe2e58ce669b561f63028c6ce26db5c8182fe048680b175c7ab407215ff3a7801c950d509867ab1b0bef89b3e38a387915225ede76f91aad15a85d8c46efd588bb3baacbc52c036211512473420f3f061f5f53e9353de0780425745a76439b3811511c86ca503251f24113384e1a24a9367536e796ce08b896f572489a2339e82a856c", + "signing_randomness": "544516c0b4d99ab3a7305c9c23bfe846782508ffb748e223fd93d7ca84e88507", + "sha3_256_hash_of_signature": "dd51809a30f0dbaaf8d1bdbcd430cb617c23b33ca7dd587d3ca9842572d35e31" + } +] \ No newline at end of file diff --git a/regress/unittests/crypto/tests.c b/regress/unittests/crypto/tests.c new file mode 100644 index 000000000000..53a44fb0e8cc --- /dev/null +++ b/regress/unittests/crypto/tests.c @@ -0,0 +1,114 @@ +/* $OpenBSD: tests.c,v 1.1 2026/06/14 04:08:06 djm Exp $ */ +/* + * Regress test for crypto ergonomic API + * + * Placed in the public domain + */ + +#include +#include + +#include "../test_helper/test_helper.h" +#include "sshbuf.h" + +void mldsa_tests(void); +void mlkem_tests(void); +void ed25519_tests(void); +void mldsa_eddsa_tests(void); + +struct sshbuf *load_text_file(const char *name); +char *get_json_string(struct sshbuf *content, const char *key, int consume); + +static struct sshbuf * +load_file(const char *name) +{ + struct sshbuf *ret = NULL; + + ASSERT_INT_EQ(sshbuf_load_file(test_data_file(name), &ret), 0); + ASSERT_PTR_NE(ret, NULL); + return ret; +} + +struct sshbuf * +load_text_file(const char *name) +{ + struct sshbuf *ret = load_file(name); + const u_char *p; + size_t len; + + /* Trim whitespace at EOL */ + for (p = sshbuf_ptr(ret); (len = sshbuf_len(ret)) > 0;) { + len--; + if (p[len] == '\r' || p[len] == '\t' || + p[len] == ' ' || p[len] == '\n') + ASSERT_INT_EQ(sshbuf_consume_end(ret, 1), 0); + else + break; + } + /* \0 terminate */ + ASSERT_INT_EQ(sshbuf_put_u8(ret, 0), 0); + return ret; +} + + +/* + * Simple JSON-ish parser for test vectors. + * Extracts the value for a given key. + * Errors cause ASSERT_* failures. + */ +char * +get_json_string(struct sshbuf *content, const char *key, int consume) +{ + struct sshbuf *tmp; + char *k, *ret; + size_t off, end_off; + u_char c; + + tmp = sshbuf_fromb(content); + ASSERT_PTR_NE(tmp, NULL); + ASSERT_INT_GT(asprintf(&k, "\"%s\"", key), 0); + if (sshbuf_find(tmp, 0, k, strlen(k), &off) != 0) { + fprintf(stderr, "Key %s not found in JSON\n", k); + ASSERT_INT_EQ(1, 0); + } + ASSERT_INT_EQ(sshbuf_consume(tmp, off + strlen(k)), 0); + free(k); + + /* Skip colon, spaces, commas */ + while (sshbuf_len(tmp) > 0) { + c = *sshbuf_ptr(tmp); + if (isspace(c) || c == ':' || c == ',') + ASSERT_INT_EQ(sshbuf_consume(tmp, 1), 0); + else + break; + } + /* Expect opening quote */ + ASSERT_INT_EQ(sshbuf_get_u8(tmp, &c), 0); + ASSERT_CHAR_EQ(c, '"'); + /* Find closing quote */ + ASSERT_INT_EQ(sshbuf_find(tmp, 0, "\"", 1, &end_off), 0); + ASSERT_PTR_NE(ret = malloc(end_off + 1), NULL); + memcpy(ret, sshbuf_ptr(tmp), end_off); + ret[end_off] = '\0'; + if (consume) { + ASSERT_INT_EQ(sshbuf_consume(tmp, end_off), 0); + ASSERT_INT_EQ(sshbuf_consume_upto_child(content, tmp), 0); + } + sshbuf_free(tmp); + return ret; +} + +void +tests(void) +{ + mldsa_tests(); + mlkem_tests(); + ed25519_tests(); + mldsa_eddsa_tests(); +} + +void +benchmarks(void) +{ + /* none */ +} diff --git a/regress/unittests/hostkeys/Makefile b/regress/unittests/hostkeys/Makefile index 2e154e12f755..4a88de405d1c 100644 --- a/regress/unittests/hostkeys/Makefile +++ b/regress/unittests/hostkeys/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.15 2026/02/06 23:39:14 dtucker Exp $ +# $OpenBSD: Makefile,v 1.16 2026/06/14 04:08:06 djm Exp $ PROG=test_hostkeys SRCS=tests.c test_iterate.c @@ -11,7 +11,7 @@ SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c SRCS+=addr.c addrmatch.c bitmap.c hostfile.c SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c ssherr-libcrypto.c - +SRCS+=ssh-mldsa-eddsa.c libcrux-mlkem-mldsa.c SRCS+=digest-openssl.c ed25519-openssl.c #SRCS+=digest-libc.c ed25519.c SRCS+=utf8.c diff --git a/regress/unittests/kex/Makefile b/regress/unittests/kex/Makefile index 7a53978f1749..bf17468034eb 100644 --- a/regress/unittests/kex/Makefile +++ b/regress/unittests/kex/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.21 2026/02/06 23:39:14 dtucker Exp $ +# $OpenBSD: Makefile,v 1.22 2026/06/14 04:08:06 djm Exp $ PROG=test_kex SRCS=tests.c test_kex.c test_proposal.c @@ -12,6 +12,7 @@ SRCS+=addr.c addrmatch.c bitmap.c packet.c dispatch.c canohost.c ssh_api.c SRCS+=compat.c SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c ssherr-libcrypto.c +SRCS+=libcrux-mlkem-mldsa.c ssh-mldsa-eddsa.c SRCS+= kex.c SRCS+= kex-names.c diff --git a/regress/unittests/servconf/Makefile b/regress/unittests/servconf/Makefile index 277c08e02440..3a095aff5b04 100644 --- a/regress/unittests/servconf/Makefile +++ b/regress/unittests/servconf/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.1 2026/05/31 11:39:44 djm Exp $ +# $OpenBSD: Makefile,v 1.2 2026/06/14 04:08:06 djm Exp $ PROG=test_servconf SRCS=tests.c @@ -16,6 +16,7 @@ SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c SRCS+=utf8.c ssherr-libcrypto.c SRCS+=kex.c kex-names.c packet.c dispatch.c compat.c canohost.c SRCS+=digest-openssl.c ed25519-openssl.c +SRCS+=libcrux-mlkem-mldsa.c ssh-mldsa-eddsa.c REGRESS_TARGETS=run-regress-${PROG} diff --git a/regress/unittests/sshkey/Makefile b/regress/unittests/sshkey/Makefile index 083175cbf264..c862b9d3ab06 100644 --- a/regress/unittests/sshkey/Makefile +++ b/regress/unittests/sshkey/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.16 2026/02/06 23:39:14 dtucker Exp $ +# $OpenBSD: Makefile,v 1.17 2026/06/14 04:08:06 djm Exp $ PROG=test_sshkey SRCS=tests.c test_sshkey.c test_file.c test_fuzz.c common.c @@ -11,7 +11,7 @@ SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c SRCS+=addr.c addrmatch.c bitmap.c SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c -SRCS+=utf8.c ssherr-libcrypto.c +SRCS+=utf8.c ssherr-libcrypto.c libcrux-mlkem-mldsa.c ssh-mldsa-eddsa.c SRCS+=digest-openssl.c ed25519-openssl.c #SRCS+=digest-libc.c ed25519.c diff --git a/regress/unittests/sshkey/mktestdata.sh b/regress/unittests/sshkey/mktestdata.sh index 97e5d79fd734..e9e8c91c8baf 100755 --- a/regress/unittests/sshkey/mktestdata.sh +++ b/regress/unittests/sshkey/mktestdata.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $OpenBSD: mktestdata.sh,v 1.12 2025/05/06 06:05:48 djm Exp $ +# $OpenBSD: mktestdata.sh,v 1.13 2026/06/14 04:08:06 djm Exp $ PW=mekmitasdigoat @@ -58,16 +58,17 @@ else exit 1 fi -rm -f rsa_1 ecdsa_1 ed25519_1 -rm -f rsa_2 ecdsa_2 ed25519_2 +rm -f rsa_1 ecdsa_1 ed25519_1 mldsa44_ed25519_1 +rm -f rsa_2 ecdsa_2 ed25519_2 mldsa44_ed25519_2 rm -f rsa_n ecdsa_n # new-format keys -rm -f rsa_1_pw ecdsa_1_pw ed25519_1_pw +rm -f rsa_1_pw ecdsa_1_pw ed25519_1_pw mldsa44_ed25519_1_pw rm -f rsa_n_pw ecdsa_n_pw rm -f pw *.pub *.bn.* *.param.* *.fp *.fp.bb ssh-keygen -t rsa -b 1024 -C "RSA test key #1" -N "" -f rsa_1 -m PEM ssh-keygen -t ecdsa -b 256 -C "ECDSA test key #1" -N "" -f ecdsa_1 -m PEM ssh-keygen -t ed25519 -C "ED25519 test key #1" -N "" -f ed25519_1 +ssh-keygen -t ssh-mldsa44-ed25519@openssh.com -C "MLDSA44-ED25519 test key #1" -N "" -f mldsa44_ed25519_1 ssh-keygen -w "$SK_DUMMY" -t ecdsa-sk -C "ECDSA-SK test key #1" \ -N "" -f ecdsa_sk1 ssh-keygen -w "$SK_DUMMY" -t ed25519-sk -C "ED25519-SK test key #1" \ @@ -77,6 +78,7 @@ ssh-keygen -w "$SK_DUMMY" -t ed25519-sk -C "ED25519-SK test key #1" \ ssh-keygen -t rsa -b 2048 -C "RSA test key #2" -N "" -f rsa_2 -m PEM ssh-keygen -t ecdsa -b 521 -C "ECDSA test key #2" -N "" -f ecdsa_2 -m PEM ssh-keygen -t ed25519 -C "ED25519 test key #2" -N "" -f ed25519_2 +ssh-keygen -t ssh-mldsa44-ed25519@openssh.com -C "MLDSA44-ED25519 test key #2" -N "" -f mldsa44_ed25519_2 ssh-keygen -w "$SK_DUMMY" -t ecdsa-sk -C "ECDSA-SK test key #2" \ -N "" -f ecdsa_sk2 ssh-keygen -w "$SK_DUMMY" -t ed25519-sk -C "ED25519-SK test key #2" \ @@ -91,6 +93,7 @@ ssh-keygen -pf ecdsa_n -N "" cp rsa_1 rsa_1_pw cp ecdsa_1 ecdsa_1_pw cp ed25519_1 ed25519_1_pw +cp mldsa44_ed25519_1 mldsa44_ed25519_1_pw cp ecdsa_sk1 ecdsa_sk1_pw cp ed25519_sk1 ed25519_sk1_pw cp rsa_1 rsa_n_pw @@ -99,6 +102,7 @@ cp ecdsa_1 ecdsa_n_pw ssh-keygen -pf rsa_1_pw -m PEM -N "$PW" ssh-keygen -pf ecdsa_1_pw -m PEM -N "$PW" ssh-keygen -pf ed25519_1_pw -N "$PW" +ssh-keygen -pf mldsa44_ed25519_1_pw -N "$PW" ssh-keygen -pf ecdsa_sk1_pw -m PEM -N "$PW" ssh-keygen -pf ed25519_sk1_pw -N "$PW" ssh-keygen -pf rsa_n_pw -N "$PW" @@ -119,6 +123,9 @@ ssh-keygen -s rsa_2 -I hugo -n user1,user2 \ ssh-keygen -s rsa_2 -I hugo -n user1,user2 \ -Oforce-command=/bin/ls -Ono-port-forwarding -Osource-address=10.0.0.0/8 \ -V 19990101:20110101 -z 4 ed25519_1.pub +ssh-keygen -s rsa_2 -I hugo -n user1,user2 \ + -Oforce-command=/bin/ls -Ono-port-forwarding -Osource-address=10.0.0.0/8 \ + -V 19990101:20110101 -z 4 mldsa44_ed25519_1.pub ssh-keygen -s rsa_2 -I hugo -n user1,user2 \ -Oforce-command=/bin/ls -Ono-port-forwarding -Osource-address=10.0.0.0/8 \ -V 19990101:20110101 -z 4 ecdsa_sk1.pub @@ -145,6 +152,8 @@ ssh-keygen -s ecdsa_1 -I julius -n host1,host2 -h \ -V 19990101:20110101 -z 7 ecdsa_1.pub ssh-keygen -s ed25519_1 -I julius -n host1,host2 -h \ -V 19990101:20110101 -z 8 ed25519_1.pub +ssh-keygen -s ed25519_1 -I julius -n host1,host2 -h \ + -V 19990101:20110101 -z 8 mldsa44_ed25519_1.pub ssh-keygen -s ecdsa_1 -I julius -n host1,host2 -h \ -V 19990101:20110101 -z 7 ecdsa_sk1.pub ssh-keygen -s ed25519_1 -I julius -n host1,host2 -h \ @@ -153,28 +162,33 @@ ssh-keygen -s ed25519_1 -I julius -n host1,host2 -h \ ssh-keygen -lf rsa_1 | awk '{print $2}' > rsa_1.fp ssh-keygen -lf ecdsa_1 | awk '{print $2}' > ecdsa_1.fp ssh-keygen -lf ed25519_1 | awk '{print $2}' > ed25519_1.fp +ssh-keygen -lf mldsa44_ed25519_1 | awk '{print $2}' > mldsa44_ed25519_1.fp ssh-keygen -lf ecdsa_sk1 | awk '{print $2}' > ecdsa_sk1.fp ssh-keygen -lf ed25519_sk1 | awk '{print $2}' > ed25519_sk1.fp ssh-keygen -lf rsa_2 | awk '{print $2}' > rsa_2.fp ssh-keygen -lf ecdsa_2 | awk '{print $2}' > ecdsa_2.fp ssh-keygen -lf ed25519_2 | awk '{print $2}' > ed25519_2.fp +ssh-keygen -lf mldsa44_ed25519_2 | awk '{print $2}' > mldsa44_ed25519_2.fp ssh-keygen -lf ecdsa_sk2 | awk '{print $2}' > ecdsa_sk2.fp ssh-keygen -lf ed25519_sk2 | awk '{print $2}' > ed25519_sk2.fp ssh-keygen -lf rsa_1-cert.pub | awk '{print $2}' > rsa_1-cert.fp ssh-keygen -lf ecdsa_1-cert.pub | awk '{print $2}' > ecdsa_1-cert.fp ssh-keygen -lf ed25519_1-cert.pub | awk '{print $2}' > ed25519_1-cert.fp +ssh-keygen -lf mldsa44_ed25519_1-cert.pub | awk '{print $2}' > mldsa44_ed25519_1-cert.fp ssh-keygen -lf ecdsa_sk1-cert.pub | awk '{print $2}' > ecdsa_sk1-cert.fp ssh-keygen -lf ed25519_sk1-cert.pub | awk '{print $2}' > ed25519_sk1-cert.fp ssh-keygen -Bf rsa_1 | awk '{print $2}' > rsa_1.fp.bb ssh-keygen -Bf ecdsa_1 | awk '{print $2}' > ecdsa_1.fp.bb ssh-keygen -Bf ed25519_1 | awk '{print $2}' > ed25519_1.fp.bb +ssh-keygen -Bf mldsa44_ed25519_1 | awk '{print $2}' > mldsa44_ed25519_1.fp.bb ssh-keygen -Bf ecdsa_sk1 | awk '{print $2}' > ecdsa_sk1.fp.bb ssh-keygen -Bf ed25519_sk1 | awk '{print $2}' > ed25519_sk1.fp.bb ssh-keygen -Bf rsa_2 | awk '{print $2}' > rsa_2.fp.bb ssh-keygen -Bf ecdsa_2 | awk '{print $2}' > ecdsa_2.fp.bb ssh-keygen -Bf ed25519_2 | awk '{print $2}' > ed25519_2.fp.bb +ssh-keygen -Bf mldsa44_ed25519_2 | awk '{print $2}' > mldsa44_ed25519_2.fp.bb ssh-keygen -Bf ecdsa_sk2 | awk '{print $2}' > ecdsa_sk2.fp.bb ssh-keygen -Bf ed25519_sk2 | awk '{print $2}' > ed25519_sk2.fp.bb diff --git a/regress/unittests/sshkey/test_file.c b/regress/unittests/sshkey/test_file.c index e412b75d8321..296e90e78722 100644 --- a/regress/unittests/sshkey/test_file.c +++ b/regress/unittests/sshkey/test_file.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_file.c,v 1.13 2025/05/06 06:05:48 djm Exp $ */ +/* $OpenBSD: test_file.c,v 1.14 2026/06/14 04:08:06 djm Exp $ */ /* * Regress test for sshkey.h key management API * @@ -330,6 +330,71 @@ sshkey_file_tests(void) sshkey_free(k1); + TEST_START("parse MLDSA44-ED25519 from private"); + buf = load_file("mldsa44_ed25519_1"); + ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0); + sshbuf_free(buf); + ASSERT_PTR_NE(k1, NULL); + ASSERT_INT_EQ(k1->type, KEY_MLDSA44_ED25519); + TEST_DONE(); + + TEST_START("parse MLDSA44-ED25519 from private w/ passphrase"); + buf = load_file("mldsa44_ed25519_1_pw"); + ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, + (const char *)sshbuf_ptr(pw), &k2, NULL), 0); + sshbuf_free(buf); + ASSERT_PTR_NE(k2, NULL); + ASSERT_INT_EQ(sshkey_equal(k1, k2), 1); + sshkey_free(k2); + TEST_DONE(); + + TEST_START("load MLDSA44-ED25519 from public"); + ASSERT_INT_EQ(sshkey_load_public( + test_data_file("mldsa44_ed25519_1.pub"), &k2, NULL), 0); + ASSERT_PTR_NE(k2, NULL); + ASSERT_INT_EQ(sshkey_equal(k1, k2), 1); + sshkey_free(k2); + TEST_DONE(); + + TEST_START("load MLDSA44-ED25519 cert"); + ASSERT_INT_EQ(sshkey_load_cert( + test_data_file("mldsa44_ed25519_1"), &k2), 0); + ASSERT_PTR_NE(k2, NULL); + ASSERT_INT_EQ(k2->type, KEY_MLDSA44_ED25519_CERT); + ASSERT_INT_EQ(sshkey_equal(k1, k2), 0); + ASSERT_INT_EQ(sshkey_equal_public(k1, k2), 1); + TEST_DONE(); + + TEST_START("MLDSA44-ED25519 key hex fingerprint"); + buf = load_text_file("mldsa44_ed25519_1.fp"); + cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA256, SSH_FP_BASE64); + ASSERT_PTR_NE(cp, NULL); + ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf)); + sshbuf_free(buf); + free(cp); + TEST_DONE(); + + TEST_START("MLDSA44-ED25519 cert hex fingerprint"); + buf = load_text_file("mldsa44_ed25519_1-cert.fp"); + cp = sshkey_fingerprint(k2, SSH_DIGEST_SHA256, SSH_FP_BASE64); + ASSERT_PTR_NE(cp, NULL); + ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf)); + sshbuf_free(buf); + free(cp); + sshkey_free(k2); + TEST_DONE(); + + TEST_START("MLDSA44-ED25519 key bubblebabble fingerprint"); + buf = load_text_file("mldsa44_ed25519_1.fp.bb"); + cp = sshkey_fingerprint(k1, SSH_DIGEST_SHA1, SSH_FP_BUBBLEBABBLE); + ASSERT_PTR_NE(cp, NULL); + ASSERT_STRING_EQ(cp, (const char *)sshbuf_ptr(buf)); + sshbuf_free(buf); + free(cp); + TEST_DONE(); + + sshkey_free(k1); + #ifdef ENABLE_SK #if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC) TEST_START("parse ECDSA-SK from private"); diff --git a/regress/unittests/sshkey/test_fuzz.c b/regress/unittests/sshkey/test_fuzz.c index d0f47d7cfd1d..fb178c1e4d15 100644 --- a/regress/unittests/sshkey/test_fuzz.c +++ b/regress/unittests/sshkey/test_fuzz.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_fuzz.c,v 1.15 2025/05/06 06:05:48 djm Exp $ */ +/* $OpenBSD: test_fuzz.c,v 1.16 2026/06/14 04:08:06 djm Exp $ */ /* * Fuzz tests for key parsing * @@ -52,10 +52,12 @@ public_fuzz(struct sshkey *k) u_int fuzzers = FUZZ_1_BIT_FLIP | FUZZ_1_BYTE_FLIP | FUZZ_TRUNCATE_START | FUZZ_TRUNCATE_END; - if (test_is_fast()) + /* MLDSA44_ED25519 keys are large and slow to fuzz */ + if (test_is_fast() || sshkey_type_plain(k->type) == KEY_MLDSA44_ED25519) fuzzers &= ~FUZZ_1_BIT_FLIP; if (test_is_slow()) fuzzers |= FUZZ_2_BIT_FLIP | FUZZ_2_BYTE_FLIP; + ASSERT_PTR_NE(buf = sshbuf_new(), NULL); ASSERT_INT_EQ(sshkey_putb(k, buf), 0); fuzz = fuzz_begin(fuzzers, sshbuf_mutable_ptr(buf), sshbuf_len(buf)); @@ -80,7 +82,8 @@ sig_fuzz(struct sshkey *k, const char *sig_alg) u_int fuzzers = FUZZ_1_BIT_FLIP | FUZZ_1_BYTE_FLIP | FUZZ_2_BYTE_FLIP | FUZZ_TRUNCATE_START | FUZZ_TRUNCATE_END; - if (test_is_fast()) + /* MLDSA44_ED25519 keys are large and slow to fuzz */ + if (test_is_fast() || sshkey_type_plain(k->type) == KEY_MLDSA44_ED25519) fuzzers &= ~FUZZ_2_BYTE_FLIP; if (test_is_slow()) fuzzers |= FUZZ_2_BIT_FLIP; @@ -226,6 +229,32 @@ sshkey_fuzz_tests(void) fuzz_cleanup(fuzz); TEST_DONE(); + /* MLDSA44-ED25519 are large and slow to fuzz */ + TEST_START("fuzz MLDSA44-ED25519 private"); + buf = load_file("mldsa44_ed25519_1"); + fuzz = fuzz_begin(FUZZ_BASE64, sshbuf_mutable_ptr(buf), + sshbuf_len(buf)); + ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0); + sshkey_free(k1); + sshbuf_free(buf); + ASSERT_PTR_NE(fuzzed = sshbuf_new(), NULL); + TEST_ONERROR(onerror, fuzz); + for(i = 0; !fuzz_done(fuzz); i++, fuzz_next(fuzz)) { + r = sshbuf_put(fuzzed, fuzz_ptr(fuzz), fuzz_len(fuzz)); + ASSERT_INT_EQ(r, 0); + if (sshkey_parse_private_fileblob(fuzzed, "", &k1, NULL) == 0) + sshkey_free(k1); + sshbuf_reset(fuzzed); + if (test_is_fast() && i >= NUM_FAST_BASE64_TESTS) + break; + /* MLDSA44_ED25519 keys are large and slow to fuzz */ + if (!test_is_slow() || i >= NUM_FAST_BASE64_TESTS) + break; + } + sshbuf_free(fuzzed); + fuzz_cleanup(fuzz); + TEST_DONE(); + #ifdef WITH_OPENSSL TEST_START("fuzz RSA public"); buf = load_file("rsa_1"); @@ -272,6 +301,21 @@ sshkey_fuzz_tests(void) sshkey_free(k1); TEST_DONE(); + TEST_START("fuzz MLDSA44-ED25519 public"); + buf = load_file("mldsa44_ed25519_1"); + ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0); + sshbuf_free(buf); + public_fuzz(k1); + sshkey_free(k1); + TEST_DONE(); + + TEST_START("fuzz MLDSA44-ED25519 cert"); + ASSERT_INT_EQ(sshkey_load_cert( + test_data_file("mldsa44_ed25519_1"), &k1), 0); + public_fuzz(k1); + sshkey_free(k1); + TEST_DONE(); + #ifdef WITH_OPENSSL TEST_START("fuzz RSA sig"); buf = load_file("rsa_1"); @@ -316,6 +360,14 @@ sshkey_fuzz_tests(void) sshkey_free(k1); TEST_DONE(); + TEST_START("fuzz MLDSA44-ED25519 sig"); + buf = load_file("mldsa44_ed25519_1"); + ASSERT_INT_EQ(sshkey_parse_private_fileblob(buf, "", &k1, NULL), 0); + sshbuf_free(buf); + sig_fuzz(k1, NULL); + sshkey_free(k1); + TEST_DONE(); + /* XXX fuzz decoded new-format blobs too */ /* XXX fuzz XMSS too */ diff --git a/regress/unittests/sshkey/test_sshkey.c b/regress/unittests/sshkey/test_sshkey.c index 1701c87c54a8..ec0ce452c751 100644 --- a/regress/unittests/sshkey/test_sshkey.c +++ b/regress/unittests/sshkey/test_sshkey.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_sshkey.c,v 1.33 2026/03/06 06:57:33 dtucker Exp $ */ +/* $OpenBSD: test_sshkey.c,v 1.34 2026/06/14 04:08:06 djm Exp $ */ /* * Regress test for sshkey.h key management API * @@ -291,6 +291,15 @@ sshkey_tests(void) k1 = NULL; TEST_DONE(); + TEST_START("new/free KEY_MLDSA44_ED25519"); + k1 = sshkey_new(KEY_MLDSA44_ED25519); + ASSERT_PTR_NE(k1, NULL); + ASSERT_PTR_EQ(k1->mldsa_ed25519_sk, NULL); + ASSERT_PTR_EQ(k1->mldsa_ed25519_pk, NULL); + sshkey_free(k1); + k1 = NULL; + TEST_DONE(); + TEST_START("generate KEY_RSA too small modulus"); ASSERT_INT_EQ(sshkey_generate(KEY_RSA, 128, &k1), SSH_ERR_KEY_LENGTH); @@ -348,6 +357,16 @@ sshkey_tests(void) ASSERT_PTR_NE(kf->ed25519_sk, NULL); TEST_DONE(); + TEST_START("generate KEY_MLDSA44_ED25519"); + ASSERT_INT_EQ(sshkey_generate(KEY_MLDSA44_ED25519, 256, &k1), 0); + ASSERT_PTR_NE(k1, NULL); + ASSERT_INT_EQ(k1->type, KEY_MLDSA44_ED25519); + ASSERT_PTR_NE(k1->mldsa_ed25519_pk, NULL); + ASSERT_PTR_NE(k1->mldsa_ed25519_sk, NULL); + sshkey_free(k1); + k1 = NULL; + TEST_DONE(); + #ifdef WITH_OPENSSL TEST_START("demote KEY_RSA"); ASSERT_INT_EQ(sshkey_from_private(kr, &k1), 0); @@ -404,6 +423,23 @@ sshkey_tests(void) k1 = NULL; TEST_DONE(); + TEST_START("demote KEY_MLDSA44_ED25519"); + ASSERT_INT_EQ(sshkey_generate(KEY_MLDSA44_ED25519, 256, &k2), 0); + ASSERT_INT_EQ(sshkey_from_private(k2, &k1), 0); + ASSERT_PTR_NE(k1, NULL); + ASSERT_PTR_NE(k2, k1); + ASSERT_INT_EQ(k1->type, KEY_MLDSA44_ED25519); + ASSERT_PTR_NE(k1->mldsa_ed25519_pk, NULL); + ASSERT_PTR_EQ(k1->mldsa_ed25519_sk, NULL); + TEST_DONE(); + + TEST_START("equal KEY_MLDSA44_ED25519/demoted KEY_MLDSA44_ED25519"); + ASSERT_INT_EQ(sshkey_equal(k2, k1), 1); + sshkey_free(k1); + sshkey_free(k2); + k1 = k2 = NULL; + TEST_DONE(); + #ifdef WITH_OPENSSL TEST_START("equal mismatched key types"); ASSERT_INT_EQ(sshkey_equal(kd, kr), 0); @@ -433,6 +469,12 @@ sshkey_tests(void) ASSERT_INT_EQ(sshkey_equal(kf, k1), 0); sshkey_free(k1); k1 = NULL; + ASSERT_INT_EQ(sshkey_generate(KEY_MLDSA44_ED25519, 256, &k1), 0); + ASSERT_INT_EQ(sshkey_generate(KEY_MLDSA44_ED25519, 256, &k2), 0); + ASSERT_INT_EQ(sshkey_equal(k2, k1), 0); + sshkey_free(k1); + sshkey_free(k2); + k1 = k2 = NULL; TEST_DONE(); #ifdef WITH_OPENSSL @@ -491,6 +533,52 @@ sshkey_tests(void) sshbuf_reset(b); TEST_DONE(); + TEST_START("certify key MLDSA44-ED25519"); + ASSERT_INT_EQ(sshkey_load_public( + test_data_file("mldsa44_ed25519_1.pub"), &k1, NULL), 0); + k2 = get_private("mldsa44_ed25519_2"); + ASSERT_INT_EQ(sshkey_to_certified(k1), 0); + ASSERT_PTR_NE(k1->cert, NULL); + k1->cert->type = SSH2_CERT_TYPE_USER; + k1->cert->serial = 1234; + k1->cert->key_id = strdup("estragon"); + ASSERT_PTR_NE(k1->cert->key_id, NULL); + k1->cert->principals = calloc(4, sizeof(*k1->cert->principals)); + ASSERT_PTR_NE(k1->cert->principals, NULL); + k1->cert->principals[0] = strdup("estragon"); + k1->cert->principals[1] = strdup("vladimir"); + k1->cert->principals[2] = strdup("pozzo"); + k1->cert->principals[3] = strdup("lucky"); + ASSERT_PTR_NE(k1->cert->principals[0], NULL); + ASSERT_PTR_NE(k1->cert->principals[1], NULL); + ASSERT_PTR_NE(k1->cert->principals[2], NULL); + ASSERT_PTR_NE(k1->cert->principals[3], NULL); + k1->cert->nprincipals = 4; + k1->cert->valid_after = 0; + k1->cert->valid_before = (uint64_t)-1; + sshbuf_free(k1->cert->critical); + k1->cert->critical = sshbuf_new(); + ASSERT_PTR_NE(k1->cert->critical, NULL); + sshbuf_free(k1->cert->extensions); + k1->cert->extensions = sshbuf_new(); + ASSERT_PTR_NE(k1->cert->extensions, NULL); + put_opt(k1->cert->critical, "force-command", "/usr/bin/true"); + put_opt(k1->cert->critical, "source-address", "127.0.0.1"); + put_opt(k1->cert->extensions, "permit-X11-forwarding", NULL); + put_opt(k1->cert->extensions, "permit-agent-forwarding", NULL); + ASSERT_INT_EQ(sshkey_from_private(k2, &k1->cert->signature_key), 0); + ASSERT_INT_EQ(sshkey_certify(k1, k2, NULL, NULL, NULL), 0); + b = sshbuf_new(); + ASSERT_PTR_NE(b, NULL); + ASSERT_INT_EQ(sshkey_putb(k1, b), 0); + ASSERT_INT_EQ(sshkey_from_blob(sshbuf_ptr(b), sshbuf_len(b), &k3), 0); + sshkey_free(k1); + sshkey_free(k2); + sshkey_free(k3); + k1 = k2 = k3 = NULL; + sshbuf_reset(b); + TEST_DONE(); + #ifdef WITH_OPENSSL TEST_START("sign and verify RSA"); k1 = get_private("rsa_1"); @@ -546,6 +634,16 @@ sshkey_tests(void) k1 = k2 = NULL; TEST_DONE(); + TEST_START("sign and verify MLDSA44-ED25519"); + k1 = get_private("mldsa44_ed25519_1"); + ASSERT_INT_EQ(sshkey_load_public( + test_data_file("mldsa44_ed25519_2.pub"), &k2, NULL), 0); + signature_tests(k1, k2, NULL); + sshkey_free(k1); + sshkey_free(k2); + k1 = k2 = NULL; + TEST_DONE(); + #ifdef WITH_OPENSSL TEST_START("nested certificate"); ASSERT_INT_EQ(sshkey_load_cert(test_data_file("rsa_1"), &k1), 0); @@ -626,6 +724,15 @@ sshkey_benchmarks(void) TEST_DONE(); BENCH_FINISH("keys"); + BENCH_START("generate MLDSA44-ED25519"); + TEST_START("generate KEY_MLDSA44_ED25519"); + ASSERT_INT_EQ(sshkey_generate(KEY_MLDSA44_ED25519, 256, &k), 0); + ASSERT_PTR_NE(k, NULL); + sshkey_free(k); + k = NULL; + TEST_DONE(); + BENCH_FINISH("keys"); + #ifdef WITH_OPENSSL /* sign */ signature_benchmark("RSA-1024/SHA1", KEY_RSA, 1024, "ssh-rsa", 0); @@ -638,6 +745,7 @@ sshkey_benchmarks(void) signature_benchmark("ECDSA-384", KEY_ECDSA, 384, NULL, 0); signature_benchmark("ECDSA-521", KEY_ECDSA, 521, NULL, 0); signature_benchmark("ED25519", KEY_ED25519, 0, NULL, 0); + signature_benchmark("MLDSA44-ED25519", KEY_MLDSA44_ED25519, 0, NULL, 0); /* verify */ signature_benchmark("RSA-1024/SHA1", KEY_RSA, 1024, "ssh-rsa", 1); @@ -651,4 +759,5 @@ sshkey_benchmarks(void) signature_benchmark("ECDSA-521", KEY_ECDSA, 521, NULL, 1); #endif /* WITH_OPENSSL */ signature_benchmark("ED25519", KEY_ED25519, 0, NULL, 1); + signature_benchmark("MLDSA44-ED25519", KEY_MLDSA44_ED25519, 0, NULL, 1); } diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_1 b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1 new file mode 100644 index 000000000000..e06c5fbf43ce --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1 @@ -0,0 +1,58 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAFZwAAAB9zc2gtbW +xkc2E0NC1lZDI1NTE5QG9wZW5zc2guY29tAAAFQPEEG3OCkPJKhPXRLVROsGaP7+F0Zkbn +zSRo/RpT7SUfuReVG73s9rU31tqeMdARV8YE9Q/gT1NjRapXxHDoFemBMz5pVO8xwBdD+L +zN1PUgYx8l7uyyk7B3Hd/JuYivudlEXYLzNYCpM4K3KgP23F2zbWVNxymD3YdCAGLMt+7+ +sE1SdxPci48RCu2gaC5VJ1x0iDjntw7WEl6rJq0H5UmfFkFA2NZphCzzmgdmzifSzMSRyO +QE49CxZHtKYVksyMtWwu9tfJs/Y/M2oKwD78mxpfzYqET+VcetR1zQ/wlFq94ux/drFhYC +oLGj6rPHOqloIKAc7uB7iG+hrRnzI6FVpn5BVjBo2+IxzmlT5q2/Q1aaT9mVi/fWpdgMfU +XbO9oQCVHEgRlpPYaUF9j+GgagaJ4eif8VI2h7BqxWoeeFFmNjOcTkgeXC6G7bs4Xos1Kx +tVHlkxVh0z12a8+hYyN4JoZl2bjCWS64fcWHFWKm1h/MCVqObZ65Ed5OyylZCV3nmfhrtA +zcjoTJp25bdTHJ/T/ruTSgGbrTXm7szhfdXecu5vrE6DPh/RDPq7Byjqzab3b3BGeW2je2 +P46s5/eC68jh03UN8m5frde0DstkIgLSsZ7Kxi0r/jIDFv6u/v7ub1LfNvzo7Y0F3RBmZm +QboC+ASvmeW0qe6kavxfZhQJi7BJDQdKYLXMYxIwkaqNZX06oWX1yf3BxngIkZhinGhRav +rhcOmsow+TVwCeFYWlcyr2wotfZov0A1aLXFjesV9LfPNwz+46dcnPrMtTLcnNzfdvgPpv +wgWvcu51794gHCz3qB+Wi83qcA/9LpPJValjRjzEptd+hFUlwXeO0mu27I6mMRDdXr5qP2 +YKYQ44u1NsuYy7gYOSUzXw420SXRel8Nx0+Ifpi62ZPooh85EiofVyOlCNwFc6KhWfUvPB +aWJ6gnYYf6mgK7hImEio1A69dKyfUI+ewUaOQRcRzbDa/vV3t1KGA3YeboTdzowmCjQucF +UNQz2nr5wonrfZO0y5AJO3h5eK+ZEuqwlCQcgV5g6eo9U7Ea5Ywl80lLTkBV0Bdxn1VPDr +cVnIZqDJo9uzA9gIZkREFqnqQGnoVJOU6tu7LU7VyQ0jmW0x4kzBQQkfziSkwpMB1lfSDO +PKGenaMVvZ1mTmi+e6e7JjT99Twiu0ajohdMVfv4a8xt2XYP+xdEu7O7Jg1K1/cXVK7Pxd +4HdxL1oPkipmuzcX1MS42Bd0yKsGt1CcNpolEelZWxMPEruzUFDw7A9bkRi/UPCfi+Inu4 +UidwaMmOgIKZyufE/KPg0ssG5my7HGO/lChgWvkg98U/TpYrTUNCvRhefcDv7Lzpc3Hw5g +8SpOvy1knOeS41pXA+94WIxoC4EFgNDAw0C68aXlAKwhJm4WL0C9spPdEsIEHl/w4nhudU +eeBB4ll0wC1mPRyRGd/m9YM77D/2KgPl2sA046Bli/tK6fj+pTBW57uMCuJuWC2b//gfIw +9JdNGpd60C3VZ8ImZjVWRbW4CB1F/vpRgGv9EuD0uVoJ+6pYl41x/Tm2fE7BUerrHl2Q1J +5SlbhJN8vsLzxnezOrP46Xa+/gYIyrGCLaLMyzoTBlLWKjjhT9oXYvl7SpSuk2EHyU9TXK +XU/gp8szcdb66nRHeBTvQ66i902QDr3RCZtZ6klAoZUwOHGmeF9T9qZgSXjgtO/9KIkfoR +zX5rSnEiPr4wV1jWGvdl0PB4ZGrsi4lX0eB8w0PyVQFErhQ+E/+4v5IE0xE1+k4SIEG8Zb +ZvFxPDqEynFgAABdgs9rd9LPa3fQAAAB9zc2gtbWxkc2E0NC1lZDI1NTE5QG9wZW5zc2gu +Y29tAAAFQPEEG3OCkPJKhPXRLVROsGaP7+F0ZkbnzSRo/RpT7SUfuReVG73s9rU31tqeMd +ARV8YE9Q/gT1NjRapXxHDoFemBMz5pVO8xwBdD+LzN1PUgYx8l7uyyk7B3Hd/JuYivudlE +XYLzNYCpM4K3KgP23F2zbWVNxymD3YdCAGLMt+7+sE1SdxPci48RCu2gaC5VJ1x0iDjntw +7WEl6rJq0H5UmfFkFA2NZphCzzmgdmzifSzMSRyOQE49CxZHtKYVksyMtWwu9tfJs/Y/M2 +oKwD78mxpfzYqET+VcetR1zQ/wlFq94ux/drFhYCoLGj6rPHOqloIKAc7uB7iG+hrRnzI6 +FVpn5BVjBo2+IxzmlT5q2/Q1aaT9mVi/fWpdgMfUXbO9oQCVHEgRlpPYaUF9j+GgagaJ4e +if8VI2h7BqxWoeeFFmNjOcTkgeXC6G7bs4Xos1KxtVHlkxVh0z12a8+hYyN4JoZl2bjCWS +64fcWHFWKm1h/MCVqObZ65Ed5OyylZCV3nmfhrtAzcjoTJp25bdTHJ/T/ruTSgGbrTXm7s +zhfdXecu5vrE6DPh/RDPq7Byjqzab3b3BGeW2je2P46s5/eC68jh03UN8m5frde0DstkIg +LSsZ7Kxi0r/jIDFv6u/v7ub1LfNvzo7Y0F3RBmZmQboC+ASvmeW0qe6kavxfZhQJi7BJDQ +dKYLXMYxIwkaqNZX06oWX1yf3BxngIkZhinGhRavrhcOmsow+TVwCeFYWlcyr2wotfZov0 +A1aLXFjesV9LfPNwz+46dcnPrMtTLcnNzfdvgPpvwgWvcu51794gHCz3qB+Wi83qcA/9Lp +PJValjRjzEptd+hFUlwXeO0mu27I6mMRDdXr5qP2YKYQ44u1NsuYy7gYOSUzXw420SXRel +8Nx0+Ifpi62ZPooh85EiofVyOlCNwFc6KhWfUvPBaWJ6gnYYf6mgK7hImEio1A69dKyfUI ++ewUaOQRcRzbDa/vV3t1KGA3YeboTdzowmCjQucFUNQz2nr5wonrfZO0y5AJO3h5eK+ZEu +qwlCQcgV5g6eo9U7Ea5Ywl80lLTkBV0Bdxn1VPDrcVnIZqDJo9uzA9gIZkREFqnqQGnoVJ +OU6tu7LU7VyQ0jmW0x4kzBQQkfziSkwpMB1lfSDOPKGenaMVvZ1mTmi+e6e7JjT99Twiu0 +ajohdMVfv4a8xt2XYP+xdEu7O7Jg1K1/cXVK7Pxd4HdxL1oPkipmuzcX1MS42Bd0yKsGt1 +CcNpolEelZWxMPEruzUFDw7A9bkRi/UPCfi+Inu4UidwaMmOgIKZyufE/KPg0ssG5my7HG +O/lChgWvkg98U/TpYrTUNCvRhefcDv7Lzpc3Hw5g8SpOvy1knOeS41pXA+94WIxoC4EFgN +DAw0C68aXlAKwhJm4WL0C9spPdEsIEHl/w4nhudUeeBB4ll0wC1mPRyRGd/m9YM77D/2Kg +Pl2sA046Bli/tK6fj+pTBW57uMCuJuWC2b//gfIw9JdNGpd60C3VZ8ImZjVWRbW4CB1F/v +pRgGv9EuD0uVoJ+6pYl41x/Tm2fE7BUerrHl2Q1J5SlbhJN8vsLzxnezOrP46Xa+/gYIyr +GCLaLMyzoTBlLWKjjhT9oXYvl7SpSuk2EHyU9TXKXU/gp8szcdb66nRHeBTvQ66i902QDr +3RCZtZ6klAoZUwOHGmeF9T9qZgSXjgtO/9KIkfoRzX5rSnEiPr4wV1jWGvdl0PB4ZGrsi4 +lX0eB8w0PyVQFErhQ+E/+4v5IE0xE1+k4SIEG8ZbZvFxPDqEynFgAAAEAy11NtmC4I8S62 +N3waM7qJ4N/lwwc276O8JNTnAdVfl0eKZEa9xjIP3Hi0sV7x16n7TqOl8+TcIxaIck/Bey +kwAAAAG01MRFNBNDQtRUQyNTUxOSB0ZXN0IGtleSAjMQECAwQFBg== +-----END OPENSSH PRIVATE KEY----- diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_1-cert.fp b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1-cert.fp new file mode 100644 index 000000000000..7f4ab4e7f65a --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1-cert.fp @@ -0,0 +1 @@ +SHA256:MHrtMS/Vf35zxTemIBpFyKqv9rT1bd1XMLqM9CnT8WY diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_1-cert.pub b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1-cert.pub new file mode 100644 index 000000000000..d076e5118124 --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1-cert.pub @@ -0,0 +1 @@ +ssh-mldsa44-ed25519-cert-v01@openssh.com AAAAKHNzaC1tbGRzYTQ0LWVkMjU1MTktY2VydC12MDFAb3BlbnNzaC5jb20AAAAgcCxqx/etG+GuzLfWqNiUZ7mUjLru2WzytiIn5MNlvNcAAAVA8QQbc4KQ8kqE9dEtVE6wZo/v4XRmRufNJGj9GlPtJR+5F5Ubvez2tTfW2p4x0BFXxgT1D+BPU2NFqlfEcOgV6YEzPmlU7zHAF0P4vM3U9SBjHyXu7LKTsHcd38m5iK+52URdgvM1gKkzgrcqA/bcXbNtZU3HKYPdh0IAYsy37v6wTVJ3E9yLjxEK7aBoLlUnXHSIOOe3DtYSXqsmrQflSZ8WQUDY1mmELPOaB2bOJ9LMxJHI5ATj0LFke0phWSzIy1bC7218mz9j8zagrAPvybGl/NioRP5Vx61HXND/CUWr3i7H92sWFgKgsaPqs8c6qWggoBzu4HuIb6GtGfMjoVWmfkFWMGjb4jHOaVPmrb9DVppP2ZWL99al2Ax9Rds72hAJUcSBGWk9hpQX2P4aBqBonh6J/xUjaHsGrFah54UWY2M5xOSB5cLobtuzheizUrG1UeWTFWHTPXZrz6FjI3gmhmXZuMJZLrh9xYcVYqbWH8wJWo5tnrkR3k7LKVkJXeeZ+Gu0DNyOhMmnblt1Mcn9P+u5NKAZutNebuzOF91d5y7m+sToM+H9EM+rsHKOrNpvdvcEZ5baN7Y/jqzn94LryOHTdQ3ybl+t17QOy2QiAtKxnsrGLSv+MgMW/q7+/u5vUt82/OjtjQXdEGZmZBugL4BK+Z5bSp7qRq/F9mFAmLsEkNB0pgtcxjEjCRqo1lfTqhZfXJ/cHGeAiRmGKcaFFq+uFw6ayjD5NXAJ4VhaVzKvbCi19mi/QDVotcWN6xX0t883DP7jp1yc+sy1Mtyc3N92+A+m/CBa9y7nXv3iAcLPeoH5aLzepwD/0uk8lVqWNGPMSm136EVSXBd47Sa7bsjqYxEN1evmo/ZgphDji7U2y5jLuBg5JTNfDjbRJdF6Xw3HT4h+mLrZk+iiHzkSKh9XI6UI3AVzoqFZ9S88FpYnqCdhh/qaAruEiYSKjUDr10rJ9Qj57BRo5BFxHNsNr+9Xe3UoYDdh5uhN3OjCYKNC5wVQ1DPaevnCiet9k7TLkAk7eHl4r5kS6rCUJByBXmDp6j1TsRrljCXzSUtOQFXQF3GfVU8OtxWchmoMmj27MD2AhmREQWqepAaehUk5Tq27stTtXJDSOZbTHiTMFBCR/OJKTCkwHWV9IM48oZ6doxW9nWZOaL57p7smNP31PCK7RqOiF0xV+/hrzG3Zdg/7F0S7s7smDUrX9xdUrs/F3gd3EvWg+SKma7NxfUxLjYF3TIqwa3UJw2miUR6VlbEw8Su7NQUPDsD1uRGL9Q8J+L4ie7hSJ3BoyY6AgpnK58T8o+DSywbmbLscY7+UKGBa+SD3xT9OlitNQ0K9GF59wO/svOlzcfDmDxKk6/LWSc55LjWlcD73hYjGgLgQWA0MDDQLrxpeUArCEmbhYvQL2yk90SwgQeX/DieG51R54EHiWXTALWY9HJEZ3+b1gzvsP/YqA+XawDTjoGWL+0rp+P6lMFbnu4wK4m5YLZv/+B8jD0l00al3rQLdVnwiZmNVZFtbgIHUX++lGAa/0S4PS5Wgn7qliXjXH9ObZ8TsFR6useXZDUnlKVuEk3y+wvPGd7M6s/jpdr7+BgjKsYItoszLOhMGUtYqOOFP2hdi+XtKlK6TYQfJT1NcpdT+CnyzNx1vrqdEd4FO9DrqL3TZAOvdEJm1nqSUChlTA4caZ4X1P2pmBJeOC07/0oiR+hHNfmtKcSI+vjBXWNYa92XQ8HhkauyLiVfR4HzDQ/JVAUSuFD4T/7i/kgTTETX6ThIgQbxltm8XE8OoTKcWAAAAAAAAAAgAAAACAAAABmp1bGl1cwAAABIAAAAFaG9zdDEAAAAFaG9zdDIAAAAANouDYAAAAABNHeHgAAAAAAAAAAAAAAAAAAAAMwAAAAtzc2gtZWQyNTUxOQAAACAhFpxIluaiv+6TtAqAvQbSMns/0Ta+OVHZ9uvy6CrnswAAAFMAAAALc3NoLWVkMjU1MTkAAABASbd3yUNRkfDqbKkNCuaEcI0bxeQqVCOdp5TIDGBy3YiYudknX0VWiGYkdY2ULua4OevDBgXNQ1b+j5xMBLLUAw== MLDSA44-ED25519 test key #1 diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.fp b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.fp new file mode 100644 index 000000000000..7f4ab4e7f65a --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.fp @@ -0,0 +1 @@ +SHA256:MHrtMS/Vf35zxTemIBpFyKqv9rT1bd1XMLqM9CnT8WY diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.fp.bb b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.fp.bb new file mode 100644 index 000000000000..071c90bcb181 --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.fp.bb @@ -0,0 +1 @@ +xehik-vycid-vovos-cumor-hydoz-zimyd-pidut-rugyv-keseb-nupyb-ryxux diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.pub b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.pub new file mode 100644 index 000000000000..f31f8b82a8b0 --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1.pub @@ -0,0 +1 @@ +ssh-mldsa44-ed25519@openssh.com AAAAH3NzaC1tbGRzYTQ0LWVkMjU1MTlAb3BlbnNzaC5jb20AAAVA8QQbc4KQ8kqE9dEtVE6wZo/v4XRmRufNJGj9GlPtJR+5F5Ubvez2tTfW2p4x0BFXxgT1D+BPU2NFqlfEcOgV6YEzPmlU7zHAF0P4vM3U9SBjHyXu7LKTsHcd38m5iK+52URdgvM1gKkzgrcqA/bcXbNtZU3HKYPdh0IAYsy37v6wTVJ3E9yLjxEK7aBoLlUnXHSIOOe3DtYSXqsmrQflSZ8WQUDY1mmELPOaB2bOJ9LMxJHI5ATj0LFke0phWSzIy1bC7218mz9j8zagrAPvybGl/NioRP5Vx61HXND/CUWr3i7H92sWFgKgsaPqs8c6qWggoBzu4HuIb6GtGfMjoVWmfkFWMGjb4jHOaVPmrb9DVppP2ZWL99al2Ax9Rds72hAJUcSBGWk9hpQX2P4aBqBonh6J/xUjaHsGrFah54UWY2M5xOSB5cLobtuzheizUrG1UeWTFWHTPXZrz6FjI3gmhmXZuMJZLrh9xYcVYqbWH8wJWo5tnrkR3k7LKVkJXeeZ+Gu0DNyOhMmnblt1Mcn9P+u5NKAZutNebuzOF91d5y7m+sToM+H9EM+rsHKOrNpvdvcEZ5baN7Y/jqzn94LryOHTdQ3ybl+t17QOy2QiAtKxnsrGLSv+MgMW/q7+/u5vUt82/OjtjQXdEGZmZBugL4BK+Z5bSp7qRq/F9mFAmLsEkNB0pgtcxjEjCRqo1lfTqhZfXJ/cHGeAiRmGKcaFFq+uFw6ayjD5NXAJ4VhaVzKvbCi19mi/QDVotcWN6xX0t883DP7jp1yc+sy1Mtyc3N92+A+m/CBa9y7nXv3iAcLPeoH5aLzepwD/0uk8lVqWNGPMSm136EVSXBd47Sa7bsjqYxEN1evmo/ZgphDji7U2y5jLuBg5JTNfDjbRJdF6Xw3HT4h+mLrZk+iiHzkSKh9XI6UI3AVzoqFZ9S88FpYnqCdhh/qaAruEiYSKjUDr10rJ9Qj57BRo5BFxHNsNr+9Xe3UoYDdh5uhN3OjCYKNC5wVQ1DPaevnCiet9k7TLkAk7eHl4r5kS6rCUJByBXmDp6j1TsRrljCXzSUtOQFXQF3GfVU8OtxWchmoMmj27MD2AhmREQWqepAaehUk5Tq27stTtXJDSOZbTHiTMFBCR/OJKTCkwHWV9IM48oZ6doxW9nWZOaL57p7smNP31PCK7RqOiF0xV+/hrzG3Zdg/7F0S7s7smDUrX9xdUrs/F3gd3EvWg+SKma7NxfUxLjYF3TIqwa3UJw2miUR6VlbEw8Su7NQUPDsD1uRGL9Q8J+L4ie7hSJ3BoyY6AgpnK58T8o+DSywbmbLscY7+UKGBa+SD3xT9OlitNQ0K9GF59wO/svOlzcfDmDxKk6/LWSc55LjWlcD73hYjGgLgQWA0MDDQLrxpeUArCEmbhYvQL2yk90SwgQeX/DieG51R54EHiWXTALWY9HJEZ3+b1gzvsP/YqA+XawDTjoGWL+0rp+P6lMFbnu4wK4m5YLZv/+B8jD0l00al3rQLdVnwiZmNVZFtbgIHUX++lGAa/0S4PS5Wgn7qliXjXH9ObZ8TsFR6useXZDUnlKVuEk3y+wvPGd7M6s/jpdr7+BgjKsYItoszLOhMGUtYqOOFP2hdi+XtKlK6TYQfJT1NcpdT+CnyzNx1vrqdEd4FO9DrqL3TZAOvdEJm1nqSUChlTA4caZ4X1P2pmBJeOC07/0oiR+hHNfmtKcSI+vjBXWNYa92XQ8HhkauyLiVfR4HzDQ/JVAUSuFD4T/7i/kgTTETX6ThIgQbxltm8XE8OoTKcW MLDSA44-ED25519 test key #1 diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_1_pw b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1_pw new file mode 100644 index 000000000000..fdf9cae6f2ec --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_1_pw @@ -0,0 +1,59 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABDIBnOrxJ +0GUTVroCc7LYB/AAAAGAAAAAEAAAVnAAAAH3NzaC1tbGRzYTQ0LWVkMjU1MTlAb3BlbnNz +aC5jb20AAAVA8QQbc4KQ8kqE9dEtVE6wZo/v4XRmRufNJGj9GlPtJR+5F5Ubvez2tTfW2p +4x0BFXxgT1D+BPU2NFqlfEcOgV6YEzPmlU7zHAF0P4vM3U9SBjHyXu7LKTsHcd38m5iK+5 +2URdgvM1gKkzgrcqA/bcXbNtZU3HKYPdh0IAYsy37v6wTVJ3E9yLjxEK7aBoLlUnXHSIOO +e3DtYSXqsmrQflSZ8WQUDY1mmELPOaB2bOJ9LMxJHI5ATj0LFke0phWSzIy1bC7218mz9j +8zagrAPvybGl/NioRP5Vx61HXND/CUWr3i7H92sWFgKgsaPqs8c6qWggoBzu4HuIb6GtGf +MjoVWmfkFWMGjb4jHOaVPmrb9DVppP2ZWL99al2Ax9Rds72hAJUcSBGWk9hpQX2P4aBqBo +nh6J/xUjaHsGrFah54UWY2M5xOSB5cLobtuzheizUrG1UeWTFWHTPXZrz6FjI3gmhmXZuM +JZLrh9xYcVYqbWH8wJWo5tnrkR3k7LKVkJXeeZ+Gu0DNyOhMmnblt1Mcn9P+u5NKAZutNe +buzOF91d5y7m+sToM+H9EM+rsHKOrNpvdvcEZ5baN7Y/jqzn94LryOHTdQ3ybl+t17QOy2 +QiAtKxnsrGLSv+MgMW/q7+/u5vUt82/OjtjQXdEGZmZBugL4BK+Z5bSp7qRq/F9mFAmLsE +kNB0pgtcxjEjCRqo1lfTqhZfXJ/cHGeAiRmGKcaFFq+uFw6ayjD5NXAJ4VhaVzKvbCi19m +i/QDVotcWN6xX0t883DP7jp1yc+sy1Mtyc3N92+A+m/CBa9y7nXv3iAcLPeoH5aLzepwD/ +0uk8lVqWNGPMSm136EVSXBd47Sa7bsjqYxEN1evmo/ZgphDji7U2y5jLuBg5JTNfDjbRJd +F6Xw3HT4h+mLrZk+iiHzkSKh9XI6UI3AVzoqFZ9S88FpYnqCdhh/qaAruEiYSKjUDr10rJ +9Qj57BRo5BFxHNsNr+9Xe3UoYDdh5uhN3OjCYKNC5wVQ1DPaevnCiet9k7TLkAk7eHl4r5 +kS6rCUJByBXmDp6j1TsRrljCXzSUtOQFXQF3GfVU8OtxWchmoMmj27MD2AhmREQWqepAae +hUk5Tq27stTtXJDSOZbTHiTMFBCR/OJKTCkwHWV9IM48oZ6doxW9nWZOaL57p7smNP31PC +K7RqOiF0xV+/hrzG3Zdg/7F0S7s7smDUrX9xdUrs/F3gd3EvWg+SKma7NxfUxLjYF3TIqw +a3UJw2miUR6VlbEw8Su7NQUPDsD1uRGL9Q8J+L4ie7hSJ3BoyY6AgpnK58T8o+DSywbmbL +scY7+UKGBa+SD3xT9OlitNQ0K9GF59wO/svOlzcfDmDxKk6/LWSc55LjWlcD73hYjGgLgQ +WA0MDDQLrxpeUArCEmbhYvQL2yk90SwgQeX/DieG51R54EHiWXTALWY9HJEZ3+b1gzvsP/ +YqA+XawDTjoGWL+0rp+P6lMFbnu4wK4m5YLZv/+B8jD0l00al3rQLdVnwiZmNVZFtbgIHU +X++lGAa/0S4PS5Wgn7qliXjXH9ObZ8TsFR6useXZDUnlKVuEk3y+wvPGd7M6s/jpdr7+Bg +jKsYItoszLOhMGUtYqOOFP2hdi+XtKlK6TYQfJT1NcpdT+CnyzNx1vrqdEd4FO9DrqL3TZ +AOvdEJm1nqSUChlTA4caZ4X1P2pmBJeOC07/0oiR+hHNfmtKcSI+vjBXWNYa92XQ8Hhkau +yLiVfR4HzDQ/JVAUSuFD4T/7i/kgTTETX6ThIgQbxltm8XE8OoTKcWAAAF4IJu4xhKCCAT +nGtM9HpYbikBGDeEhtoO8th7MxihQChEK4ImJchk7Zp74UR2YGK8vfFQoTeazqWKBaJmD5 +NV80eyEm4AOBJuzTdNXNk1yhqXOrq+UgzDjQ7HzAJH98DMLu2w3WvxCPPZoi8Zu6MVtOuZ +Exm6zN04CT+zs/LzJzqle8zN7coJwAM+apzOR4VMlSAh0XOEjdUfUpeCQJYeVox3usUI9T +6rCkxy1ZMk8qZyy6bftYIDY2OojsxFas1tuxwd/ypORX76c3ruORv6a3OB/sVgdAaTqQlP +HDsUurRautImLKmpHOMyiLsAT8SnnH3r1OJBFAPStCSjIusPTolhqJa81k9l7bJS8hPQb5 +6Jo5vNzwrO/XrqP/0aeMH8uu79dTj9/kvocIjROhVs9cZEABHzNa24DGRJybRTZqCm4pI/ +3V4QwuBQrXyqpkyl7Y0q4t7ScuoGu+i7EFN5XeHl36WVn/e23OBsjzjl/gKjLBDf9vmOqb +6JsrJCxpuHzXxbqgi84TSxlZ4QXWjQL/hTsAgNhMxJh2sIKEkQ5O0ZX/m1Z5aH4WCLGBJK +c105TvucEUoTvolIBHsOBPYag9TO6iFNsuAcnBV9gkLd5bIaV2MgFJXOLR6zzKAyb/59Pm +VSVzQEUUH704tfcqRWSpW6JCSFSX2m6+1h/289pdFVBK3WcNNsemcEJaFq0XP7PZjqW8uy +V5ReV2sGkR5Wdi4mUtE0flQ5PMPeVLWdFXpX5LOcAMSzrtndTg+x0JyIKkzBNQvEYQh74R +iFhf+JdoFa/a9RCg7qi8f2heoO+Z5m3kWSBGrtJae6901G43M7953WrZo86ZhZf+PGoivX +IO1IT5MLmsBD1L0sC1GSwXnakyv7Lgwzx6bsCc6jyhKIMc6uYFqzVoiax7f/BYLdi3wKIY +PYAeWJJnop1aDgbI8FJBImvce9iMK5jeH7jk5bEPb+mtIO+44rCq95wCboEIXemY+Dqlqb +CHS8whMXc1yprQnLj3hf76T58OaYNwDv6fec3I3eF1wSxIXEoeI4r03hGsroD1eJ3hXMwH ++MgDUT7+EAsh+wkUC9PvnhzB2CGcnwdRr8BZtiyhgm3Kkw40jJjf3Uyi62YJArV5XiYwWI +pqTk6kk9bZXUoBIRrW0Tt4dJBLrkWSeMwdtGwPsHsWqaBr7WSmQi2pRpqK8wpvVyB/KZCE +A0G+Nq5LAjw85FgW8h3MNOYBPTqFli325Jvtsn1as/KjG+7m7pc1KedX2lGN4y+5PynBcb +yerUdIr6xhn/8LN6korPB7EEjUBo8M1szs6mmsQ9tdrGmb4cdLjLQDnB4MWnYiOwgOUcIZ +dA4Y1XF4aYsiK/jl5uM3BXEq6mlgPDB0MHvxrDLOtBejLglqO+Mm9cbKKr+oGxkGJViabS +5D587UdrJ5d8/mlTLkikh0LXUS9SjSw5JkPyZZpcJ693nzA9/wcw9EkHG09DXpxU0Mdwu5 +q2bdh7jZ/bqhUQqpuEw39dXfIGSbYSxgMvASnWJtiKV06ffiuNw7nS67MO+r8qiGdQpC+R +vmCFjqQJF3kNd4WXg5jlkRAQqssz0oFcHKVu06tzX/KVD56ZQwtKAe01OpGa0s9/0tL7TY +8NCxOzzAL5qawQ0ZyYcW856R+54vGoMyKfG7jfN9QjZIn/WxDGOtRQDqqHBJHURYnLHczo +FcCcU7MR5MRT6hD75i/130fGcVIauXU6O1Yd0/N+K9aslAkZ75YWeQObL7ZucXhsqQDeeO +g3A1ZN0lZYr5kFfFio8juSDb1y/ukLz2EamTanXbo1V15x+XZh51EDAA8ISEy993qDvIS8 +EhuuPFWR9k1ssMaC/tJpgqQ6uIz/c5zRw9R1lRwcBmNT3+kuBXqWXcR13BYQ1zpcl1oPPo +rGp6IGlY+H2yQerRR8EKsFi4L12QH+CxuAsuMv+eFcqLXax9feetpuabWB3ItwgDLLn4+Q +SKsHIisqSi1zPyq0OdyZgY/OqsRW3ck8NJc= +-----END OPENSSH PRIVATE KEY----- diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_2 b/regress/unittests/sshkey/testdata/mldsa44_ed25519_2 new file mode 100644 index 000000000000..f49cf8aa7aa0 --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_2 @@ -0,0 +1,58 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAFZwAAAB9zc2gtbW +xkc2E0NC1lZDI1NTE5QG9wZW5zc2guY29tAAAFQOcy63kPREcb1UtnuD9O6zFSOiaK0Aaa +FI+D7ikbE3cEKG/H6hAFpldBBrS1df5fs3gB4y4pClT5ZVSmVsurPMvSDgvOb67T56RPPu +fblXA2QD4YKyttiETIDqj8FulTEuL0QK57Lqkp2cOsD+F3qCPYDjr78g9XKKgL6WpYa0D9 +LXoUChsUylw6dDBZbUwg/p4X9bJFi/CYR0kEhPgkiRvW5EODy0NafinCfQ/Ghe9p3iWx7x +1Fl2sBcoH2FhxOx1FPnLRqNcMps/GaxHrJlg6LUWqeb700X9OHYGIhFEmClQuN1XDSimxD +F/cbOUCDswHQdNKKsXqh89jBBcoBKIiETui3u0CmW/sAS5PgYw383AkTPrRSUHWZQgXrJQ +wjx/f/KapsJ4wmLSr7Vx2kJEQO+mOJyK5K3dd40d8RTWggExXsXVLoINqpll0qmXz0ffVi +lT+IuYr+W2L7vStofFYUmZw6Nf+O6ZjxTy5vqZC/+9Kcy9oO4mDAec7CEPiqAfX+5YjZGF +adeI+B8UMBh2k/JmWXWUhLUtp0i28Tf025KFzg34kN7oGZZx2XpWXWKXxm1G/vKxXiel3n +nG725RbqLjYxGJqYsCGeKwF3uunOOHsq8dCLupcij2TY7vwwzm833QRE6Y8TQGcHT1v8e3 +uAJtM5M7hRU8fzz8/F4nLLdx366X5ffIQzN8zcFWFHUXPxJPKS7p0aQ7rfYzabZ2NOorVG +88oPWh7DZfZIDYKBekJVHNL2a80PefijVbB/+DeCkanTJUKjYMGq07Il/i2PXA6a9EVcRK +pniiSksRwaocxCTCVzZfnoLu2croijHvkSVNoCqF9c1Awmd53Gw5lZjbyJvABmuC1h0Q6U +PDsD2p1tPQ84QwSQ1C7SQhtuDCCeEPP6BOGCqhYTB6/TDSJZcptaIhNh2bOf2xrRgkHFge +d9JeYML+Xm1VqzNX2BWvV5EgFVtFVha20PdkrIMAZuyIU1IeVfJT62JjjGsT+GLkpZPfAg +7FQD6GGM7Czto4p5H52Tr8KhVUMDxbtEZszOG89bhvMs/hiEW5GaI7GTt/NYdVdY1aH0lF +9T17kRNOCRozX+roW6CvzqAXYORjMS4OgiYan/5OfuwjOUhFZBqZm8vXjD46OuskMKO/ou +QA/ByvCQHP8O7yQrx8e8UizWpsvw/FUQ+MbOwySxlF2eaU5/iEUCU32Iyvi4XpCFV6Xisq +STTNWUT4ckacwWTpKtVikrJavSMBTClCG/eDgJbetT2N7iGzLbUtCAN5+ti0BbI1R6kuNA +hct31OBkyX28AYhKSeR06H7Z3SegvQBaHoiY/mFLV0tTDpL6YMnBcEz2Meq+vcSmaegvii +tgX3NIlyqPIzyyVJAoh+l483Fgr4CoCxcaztIYUw0jCsEUWpSNcXPcgrp3GBHbqLlwbrsE +/ArGXXqfSg9T8zeiTsVcn6UYqwGWnhudyaHxkrG50sP2DMQ1p9ywyTTyrkSRHNthjeQKuM +3x8eNK4aK5fgw07wF15AU6IcXbhJAfh4X6Xtd9RJz93Jb7CKUoqSKJAbIZg9VEQXjTazC/ +NJPM98UeEsvKtjV+bmwt+4GnRfte8LcQ/40R+AwRJyq3r/d20i0Ktv1K4oB0VGNYsZZLe2 +eXgTgjYwA6Lube01fGQuKOUNjdp3bcinn3O8UcMfxKDGzWD+os2BbYTlL8zcPEDGytkSax +rTzsY8CktXJBwVrmMvpmigrZBpfGdKXEyVjADHaVAyo6Sr8pqOpY7kZ5KwcwVDklMmx2Zc +ZYaE5dvG9soAAABdi0TY7btE2O2wAAAB9zc2gtbWxkc2E0NC1lZDI1NTE5QG9wZW5zc2gu +Y29tAAAFQOcy63kPREcb1UtnuD9O6zFSOiaK0AaaFI+D7ikbE3cEKG/H6hAFpldBBrS1df +5fs3gB4y4pClT5ZVSmVsurPMvSDgvOb67T56RPPufblXA2QD4YKyttiETIDqj8FulTEuL0 +QK57Lqkp2cOsD+F3qCPYDjr78g9XKKgL6WpYa0D9LXoUChsUylw6dDBZbUwg/p4X9bJFi/ +CYR0kEhPgkiRvW5EODy0NafinCfQ/Ghe9p3iWx7x1Fl2sBcoH2FhxOx1FPnLRqNcMps/Ga +xHrJlg6LUWqeb700X9OHYGIhFEmClQuN1XDSimxDF/cbOUCDswHQdNKKsXqh89jBBcoBKI +iETui3u0CmW/sAS5PgYw383AkTPrRSUHWZQgXrJQwjx/f/KapsJ4wmLSr7Vx2kJEQO+mOJ +yK5K3dd40d8RTWggExXsXVLoINqpll0qmXz0ffVilT+IuYr+W2L7vStofFYUmZw6Nf+O6Z +jxTy5vqZC/+9Kcy9oO4mDAec7CEPiqAfX+5YjZGFadeI+B8UMBh2k/JmWXWUhLUtp0i28T +f025KFzg34kN7oGZZx2XpWXWKXxm1G/vKxXiel3nnG725RbqLjYxGJqYsCGeKwF3uunOOH +sq8dCLupcij2TY7vwwzm833QRE6Y8TQGcHT1v8e3uAJtM5M7hRU8fzz8/F4nLLdx366X5f +fIQzN8zcFWFHUXPxJPKS7p0aQ7rfYzabZ2NOorVG88oPWh7DZfZIDYKBekJVHNL2a80Pef +ijVbB/+DeCkanTJUKjYMGq07Il/i2PXA6a9EVcRKpniiSksRwaocxCTCVzZfnoLu2croij +HvkSVNoCqF9c1Awmd53Gw5lZjbyJvABmuC1h0Q6UPDsD2p1tPQ84QwSQ1C7SQhtuDCCeEP +P6BOGCqhYTB6/TDSJZcptaIhNh2bOf2xrRgkHFged9JeYML+Xm1VqzNX2BWvV5EgFVtFVh +a20PdkrIMAZuyIU1IeVfJT62JjjGsT+GLkpZPfAg7FQD6GGM7Czto4p5H52Tr8KhVUMDxb +tEZszOG89bhvMs/hiEW5GaI7GTt/NYdVdY1aH0lF9T17kRNOCRozX+roW6CvzqAXYORjMS +4OgiYan/5OfuwjOUhFZBqZm8vXjD46OuskMKO/ouQA/ByvCQHP8O7yQrx8e8UizWpsvw/F +UQ+MbOwySxlF2eaU5/iEUCU32Iyvi4XpCFV6XisqSTTNWUT4ckacwWTpKtVikrJavSMBTC +lCG/eDgJbetT2N7iGzLbUtCAN5+ti0BbI1R6kuNAhct31OBkyX28AYhKSeR06H7Z3SegvQ +BaHoiY/mFLV0tTDpL6YMnBcEz2Meq+vcSmaegviitgX3NIlyqPIzyyVJAoh+l483Fgr4Co +CxcaztIYUw0jCsEUWpSNcXPcgrp3GBHbqLlwbrsE/ArGXXqfSg9T8zeiTsVcn6UYqwGWnh +udyaHxkrG50sP2DMQ1p9ywyTTyrkSRHNthjeQKuM3x8eNK4aK5fgw07wF15AU6IcXbhJAf +h4X6Xtd9RJz93Jb7CKUoqSKJAbIZg9VEQXjTazC/NJPM98UeEsvKtjV+bmwt+4GnRfte8L +cQ/40R+AwRJyq3r/d20i0Ktv1K4oB0VGNYsZZLe2eXgTgjYwA6Lube01fGQuKOUNjdp3bc +inn3O8UcMfxKDGzWD+os2BbYTlL8zcPEDGytkSaxrTzsY8CktXJBwVrmMvpmigrZBpfGdK +XEyVjADHaVAyo6Sr8pqOpY7kZ5KwcwVDklMmx2ZcZYaE5dvG9soAAAAECYjzXEVsDuQN4j +5agpYRhp96U1oE5jZj9HWoQNkT/SxK52qYBXj4HwQL1N7MbGG6V2kW+EBMN8sLZ3N550kU +HUAAAAG01MRFNBNDQtRUQyNTUxOSB0ZXN0IGtleSAjMgECAwQFBg== +-----END OPENSSH PRIVATE KEY----- diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.fp b/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.fp new file mode 100644 index 000000000000..464272743b2a --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.fp @@ -0,0 +1 @@ +SHA256:fkgm6buCjmefUacy+TObQT3vsbO08/z6D8VHKqlMh/4 diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.fp.bb b/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.fp.bb new file mode 100644 index 000000000000..b3ee5387cccb --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.fp.bb @@ -0,0 +1 @@ +xobol-manef-nufyk-niteb-gyseb-mugis-myfin-meroc-mypac-fisof-vexex diff --git a/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.pub b/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.pub new file mode 100644 index 000000000000..34f26faf3d15 --- /dev/null +++ b/regress/unittests/sshkey/testdata/mldsa44_ed25519_2.pub @@ -0,0 +1 @@ +ssh-mldsa44-ed25519@openssh.com AAAAH3NzaC1tbGRzYTQ0LWVkMjU1MTlAb3BlbnNzaC5jb20AAAVA5zLreQ9ERxvVS2e4P07rMVI6JorQBpoUj4PuKRsTdwQob8fqEAWmV0EGtLV1/l+zeAHjLikKVPllVKZWy6s8y9IOC85vrtPnpE8+59uVcDZAPhgrK22IRMgOqPwW6VMS4vRArnsuqSnZw6wP4XeoI9gOOvvyD1coqAvpalhrQP0tehQKGxTKXDp0MFltTCD+nhf1skWL8JhHSQSE+CSJG9bkQ4PLQ1p+KcJ9D8aF72neJbHvHUWXawFygfYWHE7HUU+ctGo1wymz8ZrEesmWDotRap5vvTRf04dgYiEUSYKVC43VcNKKbEMX9xs5QIOzAdB00oqxeqHz2MEFygEoiIRO6Le7QKZb+wBLk+BjDfzcCRM+tFJQdZlCBeslDCPH9/8pqmwnjCYtKvtXHaQkRA76Y4nIrkrd13jR3xFNaCATFexdUugg2qmWXSqZfPR99WKVP4i5iv5bYvu9K2h8VhSZnDo1/47pmPFPLm+pkL/70pzL2g7iYMB5zsIQ+KoB9f7liNkYVp14j4HxQwGHaT8mZZdZSEtS2nSLbxN/TbkoXODfiQ3ugZlnHZelZdYpfGbUb+8rFeJ6XeecbvblFuouNjEYmpiwIZ4rAXe66c44eyrx0Iu6lyKPZNju/DDObzfdBETpjxNAZwdPW/x7e4Am0zkzuFFTx/PPz8Xicst3Hfrpfl98hDM3zNwVYUdRc/Ek8pLunRpDut9jNptnY06itUbzyg9aHsNl9kgNgoF6QlUc0vZrzQ95+KNVsH/4N4KRqdMlQqNgwarTsiX+LY9cDpr0RVxEqmeKJKSxHBqhzEJMJXNl+egu7ZyuiKMe+RJU2gKoX1zUDCZ3ncbDmVmNvIm8AGa4LWHRDpQ8OwPanW09DzhDBJDULtJCG24MIJ4Q8/oE4YKqFhMHr9MNIllym1oiE2HZs5/bGtGCQcWB530l5gwv5ebVWrM1fYFa9XkSAVW0VWFrbQ92SsgwBm7IhTUh5V8lPrYmOMaxP4YuSlk98CDsVAPoYYzsLO2jinkfnZOvwqFVQwPFu0RmzM4bz1uG8yz+GIRbkZojsZO381h1V1jVofSUX1PXuRE04JGjNf6uhboK/OoBdg5GMxLg6CJhqf/k5+7CM5SEVkGpmby9eMPjo66yQwo7+i5AD8HK8JAc/w7vJCvHx7xSLNamy/D8VRD4xs7DJLGUXZ5pTn+IRQJTfYjK+LhekIVXpeKypJNM1ZRPhyRpzBZOkq1WKSslq9IwFMKUIb94OAlt61PY3uIbMttS0IA3n62LQFsjVHqS40CFy3fU4GTJfbwBiEpJ5HToftndJ6C9AFoeiJj+YUtXS1MOkvpgycFwTPYx6r69xKZp6C+KK2Bfc0iXKo8jPLJUkCiH6XjzcWCvgKgLFxrO0hhTDSMKwRRalI1xc9yCuncYEduouXBuuwT8CsZdep9KD1PzN6JOxVyfpRirAZaeG53JofGSsbnSw/YMxDWn3LDJNPKuRJEc22GN5Aq4zfHx40rhorl+DDTvAXXkBTohxduEkB+Hhfpe131EnP3clvsIpSipIokBshmD1URBeNNrML80k8z3xR4Sy8q2NX5ubC37gadF+17wtxD/jRH4DBEnKrev93bSLQq2/UrigHRUY1ixlkt7Z5eBOCNjADou5t7TV8ZC4o5Q2N2ndtyKefc7xRwx/EoMbNYP6izYFthOUvzNw8QMbK2RJrGtPOxjwKS1ckHBWuYy+maKCtkGl8Z0pcTJWMAMdpUDKjpKvymo6ljuRnkrBzBUOSUybHZlxlhoTl28b2yg MLDSA44-ED25519 test key #2 diff --git a/regress/unittests/sshsig/Makefile b/regress/unittests/sshsig/Makefile index 54abd8499b07..ed19c668e073 100644 --- a/regress/unittests/sshsig/Makefile +++ b/regress/unittests/sshsig/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.7 2026/02/06 23:39:14 dtucker Exp $ +# $OpenBSD: Makefile,v 1.8 2026/06/14 04:08:06 djm Exp $ PROG=test_sshsig SRCS=tests.c @@ -11,7 +11,7 @@ SRCS+=ssherr.c uidswap.c cleanup.c xmalloc.c match.c krl.c fatal.c SRCS+=addr.c addrmatch.c bitmap.c sshsig.c SRCS+=cipher-chachapoly.c chacha.c poly1305.c ssh-ecdsa-sk.c ssh-sk.c SRCS+=ssh-ed25519-sk.c sk-usbhid.c ssh-pkcs11-client.c ssherr-libcrypto.c - +SRCS+=ssh-mldsa-eddsa.c libcrux-mlkem-mldsa.c SRCS+=digest-openssl.c ed25519-openssl.c #SRCS+=digest-libc.c ed25519.c SRCS+=utf8.c diff --git a/regress/unittests/sshsig/mktestdata.sh b/regress/unittests/sshsig/mktestdata.sh index b7c60cc27767..5ad381c2b720 100755 --- a/regress/unittests/sshsig/mktestdata.sh +++ b/regress/unittests/sshsig/mktestdata.sh @@ -1,5 +1,5 @@ #!/bin/sh -# $OpenBSD: mktestdata.sh,v 1.2 2025/05/06 06:05:48 djm Exp $ +# $OpenBSD: mktestdata.sh,v 1.3 2026/06/14 04:08:06 djm Exp $ NAMESPACE=unittest @@ -17,8 +17,9 @@ else fi rm -f signed-data namespace -rm -f rsa ecdsa ed25519 ecdsa_sk ed25519_sk +rm -f rsa ecdsa ed25519 ecdsa_sk ed25519_sk mldsa44-ed25519 rm -f rsa.sig ecdsa.sig ed25519.sig ecdsa_sk.sig ed25519_sk.sig +rm -f mldsa44-ed25519.sig printf "This is a test, this is only a test" > signed-data printf "$NAMESPACE" > namespace @@ -26,6 +27,8 @@ printf "$NAMESPACE" > namespace ssh-keygen -t rsa -C "RSA test" -N "" -f rsa -m PEM ssh-keygen -t ecdsa -C "ECDSA test" -N "" -f ecdsa -m PEM ssh-keygen -t ed25519 -C "ED25519 test key" -N "" -f ed25519 +ssh-keygen -t mldsa44-ed25519 -C "MLDSA44-ED25519 test key" \ + -N "" -f mldsa44-ed25519 ssh-keygen -w "$SK_DUMMY" -t ecdsa-sk -C "ECDSA-SK test key" \ -N "" -f ecdsa_sk ssh-keygen -w "$SK_DUMMY" -t ed25519-sk -C "ED25519-SK test key" \ @@ -34,6 +37,8 @@ ssh-keygen -w "$SK_DUMMY" -t ed25519-sk -C "ED25519-SK test key" \ ssh-keygen -Y sign -f rsa -n $NAMESPACE - < signed-data > rsa.sig ssh-keygen -Y sign -f ecdsa -n $NAMESPACE - < signed-data > ecdsa.sig ssh-keygen -Y sign -f ed25519 -n $NAMESPACE - < signed-data > ed25519.sig +ssh-keygen -Y sign -f mldsa44-ed25519 -n $NAMESPACE - \ + < signed-data > mldsa44-ed25519.sig ssh-keygen -w "$SK_DUMMY" \ -Y sign -f ecdsa_sk -n $NAMESPACE - < signed-data > ecdsa_sk.sig ssh-keygen -w "$SK_DUMMY" \ diff --git a/regress/unittests/sshsig/testdata/mldsa44-ed25519 b/regress/unittests/sshsig/testdata/mldsa44-ed25519 new file mode 100644 index 000000000000..85c246e97dcb --- /dev/null +++ b/regress/unittests/sshsig/testdata/mldsa44-ed25519 @@ -0,0 +1,58 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAFZwAAAB9zc2gtbW +xkc2E0NC1lZDI1NTE5QG9wZW5zc2guY29tAAAFQEJyQnDXx/vv0OJPXSjYcevxmFZnX5aT +vX+En3YwS8Nb6wJC1CguawmJOD7J2zAmz5251gIIoDrhPPVSKdaXql4SUmSitP9AjKS9l3 +Vs8lb1mbxeuEuPY2W1jYMBWAr53Xp3Cj4X6NEi2glFIRHnl7lPBUyBVLT+6qmVRYRdG9pT +bNR/IyxsuDVQ4anaTlPE7Nck/zM86V+bmFblCGl4UPb2orUjcRT1INFHwfnFJOwzQEHdBL +ktjfdy6u5uZWCqC8T+zS7fnDPeitakFoOAeRuwy2SMjygaU8/4qHLoyJWpH56c1tm+oysf +ZmRZ7J6O3shBtoFohLBMlKc/Ni0U/2t5tkdCgK+e5oUhowQ9COgejVMxIgZg/JT3vVSbub +J3Gqi3kcLGtcCRyzPl7lS3CUb+jFG0sJaCZSHWMx7Aw3lV5CbjiAICnQgoa5l+w/rX3FWL +FmKyFB13FbsKJnVP4eNZe1VwB1NvqD3bLclIQ/bHJR8+YKsVVb9lqUtCI711Mkkc17XmiR +aEKaGcTkRr0w/5phUcerqCWvq4va81O1LmoBdlLzgRDELl9BfLygziQzkakOxaUzhZ8ooJ +Mf86L3Qba0l7+U9Me+7cDeFGIP7t91GsPGfokWcBcjaCaRis6YypGDPtSAX6NdB+UOIPDP +dWjmnugcLL+1lKOqoLVp7RE3m1Uz2Fm2eRr6m1CyUCC4Akv4ahDcq0qOxpXkxP37zKp+av +JjPKJMhVncH3LQ7A9DyGkxnWtAg8/1HK1lNIb9pTILd4+c3wlCjVWCo88upqbEp67GqhfO +WlDzw4HFGH0D0l8el9NNZ1cP5yrppxlA8LegIWN/EVVlp+qNgLF6bk2m9shjQfy2j5Mo71 +HTQU1Z8xm4I4kYL7Nu8hjgK/wUTIzaJ8tN5ujyDbcztsR646BiEYGPBEkxxwMRomn7w7mt +97inrE9aIOBc2lKkJO+s7wILcM1bMaelbZKqC+528XHUEWhvIgaY7CXkNIBBWSDFp0kXyA +ntkMaHR6VuTIvZefINczm5jJ++/YfRpkDequptTjH5uFnKayV47vQII4wGAepl+cWqv5Jk ++8pJChi5TTaeiEZhn9pC7loK0//nLJAreP/wVsuMr+uSyL00NvV8Bpf+68aa3bn9BeH9zX +KpMRKdKiCLOc94Dw23J4sIjJr7qBtaXCJQOhU0+l5P1JRDSNhr0VHRCvb/H1+5gGuq0rsy +PmOtn9M0mIfHPKzOKy2ZX/WaY4f+FytZnRlY1NClAKUf0DtIzNpJJ0vpjc/ZyaonJxaPtJ +oDKq37ktOrUh7mlFLCVzwM7Ly5Q4v0h542awn15x8qRa7t50f1rgPTGDSDTIyHfj544C2Z +eePMcFyTQFH6woCzQr9Ojm60CbgjCgT3A5MWFFFDFKlDRu9ZJbSlXdyH9V6hlleKE8Nual +CXMpIdEZq/JrsuKQTLRu2uWKApvIGBF7atZHZiw+mL5oNQq+3A+PDnrIWMABm258M5A69m +62iz/FraKwqDNEEwioecGAAv69E5ueMabvMBePEw90kh+XC3KKoRlcSGLikBuPZRfeIPSs +41jDaE/TXv83NkyGUqoaHFDFmHQ15dK0ZJtPbGZNbE75v2QKg8rU438/6dfl7grEoTrXSf +96NqKExoq8OgZIi8ZgT9ILRq9z2VOTupmHSbT9zf2vmcDHmmNOsrTVf0ajiECgdbujFJJG +uDHPgcL1hhLbKi31SomO2fvbBAYXd9nyef854cNVQMK32D8h7FOE3DIOWIesctPrU10E97 +FNDffHMsaOtgAABdDBhc9xwYXPcQAAAB9zc2gtbWxkc2E0NC1lZDI1NTE5QG9wZW5zc2gu +Y29tAAAFQEJyQnDXx/vv0OJPXSjYcevxmFZnX5aTvX+En3YwS8Nb6wJC1CguawmJOD7J2z +Amz5251gIIoDrhPPVSKdaXql4SUmSitP9AjKS9l3Vs8lb1mbxeuEuPY2W1jYMBWAr53Xp3 +Cj4X6NEi2glFIRHnl7lPBUyBVLT+6qmVRYRdG9pTbNR/IyxsuDVQ4anaTlPE7Nck/zM86V ++bmFblCGl4UPb2orUjcRT1INFHwfnFJOwzQEHdBLktjfdy6u5uZWCqC8T+zS7fnDPeitak +FoOAeRuwy2SMjygaU8/4qHLoyJWpH56c1tm+oysfZmRZ7J6O3shBtoFohLBMlKc/Ni0U/2 +t5tkdCgK+e5oUhowQ9COgejVMxIgZg/JT3vVSbubJ3Gqi3kcLGtcCRyzPl7lS3CUb+jFG0 +sJaCZSHWMx7Aw3lV5CbjiAICnQgoa5l+w/rX3FWLFmKyFB13FbsKJnVP4eNZe1VwB1NvqD +3bLclIQ/bHJR8+YKsVVb9lqUtCI711Mkkc17XmiRaEKaGcTkRr0w/5phUcerqCWvq4va81 +O1LmoBdlLzgRDELl9BfLygziQzkakOxaUzhZ8ooJMf86L3Qba0l7+U9Me+7cDeFGIP7t91 +GsPGfokWcBcjaCaRis6YypGDPtSAX6NdB+UOIPDPdWjmnugcLL+1lKOqoLVp7RE3m1Uz2F +m2eRr6m1CyUCC4Akv4ahDcq0qOxpXkxP37zKp+avJjPKJMhVncH3LQ7A9DyGkxnWtAg8/1 +HK1lNIb9pTILd4+c3wlCjVWCo88upqbEp67GqhfOWlDzw4HFGH0D0l8el9NNZ1cP5yrppx +lA8LegIWN/EVVlp+qNgLF6bk2m9shjQfy2j5Mo71HTQU1Z8xm4I4kYL7Nu8hjgK/wUTIza +J8tN5ujyDbcztsR646BiEYGPBEkxxwMRomn7w7mt97inrE9aIOBc2lKkJO+s7wILcM1bMa +elbZKqC+528XHUEWhvIgaY7CXkNIBBWSDFp0kXyAntkMaHR6VuTIvZefINczm5jJ++/YfR +pkDequptTjH5uFnKayV47vQII4wGAepl+cWqv5Jk+8pJChi5TTaeiEZhn9pC7loK0//nLJ +AreP/wVsuMr+uSyL00NvV8Bpf+68aa3bn9BeH9zXKpMRKdKiCLOc94Dw23J4sIjJr7qBta +XCJQOhU0+l5P1JRDSNhr0VHRCvb/H1+5gGuq0rsyPmOtn9M0mIfHPKzOKy2ZX/WaY4f+Fy +tZnRlY1NClAKUf0DtIzNpJJ0vpjc/ZyaonJxaPtJoDKq37ktOrUh7mlFLCVzwM7Ly5Q4v0 +h542awn15x8qRa7t50f1rgPTGDSDTIyHfj544C2ZeePMcFyTQFH6woCzQr9Ojm60CbgjCg +T3A5MWFFFDFKlDRu9ZJbSlXdyH9V6hlleKE8NualCXMpIdEZq/JrsuKQTLRu2uWKApvIGB +F7atZHZiw+mL5oNQq+3A+PDnrIWMABm258M5A69m62iz/FraKwqDNEEwioecGAAv69E5ue +MabvMBePEw90kh+XC3KKoRlcSGLikBuPZRfeIPSs41jDaE/TXv83NkyGUqoaHFDFmHQ15d +K0ZJtPbGZNbE75v2QKg8rU438/6dfl7grEoTrXSf96NqKExoq8OgZIi8ZgT9ILRq9z2VOT +upmHSbT9zf2vmcDHmmNOsrTVf0ajiECgdbujFJJGuDHPgcL1hhLbKi31SomO2fvbBAYXd9 +nyef854cNVQMK32D8h7FOE3DIOWIesctPrU10E97FNDffHMsaOtgAAAECtgRPgibkKYTEU +inI+TpS2aiu7bHRYkvn/2BqHT2zd1f57PMPDEvJhOvmVhk7rZWBeW6lEUXmVSk8PlxP9GS +FEAAAAGE1MRFNBNDQtRUQyNTUxOSB0ZXN0IGtleQE= +-----END OPENSSH PRIVATE KEY----- diff --git a/regress/unittests/sshsig/testdata/mldsa44-ed25519.pub b/regress/unittests/sshsig/testdata/mldsa44-ed25519.pub new file mode 100644 index 000000000000..92af10c4a0a9 --- /dev/null +++ b/regress/unittests/sshsig/testdata/mldsa44-ed25519.pub @@ -0,0 +1 @@ +ssh-mldsa44-ed25519@openssh.com AAAAH3NzaC1tbGRzYTQ0LWVkMjU1MTlAb3BlbnNzaC5jb20AAAVAQnJCcNfH++/Q4k9dKNhx6/GYVmdflpO9f4SfdjBLw1vrAkLUKC5rCYk4PsnbMCbPnbnWAgigOuE89VIp1peqXhJSZKK0/0CMpL2XdWzyVvWZvF64S49jZbWNgwFYCvndencKPhfo0SLaCUUhEeeXuU8FTIFUtP7qqZVFhF0b2lNs1H8jLGy4NVDhqdpOU8Ts1yT/MzzpX5uYVuUIaXhQ9vaitSNxFPUg0UfB+cUk7DNAQd0EuS2N93Lq7m5lYKoLxP7NLt+cM96K1qQWg4B5G7DLZIyPKBpTz/iocujIlakfnpzW2b6jKx9mZFnsno7eyEG2gWiEsEyUpz82LRT/a3m2R0KAr57mhSGjBD0I6B6NUzEiBmD8lPe9VJu5sncaqLeRwsa1wJHLM+XuVLcJRv6MUbSwloJlIdYzHsDDeVXkJuOIAgKdCChrmX7D+tfcVYsWYrIUHXcVuwomdU/h41l7VXAHU2+oPdstyUhD9sclHz5gqxVVv2WpS0IjvXUySRzXteaJFoQpoZxORGvTD/mmFRx6uoJa+ri9rzU7UuagF2UvOBEMQuX0F8vKDOJDORqQ7FpTOFnyigkx/zovdBtrSXv5T0x77twN4UYg/u33Uaw8Z+iRZwFyNoJpGKzpjKkYM+1IBfo10H5Q4g8M91aOae6Bwsv7WUo6qgtWntETebVTPYWbZ5GvqbULJQILgCS/hqENyrSo7GleTE/fvMqn5q8mM8okyFWdwfctDsD0PIaTGda0CDz/UcrWU0hv2lMgt3j5zfCUKNVYKjzy6mpsSnrsaqF85aUPPDgcUYfQPSXx6X001nVw/nKumnGUDwt6AhY38RVWWn6o2AsXpuTab2yGNB/LaPkyjvUdNBTVnzGbgjiRgvs27yGOAr/BRMjNony03m6PINtzO2xHrjoGIRgY8ESTHHAxGiafvDua33uKesT1og4FzaUqQk76zvAgtwzVsxp6VtkqoL7nbxcdQRaG8iBpjsJeQ0gEFZIMWnSRfICe2QxodHpW5Mi9l58g1zObmMn779h9GmQN6q6m1OMfm4WcprJXju9AgjjAYB6mX5xaq/kmT7ykkKGLlNNp6IRmGf2kLuWgrT/+cskCt4//BWy4yv65LIvTQ29XwGl/7rxprduf0F4f3NcqkxEp0qIIs5z3gPDbcniwiMmvuoG1pcIlA6FTT6Xk/UlENI2GvRUdEK9v8fX7mAa6rSuzI+Y62f0zSYh8c8rM4rLZlf9Zpjh/4XK1mdGVjU0KUApR/QO0jM2kknS+mNz9nJqicnFo+0mgMqrfuS06tSHuaUUsJXPAzsvLlDi/SHnjZrCfXnHypFru3nR/WuA9MYNINMjId+PnjgLZl548xwXJNAUfrCgLNCv06ObrQJuCMKBPcDkxYUUUMUqUNG71kltKVd3If1XqGWV4oTw25qUJcykh0Rmr8muy4pBMtG7a5YoCm8gYEXtq1kdmLD6Yvmg1Cr7cD48OeshYwAGbbnwzkDr2braLP8WtorCoM0QTCKh5wYAC/r0Tm54xpu8wF48TD3SSH5cLcoqhGVxIYuKQG49lF94g9KzjWMNoT9Ne/zc2TIZSqhocUMWYdDXl0rRkm09sZk1sTvm/ZAqDytTjfz/p1+XuCsShOtdJ/3o2ooTGirw6BkiLxmBP0gtGr3PZU5O6mYdJtP3N/a+ZwMeaY06ytNV/RqOIQKB1u6MUkka4Mc+BwvWGEtsqLfVKiY7Z+9sEBhd32fJ5/znhw1VAwrfYPyHsU4TcMg5Yh6xy0+tTXQT3sU0N98cyxo62 MLDSA44-ED25519 test key diff --git a/regress/unittests/sshsig/testdata/mldsa44-ed25519.sig b/regress/unittests/sshsig/testdata/mldsa44-ed25519.sig new file mode 100644 index 000000000000..45b1e7589226 --- /dev/null +++ b/regress/unittests/sshsig/testdata/mldsa44-ed25519.sig @@ -0,0 +1,78 @@ +-----BEGIN SSH SIGNATURE----- +U1NIU0lHAAAAAQAABWcAAAAfc3NoLW1sZHNhNDQtZWQyNTUxOUBvcGVuc3NoLmNvbQAABU +BCckJw18f779DiT10o2HHr8ZhWZ1+Wk71/hJ92MEvDW+sCQtQoLmsJiTg+ydswJs+dudYC +CKA64Tz1UinWl6peElJkorT/QIykvZd1bPJW9Zm8XrhLj2NltY2DAVgK+d16dwo+F+jRIt +oJRSER55e5TwVMgVS0/uqplUWEXRvaU2zUfyMsbLg1UOGp2k5TxOzXJP8zPOlfm5hW5Qhp +eFD29qK1I3EU9SDRR8H5xSTsM0BB3QS5LY33curubmVgqgvE/s0u35wz3orWpBaDgHkbsM +tkjI8oGlPP+Khy6MiVqR+enNbZvqMrH2ZkWeyejt7IQbaBaISwTJSnPzYtFP9rebZHQoCv +nuaFIaMEPQjoHo1TMSIGYPyU971Um7mydxqot5HCxrXAkcsz5e5UtwlG/oxRtLCWgmUh1j +MewMN5VeQm44gCAp0IKGuZfsP619xVixZishQddxW7CiZ1T+HjWXtVcAdTb6g92y3JSEP2 +xyUfPmCrFVW/ZalLQiO9dTJJHNe15okWhCmhnE5Ea9MP+aYVHHq6glr6uL2vNTtS5qAXZS +84EQxC5fQXy8oM4kM5GpDsWlM4WfKKCTH/Oi90G2tJe/lPTHvu3A3hRiD+7fdRrDxn6JFn +AXI2gmkYrOmMqRgz7UgF+jXQflDiDwz3Vo5p7oHCy/tZSjqqC1ae0RN5tVM9hZtnka+ptQ +slAguAJL+GoQ3KtKjsaV5MT9+8yqfmryYzyiTIVZ3B9y0OwPQ8hpMZ1rQIPP9RytZTSG/a +UyC3ePnN8JQo1VgqPPLqamxKeuxqoXzlpQ88OBxRh9A9JfHpfTTWdXD+cq6acZQPC3oCFj +fxFVZafqjYCxem5NpvbIY0H8to+TKO9R00FNWfMZuCOJGC+zbvIY4Cv8FEyM2ifLTebo8g +23M7bEeuOgYhGBjwRJMccDEaJp+8O5rfe4p6xPWiDgXNpSpCTvrO8CC3DNWzGnpW2Sqgvu +dvFx1BFobyIGmOwl5DSAQVkgxadJF8gJ7ZDGh0elbkyL2XnyDXM5uYyfvv2H0aZA3qrqbU +4x+bhZymsleO70CCOMBgHqZfnFqr+SZPvKSQoYuU02nohGYZ/aQu5aCtP/5yyQK3j/8FbL +jK/rksi9NDb1fAaX/uvGmt25/QXh/c1yqTESnSogiznPeA8NtyeLCIya+6gbWlwiUDoVNP +peT9SUQ0jYa9FR0Qr2/x9fuYBrqtK7Mj5jrZ/TNJiHxzyszistmV/1mmOH/hcrWZ0ZWNTQ +pQClH9A7SMzaSSdL6Y3P2cmqJycWj7SaAyqt+5LTq1Ie5pRSwlc8DOy8uUOL9IeeNmsJ9e +cfKkWu7edH9a4D0xg0g0yMh34+eOAtmXnjzHBck0BR+sKAs0K/To5utAm4IwoE9wOTFhRR +QxSpQ0bvWSW0pV3ch/VeoZZXihPDbmpQlzKSHRGavya7LikEy0btrligKbyBgRe2rWR2Ys +Ppi+aDUKvtwPjw56yFjAAZtufDOQOvZutos/xa2isKgzRBMIqHnBgAL+vRObnjGm7zAXjx +MPdJIflwtyiqEZXEhi4pAbj2UX3iD0rONYw2hP017/NzZMhlKqGhxQxZh0NeXStGSbT2xm +TWxO+b9kCoPK1ON/P+nX5e4KxKE610n/ejaihMaKvDoGSIvGYE/SC0avc9lTk7qZh0m0/c +39r5nAx5pjTrK01X9Go4hAoHW7oxSSRrgxz4HC9YYS2yot9UqJjtn72wQGF3fZ8nn/OeHD +VUDCt9g/IexThNwyDliHrHLT61NdBPexTQ33xzLGjrYAAAAIdW5pdHRlc3QAAAAAAAAABn +NoYTUxMgAACdsAAAAfc3NoLW1sZHNhNDQtZWQyNTUxOUBvcGVuc3NoLmNvbQAACbTPlGm4 +hZSSu1pnt2Tr5TpqUqvjw8F55anEUT1Yi05dtTlnkewIxMeleaY/DJGK9uoSYlauaTh+8w +Ijrn6ZMrFkGHY8mnA73jw0b71CWljntHPWI2lS/mWOhRcAwAKakxkmgKQDNXGCC/NfpKn2 +hfDvUezAbhThoBS5hNlQ+FJKWnRN2Mpa01Q7ZqBZ2vVQ2oDTPd2Yivf/5tJzkiYufkEWZK +VWEO6lYjWGlk9MIXVegQPO/Ucp+B42DckzHbOiDozFC4N+DrkyMwMeY98/H7nlR72xmzw2 +/ylnACyLCstcagxG9cRbA2FQvbVgxQzO7Am0XLQ8ELsinwphAYRVuyU6cgClFDutraA80S +VaEVHrJgKYd2FpdDfjV1cXDUaN2bQz3VXYOEq42LKOmOJBCxNCqm/EUhY1fY+nFdIwmIy5 +OraN6Ut93PCKtLzmlXPMwXJA5eHORnUy8j4RpO7egKEQ52GDEHHsQDjf9siEoyaVSwfgKI +A30SwzXALQh3uFOjjEizv4rZb/eID6PWWu1cD/nVMG2oEJWoUeARGrRPeJHDjW4eGgAZWT +bz4GRqf4t/oCeLyNvjwIg0gLphE6YTCpBttBJahG1GNWVhD1Q9EpmgWBGiEOk4ak7dPEZB +0ljMgONB6p+z7H2SlvHSihpzzOldZhPMTgxMUDSG20pvyTwL40sHKPe3bOfIi7H31LDkF/ +OeXB7SwNitG2S1dTLLzpwBbdAahqxDikDH+s17NFzNatGWlEzWQ+jzcI9/mbLpKAveGxiY +C8eoL1C/y7u+vXL9eW+zyRNlSt0ewD1SIPxoEFNz/IbjzLB4TMs/raEgwPu4sLm4KAuvoj +A8mGbNiTXAWsGIns5UJgsSrJUnM3/yxT86V9KBVhIUDV0GKS81+WoSnlQ/o4le0CCTXJUU +feV3gnL5SlF5RFgfE+5OFYQ2WYhl7o1MLymunQ7S0BWzBGYMXGoT/DQ6LMxqAOZkNWADeV +76jDwgeIso3q4BEmHeiZOJBat5mQ04FWkrY7decWXNpkEEUQdhHc09wA/NtGla6EQzNxG7 +voc4gr7h1ZbJg6IhI5wnr80maDpFFoC3FAy9w1gic0kBfpklprgg9f/BMwz9RK0iULTvjT +HB7vIs4iGaIhPjaiD/kxiC/spIfyWLrHT7RFWpOUIDQrCMEiF/OoJhp8v2gzW9LlYisP4U +ljZOj0438lxefebJQry1KUOH99HZVC7cjm41PWMkYUT1RRITlz/HhOrMqt1LZ64yVbazau +kvs/P5Ngeo0HcKbbExFWu4efgeYzqgZ7wZ7PAlu82LUkBtdjaFV+c/HOkTAv1pc9X8/DuQ +K2eeLnO4Z9cwF2G2OaOsU53Cq4xypxqrmGEcS7Lf/9vZe271RNfH62HvlLv/PEG3VlpEHp +BmUzqHiNp85aYtcMKhK6JcY6UnYiFXOarxymZYiCykVZDAUN3azdh7ClYIvUg/k7ZjSHHX +2ELtzJKsonNBtt/YybaNLInrhj8s58GaJv3tZTkfxOzEMXR6iBauOATMEKu8YQ8e6h4dag +sf6Q7SGzcr6Kc2Gtw+qjoDjVWcgp5ZfHKxM9e1VpWhA46INTaLzej45iI+JMqkyjMiVIEy +vnydouPPRAe06CSOE4pBofDAZf+3RsiFZN9J55lcK6sBR1T7hSIIE6+XLg5ktLC+W6/1mp +IWXhz+PQEZTjLwUb6KaHs8gzvolmm5OpMCw8i5WLSAQ4HPWMPxwRHdxUu2k9NQQPogw90I +esBazP2+b/rZWrPNuRM63mjeZyKM8nuouID3D+C75hosfU2WNMPn0lwg+IaN4IyfMT5+TD +rV3/Vtwqz+WE4fIT7IW13A5G54VyCWEazWtVQFQiGuY7JcgbcJXDtAi/Hg0yzThjU+FRJn +Z2nsqi3SlTQW1nKK2xcfnrT28HN8M384KNQTJoOfAHPGWZvjMwAwMyFvwNlTzekJtmnV9Y +GxeK7iZml66oEFkEA0UFL69cFuXs38WFfTSmRslqw5YMea0/N/CLMDEeIrbUqzMxGFyRPu ++6VS3zJ6OyvAAGuNohW6PBFmtNJ4V8A/OavoAmh4Wklyb+ZZn9x5U2k1PvVQYHWlqa14Y8 +ar/THn3IAAdI8rsEZeq/phg2RlAuagpNHeK5C+SfLi5uRXbbwRqTZIGiCsb0RmKKBlp6Tt +cZEq7mjXprD6X1T6QsOZ191fZ3JHwzgxPyrlOgIs0XVN7MqJsnMbHLZr5/sX0W/UPRxonT +a5kDcNBl/ngwbFZQjY1dwQGEtG0Pe5A45TJU0Ycfo+MRreU14FHYPq/f2Qz/585qK3epPE +vVZPiZkpKITN+e8XcwvO9pgRF2+9zZYC5iKtinumQtZ3QkxagaAzt2QjacxD2HbDuKhe1r +B7ITPw6TDPn50fio/vb7lkFl/7uip9Jy7yn7+6lPaKNU20KwEeWj9d0tPv8xSylW/lfU7u +UQmNIe+NQrhF6qo54GOLGmiuZa7tDb6lF3/EyahlNXhuCv5+Fzd+QPumizQIOD6mv9SDf4 +VC0GGkmSomVqsuQUJrcVdcUZvcV54ozAM+mMlJ2ZzaTXxJ2ud6QjUFco6Vt8qudFNG6hFq +9L348x97RxIgKHh4H6XKAZKY2fnJh+TNZp+vobElw06PA8iY2mqOeouJTc5QXHdrvsfuli +v78YG/2/w7H7dcFjsKgQBy+k8txWf0LlF7pAz1r5Sha6ipJZXyvEVCJT54zLR7Jq4KkFmi +OVUJjNE3x0a+3Rhf6JjBvXY4eipE80bRQarhYyx5UCj4Rz+AwDpCelpzUKEuLnSgwe+i7s +1Ahz6S6jtR27AD6SFZJV7cgbRGlU+0AF6c8+oN6g6W6m7AOVGeV3JhfjqGdB+anRQBlc8l +0tHsK7HXx7qnO7Q6MUBb0DH4ULy2lKuVfBcnnF2ECCd0b8tnHcJ392SRrW2DI+PZuTPVZ9 +svHiHHaLMRgj83MOFUigyYASFpJyfugKYUfazkxegp5bqJqS13+EXeZ/v5ax3pxA9x0jJD +u56JU/IeQK9NAiEyaVz6vk2y5NsyiHS1i7dle1ShjlsKdVKHHIujs6xlRECal4/TI04MSV +HFFDVr20LNhynZmFA9nxyRUfJW3+mSU0U1ZXdoCGudHk9gEHDyc+P1ZvdX2RmaGouL7S6f +UHDg8YGywvRlBZWmNscHOXnJ2ssLe4vsLI5fT7/wgRNlJucHOosLu8vs/f+AAAAAAADB88 +S5ANc0JiZDzQZe2HdFhRQjE7+PY7mDMleC/fcu1YitJorDd+KZ4rARVqHn96ps17jJVCGN +X21nUV3kRQplF/RQk= +-----END SSH SIGNATURE----- diff --git a/regress/unittests/sshsig/tests.c b/regress/unittests/sshsig/tests.c index 670d06718955..5408be67ef14 100644 --- a/regress/unittests/sshsig/tests.c +++ b/regress/unittests/sshsig/tests.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tests.c,v 1.6 2025/05/06 06:05:48 djm Exp $ */ +/* $OpenBSD: tests.c,v 1.7 2026/06/14 04:08:06 djm Exp $ */ /* * Regress test for sshbuf.h buffer API * @@ -113,6 +113,10 @@ tests(void) check_sig("ed25519.pub", "ed25519.sig", msg, namespace); TEST_DONE(); + TEST_START("check MLDSA44-ED25519 signature"); + check_sig("mldsa44-ed25519.pub", "mldsa44-ed25519.sig", msg, namespace); + TEST_DONE(); + #ifdef ENABLE_SK #if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC) TEST_START("check ECDSA-SK signature"); From 8e0cb471774e39a308e41cf5890823dfb418fd5b Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Sun, 14 Jun 2026 15:02:24 +1000 Subject: [PATCH 104/196] hook up new regress/unittests/crypto --- Makefile.in | 21 +++++++++++++++++++++ regress/Makefile | 2 ++ regress/unittests/crypto/test_ed25519.c | 2 ++ regress/unittests/crypto/test_mldsa.c | 2 ++ regress/unittests/crypto/test_mldsa_eddsa.c | 2 ++ regress/unittests/crypto/test_mlkem.c | 2 ++ regress/unittests/crypto/tests.c | 2 ++ 7 files changed, 33 insertions(+) diff --git a/Makefile.in b/Makefile.in index 9bf9422cefb6..da59bcc100c7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -316,6 +316,8 @@ clean: regressclean rm -f regress/unittests/kex/test_kex$(EXEEXT) rm -f regress/unittests/match/*.o rm -f regress/unittests/match/test_match$(EXEEXT) + rm -f regress/unittests/crypto/*.o + rm -f regress/unittests/crypto/test_crypto$(EXEEXT) rm -f regress/unittests/misc/*.o rm -f regress/unittests/misc/test_misc$(EXEEXT) rm -f regress/unittests/servconf/*.o @@ -357,6 +359,8 @@ distclean: regressclean rm -f regress/unittests/kex/test_kex rm -f regress/unittests/match/*.o rm -f regress/unittests/match/test_match + rm -f regress/unittests/crypto/*.o + rm -f regress/unittests/crypto/test_crypto rm -f regress/unittests/misc/*.o rm -f regress/unittests/misc/test_misc rm -f regress/unittests/servconf/*.o @@ -543,6 +547,7 @@ regress-prep: $(MKDIR_P) `pwd`/regress/unittests/hostkeys $(MKDIR_P) `pwd`/regress/unittests/kex $(MKDIR_P) `pwd`/regress/unittests/match + $(MKDIR_P) `pwd`/regress/unittests/crypto $(MKDIR_P) `pwd`/regress/unittests/misc $(MKDIR_P) `pwd`/regress/unittests/servconf $(MKDIR_P) `pwd`/regress/unittests/sshbuf @@ -695,6 +700,21 @@ regress/unittests/match/test_match$(EXEEXT): \ regress/unittests/test_helper/libtest_helper.a \ -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) +UNITTESTS_TEST_CRYPTO_OBJS=\ + regress/unittests/crypto/test_ed25519.o \ + regress/unittests/crypto/test_mldsa.o \ + regress/unittests/crypto/test_mldsa_eddsa.o \ + regress/unittests/crypto/test_mlkem.o \ + regress/unittests/crypto/tests.o \ + $(P11OBJS) $(SKOBJS) + +regress/unittests/crypto/test_crypto$(EXEEXT): \ + ${UNITTESTS_TEST_CRYPTO_OBJS} \ + regress/unittests/test_helper/libtest_helper.a libssh.a + $(LD) -o $@ $(LDFLAGS) $(UNITTESTS_TEST_CRYPTO_OBJS) \ + regress/unittests/test_helper/libtest_helper.a \ + -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) + UNITTESTS_TEST_MISC_OBJS=\ regress/unittests/misc/tests.o \ regress/unittests/misc/test_parse.o \ @@ -778,6 +798,7 @@ regress-unit-binaries: regress-prep $(REGRESSLIBS) \ regress/unittests/hostkeys/test_hostkeys$(EXEEXT) \ regress/unittests/kex/test_kex$(EXEEXT) \ regress/unittests/match/test_match$(EXEEXT) \ + regress/unittests/crypto/test_crypto$(EXEEXT) \ regress/unittests/misc/test_misc$(EXEEXT) \ regress/unittests/servconf/test_servconf$(EXEEXT) \ regress/unittests/sshbuf/test_sshbuf$(EXEEXT) \ diff --git a/regress/Makefile b/regress/Makefile index 9120f1758ecf..a6f81bef4305 100644 --- a/regress/Makefile +++ b/regress/Makefile @@ -309,6 +309,8 @@ unit unit-bench: $$V ${.OBJDIR}/unittests/match/test_match $${ARGS}; \ $$V ${.OBJDIR}/unittests/misc/test_misc $${ARGS}; \ $$V ${.OBJDIR}/unittests/servconf/test_servconf $${ARGS}; \ + $$V ${.OBJDIR}/unittests/crypto/test_crypto \ + -d ${.CURDIR}/unittests/crypto/testdata $${ARGS}; \ if test "x${TEST_SSH_UTF8}" = "xyes" ; then \ $$V ${.OBJDIR}/unittests/utf8/test_utf8 $${ARGS}; \ fi \ diff --git a/regress/unittests/crypto/test_ed25519.c b/regress/unittests/crypto/test_ed25519.c index 5c554ace5532..cc9ea3b86a07 100644 --- a/regress/unittests/crypto/test_ed25519.c +++ b/regress/unittests/crypto/test_ed25519.c @@ -5,6 +5,8 @@ * Placed in the public domain */ +#include "includes.h" + #include #include #include diff --git a/regress/unittests/crypto/test_mldsa.c b/regress/unittests/crypto/test_mldsa.c index c9c796d799b6..c21179130548 100644 --- a/regress/unittests/crypto/test_mldsa.c +++ b/regress/unittests/crypto/test_mldsa.c @@ -5,6 +5,8 @@ * Placed in the public domain */ +#include "includes.h" + #include #include #include diff --git a/regress/unittests/crypto/test_mldsa_eddsa.c b/regress/unittests/crypto/test_mldsa_eddsa.c index b9549e94d9e4..655e421b8ea1 100644 --- a/regress/unittests/crypto/test_mldsa_eddsa.c +++ b/regress/unittests/crypto/test_mldsa_eddsa.c @@ -5,6 +5,8 @@ * Placed in the public domain */ +#include "includes.h" + #include #include #include diff --git a/regress/unittests/crypto/test_mlkem.c b/regress/unittests/crypto/test_mlkem.c index 9cd7183e2fd8..1484698922cc 100644 --- a/regress/unittests/crypto/test_mlkem.c +++ b/regress/unittests/crypto/test_mlkem.c @@ -5,6 +5,8 @@ * Placed in the public domain */ +#include "includes.h" + #include #include #include diff --git a/regress/unittests/crypto/tests.c b/regress/unittests/crypto/tests.c index 53a44fb0e8cc..9061e332ee09 100644 --- a/regress/unittests/crypto/tests.c +++ b/regress/unittests/crypto/tests.c @@ -5,6 +5,8 @@ * Placed in the public domain */ +#include "includes.h" + #include #include From ea505c83ecae67c66c020f03b964cf471055191e Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Sun, 14 Jun 2026 18:56:31 +1000 Subject: [PATCH 105/196] provide a htobe32() replacement --- configure.ac | 2 +- defines.h | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 530c8e316fc7..cba44faf2b15 100644 --- a/configure.ac +++ b/configure.ac @@ -588,7 +588,7 @@ for include in sys/queue.h sys/tree.h; do esac >"$header" done -AC_CHECK_DECLS([le32toh, le64toh, htole64], [], [], [ +AC_CHECK_DECLS([le32toh, le64toh, htole64, htobe32], [], [], [ #ifdef HAVE_SYS_TYPES_H # include #endif diff --git a/defines.h b/defines.h index 54f0fc83f957..0057aa16856b 100644 --- a/defines.h +++ b/defines.h @@ -663,7 +663,8 @@ struct winsize { #if (defined(HAVE_DECL_LE32TOH) && HAVE_DECL_LE32TOH == 0) || \ (defined(HAVE_DECL_LE64TOH) && HAVE_DECL_LE64TOH == 0) || \ - (defined(HAVE_DECL_HTOLE64) && HAVE_DECL_HTOLE64 == 0) + (defined(HAVE_DECL_HTOLE64) && HAVE_DECL_HTOLE64 == 0) || \ + (defined(HAVE_DECL_HTOBE32) && HAVE_DECL_HTOBE32 == 0) # define openssh_swap32(v) \ (uint32_t)(((uint32_t)(v) & 0xff) << 24 | \ ((uint32_t)(v) & 0xff00) << 8 | \ @@ -687,7 +688,10 @@ struct winsize { # endif # if defined(HAVE_DECL_HTOLE64) && HAVE_DECL_HTOLE64 == 0 # define htole64(v) (openssh_swap64(v)) -# endif +# endif +# if defined(HAVE_DECL_HTOBE32) && HAVE_DECL_HTOBE32 == 0 +# define htobe32(v) ((uint32_t)v) +# endif # else # if defined(HAVE_DECL_LE32TOH) && HAVE_DECL_LE32TOH == 0 # define le32toh(v) ((uint32_t)v) @@ -698,6 +702,9 @@ struct winsize { # if defined(HAVE_DECL_HTOLE64) && HAVE_DECL_HTOLE64 == 0 # define htole64(v) ((uint64_t)v) # endif +# if defined(HAVE_DECL_HTOBE32) && HAVE_DECL_HTOBE32 == 0 +# define htobe32(v) (openssh_swap32(v)) +# endif # endif #endif From 1c46384db91a724a214ce96297d64c7ea9274a4c Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Sun, 14 Jun 2026 20:24:25 +1000 Subject: [PATCH 106/196] include includes.h --- libcrux-mlkem-mldsa.c | 1 + ssh-mldsa-eddsa.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/libcrux-mlkem-mldsa.c b/libcrux-mlkem-mldsa.c index d7e0e7c38f8d..6aa94dadbdca 100644 --- a/libcrux-mlkem-mldsa.c +++ b/libcrux-mlkem-mldsa.c @@ -15,6 +15,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include "includes.h" #include #include diff --git a/ssh-mldsa-eddsa.c b/ssh-mldsa-eddsa.c index 6d43726523b7..17588a23ed0a 100644 --- a/ssh-mldsa-eddsa.c +++ b/ssh-mldsa-eddsa.c @@ -17,6 +17,8 @@ /* draft-miller-sshm-mldsa44-ed25519-composite-sigs-00 */ +#include "includes.h" + #include #include #include From b35a6a153f4164a56174e4795d4384867349e9aa Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Sun, 14 Jun 2026 20:32:12 +1000 Subject: [PATCH 107/196] don't build ML-KEM/ML-DSA code with #include #include @@ -425,3 +427,4 @@ sha3_512(uint8_t digest[64], const uint8_t *data, size_t len) Eurydice_mut_borrow_slice_u8 output = { digest, 64 }; libcrux_sha3_portable_sha512(output, input); } +#endif /* defined(USE_MLDSA) || defined(USE_MLKEM768X25519) */ diff --git a/regress/unittests/crypto/test_mldsa.c b/regress/unittests/crypto/test_mldsa.c index c21179130548..d845c49d4289 100644 --- a/regress/unittests/crypto/test_mldsa.c +++ b/regress/unittests/crypto/test_mldsa.c @@ -7,6 +7,8 @@ #include "includes.h" +#ifdef USE_MLDSA + #include #include #include @@ -143,3 +145,4 @@ mldsa_tests(void) free_kats(kats, nkats); TEST_DONE(); } +#endif /* USE_MLDSA */ diff --git a/regress/unittests/crypto/test_mldsa_eddsa.c b/regress/unittests/crypto/test_mldsa_eddsa.c index 655e421b8ea1..0a8a38089011 100644 --- a/regress/unittests/crypto/test_mldsa_eddsa.c +++ b/regress/unittests/crypto/test_mldsa_eddsa.c @@ -7,6 +7,8 @@ #include "includes.h" +#ifdef USE_MLDSA + #include #include #include @@ -192,3 +194,4 @@ mldsa_eddsa_tests(void) sshbuf_free(b_s); sshbuf_free(b_sWithContext); } +#endif /* USE_MLDSA */ diff --git a/regress/unittests/crypto/test_mlkem.c b/regress/unittests/crypto/test_mlkem.c index 1484698922cc..5d1b421f7886 100644 --- a/regress/unittests/crypto/test_mlkem.c +++ b/regress/unittests/crypto/test_mlkem.c @@ -7,6 +7,8 @@ #include "includes.h" +#ifdef USE_MLKEM768X25519 + #include #include #include @@ -167,3 +169,4 @@ mlkem_tests(void) } TEST_DONE(); } +#endif /* USE_MLKEM768X25519 */ diff --git a/regress/unittests/crypto/tests.c b/regress/unittests/crypto/tests.c index 9061e332ee09..9caff06c1ae0 100644 --- a/regress/unittests/crypto/tests.c +++ b/regress/unittests/crypto/tests.c @@ -103,10 +103,16 @@ get_json_string(struct sshbuf *content, const char *key, int consume) void tests(void) { +#ifdef USE_MLDSA mldsa_tests(); +#endif +#ifdef USE_MLKEM768X25519 mlkem_tests(); +#endif ed25519_tests(); +#ifdef USE_MLDSA mldsa_eddsa_tests(); +#endif } void diff --git a/ssh-mldsa-eddsa.c b/ssh-mldsa-eddsa.c index 17588a23ed0a..89c35c7d1a00 100644 --- a/ssh-mldsa-eddsa.c +++ b/ssh-mldsa-eddsa.c @@ -19,6 +19,8 @@ #include "includes.h" +#ifdef USE_MLDSA + #include #include #include @@ -501,3 +503,4 @@ const struct sshkey_impl sshkey_mldsa44_ed25519_cert_impl = { /* .keybits = */ 256, /* .funcs = */ &sshkey_mldsa44_ed25519_funcs, }; +#endif /* USE_MLDSA */ diff --git a/sshkey.c b/sshkey.c index b91bb43bb1c1..00572792fa63 100644 --- a/sshkey.c +++ b/sshkey.c @@ -90,8 +90,10 @@ extern const struct sshkey_impl sshkey_ed25519_impl; extern const struct sshkey_impl sshkey_ed25519_cert_impl; extern const struct sshkey_impl sshkey_ed25519_sk_impl; extern const struct sshkey_impl sshkey_ed25519_sk_cert_impl; +#ifdef USE_MLDSA extern const struct sshkey_impl sshkey_mldsa44_ed25519_impl; extern const struct sshkey_impl sshkey_mldsa44_ed25519_cert_impl; +#endif /* USE_MLDSA */ #ifdef WITH_OPENSSL # ifdef OPENSSL_HAS_ECC # ifdef ENABLE_SK @@ -124,8 +126,10 @@ const struct sshkey_impl * const keyimpls[] = { &sshkey_ed25519_sk_impl, &sshkey_ed25519_sk_cert_impl, #endif +#ifdef USE_MLDSA &sshkey_mldsa44_ed25519_impl, &sshkey_mldsa44_ed25519_cert_impl, +#endif /* USE_MLDSA */ #ifdef WITH_OPENSSL # ifdef OPENSSL_HAS_ECC &sshkey_ecdsa_nistp256_impl, From ebdaacf4907033af1cbf1fef593436081dcd67a7 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 15 Jun 2026 11:43:52 +1000 Subject: [PATCH 108/196] bring back mlkem768x25519-sha256 stubs should fix C89 compile --- kexmlkem768x25519.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/kexmlkem768x25519.c b/kexmlkem768x25519.c index 1a5d16c41c97..e2c2c0a86e43 100644 --- a/kexmlkem768x25519.c +++ b/kexmlkem768x25519.c @@ -25,8 +25,6 @@ #include "includes.h" -#ifdef USE_MLKEM768X25519 - #include #include @@ -45,6 +43,8 @@ #include "crypto_api.h" +#ifdef USE_MLKEM768X25519 + int kex_kem_mlkem768x25519_keypair(struct kex *kex) { @@ -237,4 +237,25 @@ kex_kem_mlkem768x25519_dec(struct kex *kex, sshbuf_free(buf); return r; } +#else /* USE_MLKEM768X25519 */ +int +kex_kem_mlkem768x25519_keypair(struct kex *kex) +{ + return SSH_ERR_SIGN_ALG_UNSUPPORTED; +} + +int +kex_kem_mlkem768x25519_enc(struct kex *kex, + const struct sshbuf *client_blob, struct sshbuf **server_blobp, + struct sshbuf **shared_secretp) +{ + return SSH_ERR_SIGN_ALG_UNSUPPORTED; +} + +int +kex_kem_mlkem768x25519_dec(struct kex *kex, + const struct sshbuf *server_blob, struct sshbuf **shared_secretp) +{ + return SSH_ERR_SIGN_ALG_UNSUPPORTED; +} #endif /* USE_MLKEM768X25519 */ From 1d6064d25fed17b184ead85ef6fddec1a2132c53 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 15 Jun 2026 01:55:44 +0000 Subject: [PATCH 109/196] upstream: fix multiple problems with testing hostkey types that are not enabled by default. 1) Add all hostkey types in the "multiple hostkeys" subtest. Previously known_hosts was accidentally clobbered, causing only the last added hostkey type to be used. 2) Explicitly enable the hostkey types under test via HostKeyAlgorithms OpenBSD-Regress-ID: 8f12d18b79b5cc8a748e187a0e95529cd85a9dcc --- regress/hostkey-agent.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/regress/hostkey-agent.sh b/regress/hostkey-agent.sh index 28dcfe17068f..0e7962e3ca94 100644 --- a/regress/hostkey-agent.sh +++ b/regress/hostkey-agent.sh @@ -1,4 +1,4 @@ -# $OpenBSD: hostkey-agent.sh,v 1.15 2024/12/04 10:51:13 dtucker Exp $ +# $OpenBSD: hostkey-agent.sh,v 1.16 2026/06/15 01:55:44 djm Exp $ # Placed in the Public Domain. tid="hostkey agent" @@ -89,13 +89,17 @@ grep -vi 'globalknownhostsfile' $OBJ/ssh_proxy.orig > $OBJ/ssh_proxy echo "UpdateHostkeys=yes" >> $OBJ/ssh_proxy echo "GlobalKnownHostsFile=none" >> $OBJ/ssh_proxy +HOSTKEYALGS="" for k in $SSH_KEYTYPES ; do verbose "Addkey type $k" echo "Hostkey $OBJ/agent-key.${k}" >> $OBJ/sshd_proxy + test -z "$HOSTKEYALGS" || HOSTKEYALGS="${HOSTKEYALGS}," + HOSTKEYALGS="${HOSTKEYALGS}${k}" ( printf 'localhost-with-alias ' ; - cat $OBJ/agent-key.$k.pub) > $OBJ/known_hosts + cat $OBJ/agent-key.$k.pub) >> $OBJ/known_hosts done +echo "HostKeyAlgorithms $HOSTKEYALGS" >> $OBJ/sshd_proxy opts="-oStrictHostKeyChecking=yes -F $OBJ/ssh_proxy" SSH_CONNECTION=`${SSH} $opts host 'echo $SSH_CONNECTION'` From f5f02aafe89971d838d7fbc6b0cf240cee4d48bc Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 15 Jun 2026 12:53:53 +1000 Subject: [PATCH 110/196] another place mldsa-ed25519 keys need deactivation --- ssh-keygen.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ssh-keygen.c b/ssh-keygen.c index f5fb4b20bc4a..981bbf93e41d 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -1019,8 +1019,10 @@ do_gen_all_hostkeys(struct passwd *pw) #endif /* OPENSSL_HAS_ECC */ #endif /* WITH_OPENSSL */ { "ed25519", "ED25519",_PATH_HOST_ED25519_KEY_FILE }, +#ifdef USE_MLDSA { "mldsa44-ed25519", "MLDSA44-ED25519", _PATH_HOST_MLDSA44_ED25519_KEY_FILE }, +#endif { NULL, NULL, NULL } }; From 860ed04158f2c6dc870ea7c98c23dcafc7772dd4 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 15 Jun 2026 06:24:20 +0000 Subject: [PATCH 111/196] upstream: avoid use of paste(1); helps portable OpenBSD-Regress-ID: ce3ad41b34af9fc16af83e4711a62231ee52a95c --- regress/agent.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/regress/agent.sh b/regress/agent.sh index 8a008d2e1326..61a280640135 100644 --- a/regress/agent.sh +++ b/regress/agent.sh @@ -1,4 +1,4 @@ -# $OpenBSD: agent.sh,v 1.24 2026/06/14 04:08:05 djm Exp $ +# $OpenBSD: agent.sh,v 1.25 2026/06/15 06:24:20 djm Exp $ # Placed in the Public Domain. tid="simple agent test" @@ -150,7 +150,7 @@ for t in ${SSH_KEYTYPES}; do trace "connect via agent using $t key" # Accept both keys and certs. BASE=`echo $t | cut -d '@' -f1` - ACCEPT=`$SSH -Q key | grep "^$BASE" | paste -sd , -` + ACCEPT=`$SSH -Q key | grep "^$BASE" | xargs echo | sed 's/ /,/g'` grep -vi PubkeyAcceptedAlgorithms $OBJ/sshd_proxy.bak > $OBJ/sshd_proxy echo "PubkeyAcceptedAlgorithms=+$ACCEPT" >> $OBJ/sshd_proxy grep -vi PubkeyAcceptedAlgorithms $OBJ/ssh_proxy.bak > $OBJ/ssh_proxy From f433c09931665b1139dc9ef0951d3540242e4a38 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 15 Jun 2026 06:36:52 +0000 Subject: [PATCH 112/196] upstream: use different strategy to check whether keys are present or absent in the agent; helps some -portable tests on platforms that have stupid grep(1) OpenBSD-Regress-ID: 0cee7ecc437eee7471dc6ccc3b3a0c2b60c1ad2d --- regress/agent.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/regress/agent.sh b/regress/agent.sh index 61a280640135..bdd08c6bb4f6 100644 --- a/regress/agent.sh +++ b/regress/agent.sh @@ -1,4 +1,4 @@ -# $OpenBSD: agent.sh,v 1.25 2026/06/15 06:24:20 djm Exp $ +# $OpenBSD: agent.sh,v 1.26 2026/06/15 06:36:52 djm Exp $ # Placed in the Public Domain. tid="simple agent test" @@ -215,13 +215,13 @@ if [ $r -ne 0 ]; then fi check_key_absent() { - ${SSHADD} -L | grep "^$1 " >/dev/null + ${SSHADD} -L | sed s/' .*//' | grep "^$1\$" #>/dev/null if [ $? -eq 0 ]; then fail "$1 key unexpectedly present" fi } check_key_present() { - ${SSHADD} -L | grep "^$1 " >/dev/null + ${SSHADD} -L | sed s/' .*//' | grep "^$1\$" >/dev/null if [ $? -ne 0 ]; then fail "$1 key missing from agent" fi From 61ca39c119108e95f94e3d914aa6fd79d99e288d Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 16 Jun 2026 18:16:32 +1000 Subject: [PATCH 113/196] Remove check for OpenSSL w/out AES192/256. This was the case for some old Solaris versions, but the support for it has long been removed from our compat layer so there's no point checking for it. --- configure.ac | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/configure.ac b/configure.ac index cba44faf2b15..5eed06b181a0 100644 --- a/configure.ac +++ b/configure.ac @@ -3265,26 +3265,6 @@ if test "x$openssl" = "xyes" ; then ]) fi - # Check for OpenSSL without EVP_aes_{192,256}_cbc - AC_MSG_CHECKING([whether OpenSSL lacks support for AES 192/256]) - AC_LINK_IFELSE( - [AC_LANG_PROGRAM([[ - #include - #include - #include - ]], [[ - exit(EVP_aes_192_cbc() == NULL || EVP_aes_256_cbc() == NULL); - ]])], - [ - AC_MSG_RESULT([no]) - ], - [ - AC_MSG_RESULT([yes]) - AC_DEFINE([OPENSSL_LOBOTOMISED_AES], [1], - [libcrypto is missing AES 192 and 256 bit functions]) - ] - ) - AC_MSG_CHECKING([if EVP_DigestUpdate returns an int]) AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ From 3de49e0d281ac7efb766f06eb2942ae147f64bbb Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Tue, 16 Jun 2026 08:15:35 +0000 Subject: [PATCH 114/196] upstream: Include stdlib.h for malloc/free and sort headers. OpenBSD-Regress-ID: 4f5f427b131f5d6b32ed107b9bef098153f768ce --- regress/unittests/crypto/tests.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/regress/unittests/crypto/tests.c b/regress/unittests/crypto/tests.c index 9caff06c1ae0..9804dd326b25 100644 --- a/regress/unittests/crypto/tests.c +++ b/regress/unittests/crypto/tests.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tests.c,v 1.1 2026/06/14 04:08:06 djm Exp $ */ +/* $OpenBSD: tests.c,v 1.2 2026/06/16 08:15:35 dtucker Exp $ */ /* * Regress test for crypto ergonomic API * @@ -7,8 +7,9 @@ #include "includes.h" -#include #include +#include +#include #include "../test_helper/test_helper.h" #include "sshbuf.h" From 60978ddb08701d409c8236765caab10d1acded1b Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Tue, 16 Jun 2026 09:00:47 +0000 Subject: [PATCH 115/196] upstream: Include stdarg.h for va_list (needed for xmalloc.h). OpenBSD-Regress-ID: 34a6d5db48eec77f92f868093dfa0bfc10ae4622 --- regress/unittests/crypto/test_ed25519.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/regress/unittests/crypto/test_ed25519.c b/regress/unittests/crypto/test_ed25519.c index cc9ea3b86a07..3f6a8196c5f8 100644 --- a/regress/unittests/crypto/test_ed25519.c +++ b/regress/unittests/crypto/test_ed25519.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_ed25519.c,v 1.1 2026/06/14 04:08:05 djm Exp $ */ +/* $OpenBSD: test_ed25519.c,v 1.2 2026/06/16 09:00:47 dtucker Exp $ */ /* * Regress test for Ed25519 keypair from seed * @@ -8,6 +8,7 @@ #include "includes.h" #include +#include #include #include #include From b9d134a0b16a1810e9bbfac5bc687f5dbc75e7fa Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Tue, 16 Jun 2026 10:58:42 +0000 Subject: [PATCH 116/196] upstream: Use awk instead of cut to help -portable. Some platforms have size limits on cut. OpenBSD-Regress-ID: fe871e8ed43fd92efb0df76f61c5cc9c5429ea82 --- regress/sshsig.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/regress/sshsig.sh b/regress/sshsig.sh index fe0958ad27bc..695070acbac0 100644 --- a/regress/sshsig.sh +++ b/regress/sshsig.sh @@ -1,4 +1,4 @@ -# $OpenBSD: sshsig.sh,v 1.16 2025/09/11 07:23:32 djm Exp $ +# $OpenBSD: sshsig.sh,v 1.17 2026/06/16 10:58:42 dtucker Exp $ # Placed in the Public Domain. tid="sshsig" @@ -86,10 +86,10 @@ for t in $SIGNKEYS; do cat $pubkey) > $OBJ/allowed_signers ${SSHKEYGEN} -q -Y verify -s $sigfile -n $sig_namespace \ -I $sig_principal -f $OBJ/allowed_signers \ - -O print-pubkey \ - < $DATA | cut -d' ' -f1-2 > ${OBJ}/${keybase}-fromsig.pub || \ + -O print-pubkey < $DATA | \ + awk '{print $1" "$2}' >${OBJ}/${keybase}-fromsig.pub || \ fail "failed signature for $t key w/ print-pubkey" - cut -d' ' -f1-2 ${OBJ}/${keybase}.pub > ${OBJ}/${keybase}-strip.pub + awk '{print $1" "$2}' ${OBJ}/${keybase}.pub >${OBJ}/${keybase}-strip.pub diff -r ${OBJ}/${keybase}-strip.pub ${OBJ}/${keybase}-fromsig.pub || \ fail "print-pubkey differs from signature key" From 0d156d385e1e9c31bd5fb3652cf620a1f51c9b19 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Tue, 16 Jun 2026 22:27:10 +0000 Subject: [PATCH 117/196] upstream: Factor out hex2bin into a shared helper function. Replace sscanf %hhx (which is C99) with plain %x for better compatibility in -portable. ok djm@ OpenBSD-Regress-ID: 4d30bb27ffdf2154f1a9f2317df18d256717b300 --- regress/unittests/crypto/test_ed25519.c | 10 +--------- regress/unittests/crypto/test_mldsa.c | 10 +--------- regress/unittests/crypto/test_mlkem.c | 10 +--------- regress/unittests/test_helper/test_helper.c | 16 +++++++++++++++- regress/unittests/test_helper/test_helper.h | 4 +++- 5 files changed, 21 insertions(+), 29 deletions(-) diff --git a/regress/unittests/crypto/test_ed25519.c b/regress/unittests/crypto/test_ed25519.c index 3f6a8196c5f8..14d12383215b 100644 --- a/regress/unittests/crypto/test_ed25519.c +++ b/regress/unittests/crypto/test_ed25519.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_ed25519.c,v 1.2 2026/06/16 09:00:47 dtucker Exp $ */ +/* $OpenBSD: test_ed25519.c,v 1.3 2026/06/16 22:27:10 dtucker Exp $ */ /* * Regress test for Ed25519 keypair from seed * @@ -63,14 +63,6 @@ static const struct ed25519_kat ed25519_kats[] = { void ed25519_tests(void); -static void -hex2bin(uint8_t *bin, const char *hex, size_t len) -{ - size_t i; - for (i = 0; i < len; i++) - sscanf(hex + i * 2, "%02hhx", &bin[i]); -} - void ed25519_tests(void) { diff --git a/regress/unittests/crypto/test_mldsa.c b/regress/unittests/crypto/test_mldsa.c index d845c49d4289..4cbe8d5f896e 100644 --- a/regress/unittests/crypto/test_mldsa.c +++ b/regress/unittests/crypto/test_mldsa.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_mldsa.c,v 1.1 2026/06/14 04:08:06 djm Exp $ */ +/* $OpenBSD: test_mldsa.c,v 1.3 2026/06/16 22:27:10 dtucker Exp $ */ /* * Regress test for ML-DSA * @@ -82,14 +82,6 @@ free_kats(struct kat **kats, size_t nkats) free(kats); } -static void -hex2bin(uint8_t *bin, const char *hex, size_t len) -{ - size_t i; - for (i = 0; i < len; i++) - sscanf(hex + i * 2, "%02hhx", &bin[i]); -} - void mldsa_tests(void) { diff --git a/regress/unittests/crypto/test_mlkem.c b/regress/unittests/crypto/test_mlkem.c index 5d1b421f7886..e9c41dc4f0a3 100644 --- a/regress/unittests/crypto/test_mlkem.c +++ b/regress/unittests/crypto/test_mlkem.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_mlkem.c,v 1.1 2026/06/14 04:08:06 djm Exp $ */ +/* $OpenBSD: test_mlkem.c,v 1.2 2026/06/16 22:27:10 dtucker Exp $ */ /* * Regress test for ML-KEM * @@ -112,14 +112,6 @@ static const struct mlkem768_kat mlkem768_kats[] = { void mlkem_tests(void); -static void -hex2bin(uint8_t *bin, const char *hex, size_t len) -{ - size_t i; - for (i = 0; i < len; i++) - sscanf(hex + i * 2, "%02hhx", &bin[i]); -} - void mlkem_tests(void) { diff --git a/regress/unittests/test_helper/test_helper.c b/regress/unittests/test_helper/test_helper.c index 525a82b1ff87..f734b8f484da 100644 --- a/regress/unittests/test_helper/test_helper.c +++ b/regress/unittests/test_helper/test_helper.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_helper.c,v 1.16 2026/03/06 06:57:33 dtucker Exp $ */ +/* $OpenBSD: test_helper.c,v 1.17 2026/06/16 22:27:10 dtucker Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -662,6 +662,20 @@ tstod(const struct timespec *ts) return (double)ts->tv_sec + ((double)ts->tv_nsec / 1000000000.0); } +void +hex2bin(uint8_t *bin, const char *hex, size_t len) +{ + size_t i; + unsigned int v; + + /* Don't use %hhx since it's C99 and older platforms don't have it. */ + for (i = 0; i < len; i++) { + sscanf(hex + i * 2, "%02x", &v); + ASSERT_U_INT_LE(v, 256); + bin[i] = (uint8_t)v; + } +} + void bench_start(const char *file, int line, const char *name) { diff --git a/regress/unittests/test_helper/test_helper.h b/regress/unittests/test_helper/test_helper.h index 91fdca435347..9cfc415539d4 100644 --- a/regress/unittests/test_helper/test_helper.h +++ b/regress/unittests/test_helper/test_helper.h @@ -1,4 +1,4 @@ -/* $OpenBSD: test_helper.h,v 1.12 2026/03/06 06:57:33 dtucker Exp $ */ +/* $OpenBSD: test_helper.h,v 1.13 2026/06/16 22:27:10 dtucker Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -39,6 +39,8 @@ typedef void (test_onerror_func_t)(void *); void tests(void); void benchmarks(void); +void hex2bin(uint8_t *, const char *, size_t); + const char *test_data_file(const char *name); void test_start(const char *n); void test_info(char *s, size_t len); From 983096a7b27eaf789b5ceb321867d4511ba779c3 Mon Sep 17 00:00:00 2001 From: El Mehdi Abenhazou Date: Wed, 3 Jun 2026 02:02:30 +0100 Subject: [PATCH 118/196] ci: pin GitHub Actions to full commit SHAs Pinning actions/checkout, actions/upload-artifact, and cygwin/cygwin-install-action to their full commit SHA instead of mutable branch/tag references (main, master). Using mutable refs means a compromised or malicious update to the action repository could silently alter the workflow behavior. Pinning to SHA makes the exact version immutable and auditable. Signed-off-by: El Mehdi Abenhazou --- .github/workflows/c-cpp.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 9d293d7bb0ea..4ddaf0fc1f78 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -134,10 +134,10 @@ jobs: - name: install cygwin id: cygwin_install if: ${{ startsWith(matrix.target, 'windows') }} - uses: cygwin/cygwin-install-action@master + uses: cygwin/cygwin-install-action@4ef15ca7fd18a18f1000989fcfd968e06d146ce8 # master env: CYGWIN: "winsymlinks:native" - - uses: actions/checkout@main + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # main - name: setup CI system run: | sh -c "timeout 1200 .github/setup_ci.sh ${{ matrix.config }} ${{ matrix.target }} || .github/setup_ci.sh ${{ matrix.config }} ${{ matrix.target }}" @@ -148,7 +148,7 @@ jobs: - name: configure run: sh ./.github/configure.sh ${{ matrix.config }} - name: save config - uses: actions/upload-artifact@main + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main with: name: ${{ matrix.target }}-${{ matrix.config }}-config path: config.h @@ -176,7 +176,7 @@ jobs: run: sh -c "for i in regress/failed*.log; do echo ====; echo logfile $i; echo =====; cat $i; done" - name: save logs if: failure() - uses: actions/upload-artifact@main + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main with: name: ${{ matrix.target }}-${{ matrix.config }}-logs path: | From faa646a9bf6c8d0ec2d8a52dcd155979c8f7eb8e Mon Sep 17 00:00:00 2001 From: El Mehdi Abenhazou Date: Wed, 3 Jun 2026 02:02:31 +0100 Subject: [PATCH 119/196] ci: pin upstream.yml actions to full commit SHAs Signed-off-by: El Mehdi Abenhazou --- .github/workflows/upstream.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index a190a490ecbb..8675732513de 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -36,7 +36,7 @@ jobs: - name: shutdown VM if running run: vmshutdown working-directory: ${{ runner.temp }} - - uses: actions/checkout@main + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # main - name: startup VM run: vmstartup working-directory: ${{ runner.temp }} @@ -63,7 +63,7 @@ jobs: run: vmrun 'for i in /usr/src/regress/usr.bin/ssh/obj/*.log; do echo ====; echo logfile $i; echo =====; cat $i; done' - name: save logs if: failure() - uses: actions/upload-artifact@main + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main with: name: ${{ matrix.target }}-${{ matrix.config }}-logs path: | From 01404fa5da11ed08c6ebecd09aaa3ebfbd79f206 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 22 Jun 2026 19:00:15 +1000 Subject: [PATCH 120/196] Add script to lookup and pin Actions to hashes. Update recently changed Cygwin Actions and pin remaining unpinned ones. --- .github/pin_actions.sh | 33 ++++++++++++++++++++++++++++++++ .github/workflows/c-cpp.yml | 4 ++-- .github/workflows/cifuzz.yml | 6 +++--- .github/workflows/selfhosted.yml | 8 ++++---- .github/workflows/upstream.yml | 2 +- .github/workflows/vm.yml | 32 +++++++++++++++---------------- 6 files changed, 59 insertions(+), 26 deletions(-) create mode 100755 .github/pin_actions.sh diff --git a/.github/pin_actions.sh b/.github/pin_actions.sh new file mode 100755 index 000000000000..cb175f25059f --- /dev/null +++ b/.github/pin_actions.sh @@ -0,0 +1,33 @@ +#!/bin/sh +# +# Look up specified version of Github Actions an pin to that specific +# revision. +# + +set -e + +github=https://github.com + +for workflow in workflows/*.yml; do + echo workflow: $workflow + sed 's/ - / /' ${workflow} | grep -v '^#' | awk '/uses:/ {print}' | \ + while read line; do + action_ver=$(awk '{print $2}' <<<${line}) + action=$(cut -f1 -d@ <<<${action_ver}) + ver=$(cut -f2 -d@ <<<${action_ver}) + intendedver=$(awk '{print $4}' <<<${line}) + if [ -z "${intendedver}" ]; then + intendedver=${ver} + fi + case "${action}" in + google/oss-fuzz/*) actiondir=google/oss-fuzz ;; + *) actiondir="${action}" ;; + esac + if [ ! -d /tmp/${actiondir} ]; then + git clone ${github}/${actiondir} /tmp/${actiondir} + fi + hash=$(cd /tmp/${actiondir} && git rev-parse ${intendedver}) + sed -i -e "s|uses: ${action}@.*|uses: ${action}@${hash} # ${intendedver}|" \ + ${workflow} + done +done diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 4ddaf0fc1f78..44be98e19507 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -134,10 +134,10 @@ jobs: - name: install cygwin id: cygwin_install if: ${{ startsWith(matrix.target, 'windows') }} - uses: cygwin/cygwin-install-action@4ef15ca7fd18a18f1000989fcfd968e06d146ce8 # master + uses: cygwin/cygwin-install-action@a3d72946b163026bbd0fa9a88379ccbda4bd86bb # master env: CYGWIN: "winsymlinks:native" - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: setup CI system run: | sh -c "timeout 1200 .github/setup_ci.sh ${{ matrix.config }} ${{ matrix.target }} || .github/setup_ci.sh ${{ matrix.config }} ${{ matrix.target }}" diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index ab8b1c6e0971..286b39c12cb0 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -12,20 +12,20 @@ jobs: steps: - name: Build Fuzzers id: build - uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master + uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@b1836d5aed2e5aaae7f618ddd40bbcc477119825 # master with: oss-fuzz-project-name: 'openssh' dry-run: false language: c++ - name: Run Fuzzers - uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master + uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@b1836d5aed2e5aaae7f618ddd40bbcc477119825 # master with: oss-fuzz-project-name: 'openssh' fuzz-seconds: 600 dry-run: false language: c++ - name: Upload Crash - uses: actions/upload-artifact@main + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main if: failure() && steps.build.outcome == 'success' with: name: artifacts diff --git a/.github/workflows/selfhosted.yml b/.github/workflows/selfhosted.yml index 008fa60f8ee8..d9f38472c405 100644 --- a/.github/workflows/selfhosted.yml +++ b/.github/workflows/selfhosted.yml @@ -105,7 +105,7 @@ jobs: - name: shutdown VM if running if: env.VM == 'true' run: vmshutdown - - uses: actions/checkout@main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: autoreconf run: autoreconf - name: startup VM @@ -119,7 +119,7 @@ jobs: - name: configure run: vmrun ./.github/configure.sh ${{ matrix.config }} # - name: save config -# uses: actions/upload-artifact@main +# uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main # with: # name: ${{ matrix.target }}-${{ matrix.config }}-config # path: config.h @@ -135,7 +135,7 @@ jobs: run: vmrun 'for i in regress/failed*.log; do echo ====; echo logfile $i; echo =====; cat $i; done' - name: save logs if: failure() - uses: actions/upload-artifact@main + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main with: name: ${{ matrix.target }}-${{ matrix.config }}-logs path: | @@ -184,7 +184,7 @@ jobs: - name: bigendian interop - save logs if: failure() && env.BIGENDIAN == 'true' - uses: actions/upload-artifact@main + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main with: name: ${{ matrix.target }}-${{ matrix.config }}-interop-logs path: | diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index 8675732513de..74a0bc8baeb9 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -36,7 +36,7 @@ jobs: - name: shutdown VM if running run: vmshutdown working-directory: ${{ runner.temp }} - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: startup VM run: vmstartup working-directory: ${{ runner.temp }} diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index 2aaab098060b..0235285714c6 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -23,12 +23,12 @@ jobs: config: [default] runs-on: ubuntu-latest steps: - - uses: actions/checkout@main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: autoreconf run: sh -c autoreconf - name: start DragonFlyBSD ${{ matrix.target }} VM - uses: vmactions/dragonflybsd-vm@v1 + uses: vmactions/dragonflybsd-vm@4ba8127bd95c94b66fc4b885e37c99955ba308ea # v1 with: release: ${{ matrix.target }} usesh: true @@ -86,12 +86,12 @@ jobs: config: [default] runs-on: ubuntu-latest steps: - - uses: actions/checkout@main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: autoreconf run: sh -c autoreconf - name: start FreeBSD ${{ matrix.target }} VM - uses: vmactions/freebsd-vm@v1 + uses: vmactions/freebsd-vm@b84ab5559b5a1bb4b8ee2737d2506a16e1737636 # v1 with: release: ${{ matrix.target }} usesh: true @@ -168,12 +168,12 @@ jobs: config: [default] runs-on: ubuntu-latest steps: - - uses: actions/checkout@main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: autoreconf run: sh -c autoreconf - name: start NetBSD ${{ matrix.target }} VM - uses: vmactions/netbsd-vm@v1 + uses: vmactions/netbsd-vm@99816dccf75edf233ed6cd00a159e3a5b85ea373 # v1 with: release: ${{ matrix.target }} usesh: true @@ -243,12 +243,12 @@ jobs: config: [default] runs-on: ubuntu-latest steps: - - uses: actions/checkout@main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: autoreconf run: sh -c autoreconf - name: start OmniOS ${{ matrix.target }} VM - uses: vmactions/omnios-vm@v1 + uses: vmactions/omnios-vm@7f2be0b927aad1a78498c8aeeac4c4ce1fabd322 # v1 with: release: ${{ matrix.target }} usesh: true @@ -300,12 +300,12 @@ jobs: config: [default] runs-on: ubuntu-latest steps: - - uses: actions/checkout@main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: autoreconf run: sh -c autoreconf - name: start OpenBSD ${{ matrix.target }} VM - uses: vmactions/openbsd-vm@v1 + uses: vmactions/openbsd-vm@18edb32f4e48dae5865d7b8b3a9587bc01218a20 # v1 with: release: ${{ matrix.target }} usesh: true @@ -349,7 +349,7 @@ jobs: runs-on: ubuntu-latest steps: - name: start OpenBSD VM - uses: vmactions/openbsd-vm@v1 + uses: vmactions/openbsd-vm@18edb32f4e48dae5865d7b8b3a9587bc01218a20 # v1 with: copyback: false nat: | @@ -371,7 +371,7 @@ jobs: echo "SNAPSHOT_VERSION=${ver}" >> $GITHUB_ENV - name: check for cached sysupgrade id: cache-sysupgrade - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 with: key: openbsd-sysupgrade ${{ env.SNAPSHOT_VERSION }} path: /tmp/_sysupgrade/ @@ -391,7 +391,7 @@ jobs: rsync -av openbsd:/home/_sysupgrade/ /tmp/_sysupgrade/ - name: save sysupgrade to cache if: steps.cache-sysupgrade.outputs.cache-hit != 'true' - uses: actions/cache/save@v4 + uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 with: key: openbsd-sysupgrade ${{ env.SNAPSHOT_VERSION }} path: /tmp/_sysupgrade/ @@ -431,7 +431,7 @@ jobs: for i in regress-logs/failed*.log; do echo ===; echo LOGFILE: $i; echo ===; cat $i; echo; done - name: save logs if: failure() - uses: actions/upload-artifact@main + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main with: name: openbsd-current-upstream-logs path: regress-logs/*.log @@ -449,12 +449,12 @@ jobs: config: [default] runs-on: ubuntu-latest steps: - - uses: actions/checkout@main + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: autoreconf run: sh -c autoreconf - name: start Solaris ${{ matrix.target }} VM - uses: vmactions/solaris-vm@v1 + uses: vmactions/solaris-vm@d30dd6c228c8661ade859e36ead7660b9a62efcc # v1 with: release: ${{ matrix.target }} usesh: true From 10715f25c40f5f7c670c341fadc52fbe1935db08 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 22 Jun 2026 21:28:58 +1000 Subject: [PATCH 121/196] Output Actions allowlist for uploading to Github. --- .github/pin_actions.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/pin_actions.sh b/.github/pin_actions.sh index cb175f25059f..8b64e823827e 100755 --- a/.github/pin_actions.sh +++ b/.github/pin_actions.sh @@ -9,7 +9,6 @@ set -e github=https://github.com for workflow in workflows/*.yml; do - echo workflow: $workflow sed 's/ - / /' ${workflow} | grep -v '^#' | awk '/uses:/ {print}' | \ while read line; do action_ver=$(awk '{print $2}' <<<${line}) @@ -31,3 +30,6 @@ for workflow in workflows/*.yml; do ${workflow} done done + +# Output actions for allowlist. +awk 'BEGIN{IFS=":"} /^ +uses:.*@/{print $2","}' workflows/*.yml | sort -u From 0d08d384a6783d3f3bc5a01d10015f527e0792ba Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 19 Jun 2026 05:26:04 +0000 Subject: [PATCH 122/196] upstream: remove cipher_set_keyiv() as nothing uses it from Loganaden Velvindron OpenBSD-Commit-ID: 2a6636388028e6f7aa6837d6484a369f3d9c0818 --- cipher.c | 32 +------------------------------- cipher.h | 3 +-- 2 files changed, 2 insertions(+), 33 deletions(-) diff --git a/cipher.c b/cipher.c index f3e8fd55350f..0697e559b117 100644 --- a/cipher.c +++ b/cipher.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cipher.c,v 1.128 2026/05/31 04:37:56 djm Exp $ */ +/* $OpenBSD: cipher.c,v 1.129 2026/06/19 05:26:04 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -471,33 +471,3 @@ cipher_get_keyiv(struct sshcipher_ctx *cc, u_char *iv, size_t len) #endif return 0; } - -int -cipher_set_keyiv(struct sshcipher_ctx *cc, const u_char *iv, size_t len) -{ -#ifdef WITH_OPENSSL - const struct sshcipher *c = cc->cipher; - int evplen = 0; -#endif - - if ((cc->cipher->flags & CFLAG_CHACHAPOLY) != 0) - return 0; - if ((cc->cipher->flags & CFLAG_NONE) != 0) - return 0; - -#ifdef WITH_OPENSSL - evplen = EVP_CIPHER_CTX_iv_length(cc->evp); - if (evplen <= 0) - return SSH_ERR_LIBCRYPTO_ERROR; - if ((size_t)evplen != len) - return SSH_ERR_INVALID_ARGUMENT; - if (cipher_authlen(c)) { - /* XXX iv arg is const, but EVP_CIPHER_CTX_ctrl isn't */ - if (EVP_CIPHER_CTX_ctrl(cc->evp, - EVP_CTRL_GCM_SET_IV_FIXED, -1, (void *)iv) <= 0) - return SSH_ERR_LIBCRYPTO_ERROR; - } else if (!EVP_CIPHER_CTX_set_iv(cc->evp, iv, evplen)) - return SSH_ERR_LIBCRYPTO_ERROR; -#endif - return 0; -} diff --git a/cipher.h b/cipher.h index 061a26b20015..32abdde22cc5 100644 --- a/cipher.h +++ b/cipher.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cipher.h,v 1.57 2026/05/31 04:37:56 djm Exp $ */ +/* $OpenBSD: cipher.h,v 1.58 2026/06/19 05:26:04 djm Exp $ */ /* * Author: Tatu Ylonen @@ -73,6 +73,5 @@ u_int cipher_is_internal(const struct sshcipher *); u_int cipher_ctx_is_plaintext(struct sshcipher_ctx *); int cipher_get_keyiv(struct sshcipher_ctx *, u_char *, size_t); -int cipher_set_keyiv(struct sshcipher_ctx *, const u_char *, size_t); #endif /* CIPHER_H */ From b88165a06c8e195f267909de002450245e60002e Mon Sep 17 00:00:00 2001 From: "tb@openbsd.org" Date: Sun, 21 Jun 2026 19:23:56 +0000 Subject: [PATCH 123/196] upstream: annotate tm_wday = -1 with /* sentinel for error */ per timegm(3) manpage suggested by deraadt OpenBSD-Commit-ID: 2fa92f0b826f0ab9e5d1cb0b2243b8e2f80951b2 --- misc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/misc.c b/misc.c index d9fd49dfa0be..517fa7a9722f 100644 --- a/misc.c +++ b/misc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: misc.c,v 1.214 2026/05/27 13:54:15 tb Exp $ */ +/* $OpenBSD: misc.c,v 1.215 2026/06/21 19:23:56 tb Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2005-2020 Damien Miller. All rights reserved. @@ -2588,11 +2588,11 @@ parse_absolute_time(const char *s, uint64_t *tp) if ((cp = strptime(buf, fmt, &tm)) == NULL || *cp != '\0') return SSH_ERR_INVALID_FORMAT; if (is_utc) { - tm.tm_wday = -1; + tm.tm_wday = -1; /* sentinel for error */ if ((tt = timegm(&tm)) == -1 && tm.tm_wday == -1) return SSH_ERR_INVALID_FORMAT; } else { - tm.tm_wday = -1; + tm.tm_wday = -1; /* sentinel for error */ if ((tt = mktime(&tm)) == -1 && tm.tm_wday == -1) return SSH_ERR_INVALID_FORMAT; } From e683097d90e4698893c86a6f61c8c994b68cbcc6 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Mon, 22 Jun 2026 12:08:33 +0000 Subject: [PATCH 124/196] upstream: Check return value of sscanf. OpenBSD-Regress-ID: e06a8c769541b1aa7d663cc8859ddabd93847e81 --- regress/unittests/test_helper/test_helper.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/regress/unittests/test_helper/test_helper.c b/regress/unittests/test_helper/test_helper.c index f734b8f484da..450b045958da 100644 --- a/regress/unittests/test_helper/test_helper.c +++ b/regress/unittests/test_helper/test_helper.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_helper.c,v 1.17 2026/06/16 22:27:10 dtucker Exp $ */ +/* $OpenBSD: test_helper.c,v 1.18 2026/06/22 12:08:33 dtucker Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -670,7 +670,7 @@ hex2bin(uint8_t *bin, const char *hex, size_t len) /* Don't use %hhx since it's C99 and older platforms don't have it. */ for (i = 0; i < len; i++) { - sscanf(hex + i * 2, "%02x", &v); + ASSERT_INT_EQ(sscanf(hex + i * 2, "%02x", &v), 1); ASSERT_U_INT_LE(v, 256); bin[i] = (uint8_t)v; } From 512bfedf61129788d680210081e89843858dde85 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Mon, 22 Jun 2026 12:28:48 +0000 Subject: [PATCH 125/196] upstream: Check return values from malloc. OpenBSD-Regress-ID: 28c8ab94a4fa5d047cec9c865b10bbf3c9ccf6d1 --- regress/unittests/crypto/test_ed25519.c | 6 +++--- regress/unittests/crypto/test_mldsa.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/regress/unittests/crypto/test_ed25519.c b/regress/unittests/crypto/test_ed25519.c index 14d12383215b..94a482ff29cc 100644 --- a/regress/unittests/crypto/test_ed25519.c +++ b/regress/unittests/crypto/test_ed25519.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_ed25519.c,v 1.3 2026/06/16 22:27:10 dtucker Exp $ */ +/* $OpenBSD: test_ed25519.c,v 1.4 2026/06/22 12:28:48 dtucker Exp $ */ /* * Regress test for Ed25519 keypair from seed * @@ -82,8 +82,8 @@ ed25519_tests(void) TEST_START("Ed25519 sign/verify KAT"); msglen = strlen(ed25519_kats[i].msg) / 2; - msg = malloc(msglen + 64); - tmp = malloc(msglen + 64); + ASSERT_PTR_NE(msg = malloc(msglen + 64), NULL); + ASSERT_PTR_NE(tmp = malloc(msglen + 64), NULL); hex2bin(msg + 64, ed25519_kats[i].msg, msglen); hex2bin(expected_sig, ed25519_kats[i].sig, 64); diff --git a/regress/unittests/crypto/test_mldsa.c b/regress/unittests/crypto/test_mldsa.c index 4cbe8d5f896e..5bbf1c43b9b1 100644 --- a/regress/unittests/crypto/test_mldsa.c +++ b/regress/unittests/crypto/test_mldsa.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_mldsa.c,v 1.3 2026/06/16 22:27:10 dtucker Exp $ */ +/* $OpenBSD: test_mldsa.c,v 1.4 2026/06/22 12:28:48 dtucker Exp $ */ /* * Regress test for ML-DSA * @@ -117,7 +117,7 @@ mldsa_tests(void) ASSERT_MEM_EQ(sk_hash, expected_sk_hash, 32); msglen = strlen(kat->msg) / 2; - msg = malloc(msglen); + ASSERT_PTR_NE(msg = malloc(msglen), NULL); hex2bin(msg, kat->msg, msglen); hex2bin(rand, kat->rand, 32); hex2bin(expected_sig_hash, kat->sig_hash, 32); From 5dac5a9252074fb39da617ffc123830266614a4c Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Wed, 24 Jun 2026 12:19:53 +1000 Subject: [PATCH 126/196] Set build options in /etc/mk.conf once at startup. --- .github/workflows/upstream.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index 74a0bc8baeb9..8a105ce6844f 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -45,16 +45,24 @@ jobs: working-directory: ${{ runner.temp }} - name: update source run: vmrun "cd /usr/src && if [ -d .git ]; then git pull && git log -n1; else cvs -q up -dPA usr.bin/ssh regress/usr.bin/ssh usr.bin/nc; fi" + - name: set build options in /etc/mk.conf + run: | + case ${{ matrix.config }} in \ + without-openssl) o='OPENSSL=no' ;; \ + kerberos5) o='KERBEROS5=yes' ;; \ + ubsan) o='DEBUG=-fsanitize-minimal-runtime -fsanitize=undefined';; \ + esac + vmrun "echo $o | sudo tee -a /etc/mk.conf" - name: update netcat run: vmrun "cd /usr/src/usr.bin/nc && make clean all && sudo make install" - name: make clean - run: vmrun "cd /usr/src/usr.bin/ssh && make obj && make clean && cd /usr/src/regress/usr.bin/ssh && make obj && make clean && sudo chmod -R g-w /usr/src /usr/obj" + run: vmrun "make -C /usr/src/usr.bin/ssh obj clean && make -C /usr/src/regress/usr.bin/ssh obj clean && sudo chmod -R g-w /usr/src /usr/obj" - name: make - run: vmrun "cd /usr/src/usr.bin/ssh && case ${{ matrix.config }} in without-openssl) make OPENSSL=no;; kerberos5) make KERBEROS5=yes;; ubsan) make DEBUG='-fsanitize-minimal-runtime -fsanitize=undefined';; *) make; esac" + run: vmrun " make -C /usr/src/usr.bin/ssh" - name: make install - run: vmrun "cd /usr/src/usr.bin/ssh && sudo make install && sudo /etc/rc.d/sshd -f restart" + run: vmrun "sudo make -C /usr/src/usr.bin/ssh install && sudo /etc/rc.d/sshd -f restart" - name: make tests` - run: vmrun "cd /usr/src/regress/usr.bin/ssh && case ${{ matrix.config }} in without-openssl) make OPENSSL=no;; ubsan) make DEBUG='-fsanitize-minimal-runtime -fsanitize=undefined';; *) make; esac" + run: vmrun "cd /usr/src/regress/usr.bin/ssh && case ${{ matrix.config }} in without-openssl) make OPENSSL=no;; *) make;; esac" env: SUDO: sudo timeout-minutes: 300 From 162cb8721ca0fdb71aaf00688ac7d59a81fc8d5f Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 24 Jun 2026 06:53:11 +0000 Subject: [PATCH 127/196] upstream: add a missing channels type for bulk/interactive classification bz3972; ok dtucker@ OpenBSD-Commit-ID: 9c9442ea14be74877e2c876b1fe9fa20d158dd97 --- channels.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/channels.h b/channels.h index 2ce972b2a66a..f690964985c8 100644 --- a/channels.h +++ b/channels.h @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.h,v 1.166 2026/05/05 06:21:14 djm Exp $ */ +/* $OpenBSD: channels.h,v 1.167 2026/06/24 06:53:11 djm Exp $ */ /* * Author: Tatu Ylonen @@ -85,7 +85,7 @@ /* default pattern-lists used to classify channel types as bulk */ #define CHANNEL_BULK_TTY "" #define CHANNEL_BULK_NOTTY "direct-*,forwarded-*,dynamic-*," \ - "tun-*,x11-*,session*" + "tun-*,x11-*,session*,stdio-forward" struct ssh; struct Channel; From 87e21b16d033700819a1381b9a2bfa2f8b3a217d Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 24 Jun 2026 06:53:57 +0000 Subject: [PATCH 128/196] upstream: add some logging to make debugging interactive/bulk classification mistakes easier next time (though I think we've got them all now, really) OpenBSD-Commit-ID: 5fe3dd4e76ffba787a423e301095d55cf5b0f0dc --- channels.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/channels.c b/channels.c index 237ab56395d8..5d0b8ca52a47 100644 --- a/channels.c +++ b/channels.c @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.461 2026/06/01 05:40:13 djm Exp $ */ +/* $OpenBSD: channels.c,v 1.462 2026/06/24 06:53:57 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -359,10 +359,14 @@ channel_classify(struct ssh *ssh, Channel *c) { struct ssh_channels *sc = ssh->chanctxt; const char *type = c->xctype == NULL ? c->ctype : c->xctype; - const char *classifier = (c->isatty || c->remote_has_tty) ? + const int has_tty = c->isatty || c->remote_has_tty; + const char *classifier = has_tty ? sc->bulk_classifier_tty : sc->bulk_classifier_notty; c->bulk = type != NULL && match_pattern_list(type, classifier, 0) == 1; + debug3("channel %d: classify type \"%s\" (%s) as %s", c->self, + type, has_tty ? "with TTY" : "no TTY", + c->bulk ? "bulk" : "interactive"); } /* From 8058c5bdb507591b79ec926221fbe6fcc296d432 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 24 Jun 2026 06:55:12 +0000 Subject: [PATCH 129/196] upstream: mention a caveat regarding GSSAPIStrictAcceptorCheck in some environments OpenBSD-Commit-ID: aa7158d8f22cb34063c1c2d3cbcf30a9489847c2 --- sshd_config.5 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sshd_config.5 b/sshd_config.5 index 4112166ecd56..39a864dee6d7 100644 --- a/sshd_config.5 +++ b/sshd_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: sshd_config.5,v 1.398 2026/05/21 04:04:57 djm Exp $ -.Dd $Mdocdate: May 21 2026 $ +.\" $OpenBSD: sshd_config.5,v 1.399 2026/06/24 06:55:12 djm Exp $ +.Dd $Mdocdate: June 24 2026 $ .Dt SSHD_CONFIG 5 .Os .Sh NAME @@ -776,6 +776,7 @@ machine's default store. This facility is provided to assist with operation on multi homed machines. The default is .Cm yes . +This option may not be effective in Windows Active Directory environments. .It Cm HostbasedAcceptedAlgorithms Specifies the signature algorithms that will be accepted for hostbased authentication as a list of comma-separated patterns. From 110117accb95fc310a3923115e9316a9748ff6ae Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Wed, 24 Jun 2026 19:04:48 +1000 Subject: [PATCH 130/196] Set CYGWIN at top-level. The ensures the symlinks created in any step (eg, logs) are native symlinks and can be understood by the log upload step. --- .github/workflows/c-cpp.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 44be98e19507..43262407ca47 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -124,6 +124,7 @@ jobs: runs-on: ${{ matrix.target }} env: EPHEMERAL_VM: yes + CYGWIN: "winsymlinks:native" steps: - name: check RUN_ONLY_TARGET_CONFIG if: vars.RUN_ONLY_TARGET_CONFIG != '' @@ -135,8 +136,6 @@ jobs: id: cygwin_install if: ${{ startsWith(matrix.target, 'windows') }} uses: cygwin/cygwin-install-action@a3d72946b163026bbd0fa9a88379ccbda4bd86bb # master - env: - CYGWIN: "winsymlinks:native" - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - name: setup CI system run: | From a4c5d09657860cb8583e4cb176b2396fc8bdb523 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Wed, 24 Jun 2026 19:05:12 +1000 Subject: [PATCH 131/196] Make -j2 for faster builds. --- .github/workflows/c-cpp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 43262407ca47..dde7665b698f 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -154,7 +154,7 @@ jobs: - name: make clean run: make clean - name: make - run: make + run: make -j2 - name: make tests run: sh ./.github/run_test.sh ${{ matrix.config }} env: From 7c70c3d352f7e8f16ed799f03957ee87840da4e6 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Wed, 24 Jun 2026 19:22:36 +1000 Subject: [PATCH 132/196] Fix handling of rh-allow-sha1-signatures on Cygwin The format of openssl.cnf has changed, so append to it instead of trying to insert into it. Test that openssl can sign RSA with SHA1 before proceeding. --- .github/setup_ci.sh | 23 +++++++++++++++++++++-- .github/workflows/c-cpp.yml | 3 ++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index 63c61f9a0f66..99df2181eaa0 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -27,10 +27,29 @@ case "$host" in icacls regress /c /t /q /grant 'BUILTIN\Administrators:(RX)' echo "Modifiled ACLs" icacls regress + echo Enabling OpenSSL rh-allow-sha1-signatures for unit tests. cp /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf.bak - sed -i -e '/\[ default_modules \]/a alg_section = evp_properties\n[evp_properties]\nrh-allow-sha1-signatures = yes\n' /etc/pki/tls/openssl.cnf - diff -u /etc/pki/tls/openssl.cnf.bak /etc/pki/tls/openssl.cnf + cat >>/etc/pki/tls/openssl.cnf < Date: Wed, 24 Jun 2026 11:59:09 +0000 Subject: [PATCH 133/196] upstream: Avoid printf("%s", NULL) since it's not guaranteed to be safe and will segfault on some -portable platforms. OpenBSD-Commit-ID: b49d588f8becf6363305aac42d7d9660fc7fe3ba --- channels.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/channels.c b/channels.c index 5d0b8ca52a47..fcd80288f89b 100644 --- a/channels.c +++ b/channels.c @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.462 2026/06/24 06:53:57 djm Exp $ */ +/* $OpenBSD: channels.c,v 1.463 2026/06/24 11:59:09 dtucker Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -365,7 +365,7 @@ channel_classify(struct ssh *ssh, Channel *c) c->bulk = type != NULL && match_pattern_list(type, classifier, 0) == 1; debug3("channel %d: classify type \"%s\" (%s) as %s", c->self, - type, has_tty ? "with TTY" : "no TTY", + type ? type : "(null)", has_tty ? "with TTY" : "no TTY", c->bulk ? "bulk" : "interactive"); } From b0894a23a6bcb4f008d119854cb520f0b44b0973 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Wed, 24 Jun 2026 22:05:05 +1000 Subject: [PATCH 134/196] Dropbear's master is now main. --- .github/run_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/run_test.sh b/.github/run_test.sh index 7d873fe179a6..e8f24ad1803a 100755 --- a/.github/run_test.sh +++ b/.github/run_test.sh @@ -48,7 +48,7 @@ fi if [ "$1" = "dropbear-versions" ]; then make regress-binaries # Work backward from current version to last version we support. - for ver in master `cd /tmp/dropbear && git tag | grep -E 'DROPBEAR_' | sort -rn`; do + for ver in main `cd /tmp/dropbear && git tag | grep -E 'DROPBEAR_' | sort -rn`; do year=`echo "$ver" | cut -f2 -d_ | cut -f1 -d.` if [ "$ver" != "master" ] && [ "$year" -lt "2020" ]; then exit 0 From 6f74eb3c56f8dc4886d2bc5b068c5bf82cb6db74 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 25 Jun 2026 08:14:47 +1000 Subject: [PATCH 135/196] Dropbear master -> main here too. --- .github/setup_ci.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index 99df2181eaa0..038511a8cefa 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -185,7 +185,7 @@ for TARGET in $TARGETS; do PACKAGES="${PACKAGES} cmake ninja-build" ;; dropbear-versions) - INSTALL_DROPBEAR=master + INSTALL_DROPBEAR=main ;; putty-*) INSTALL_PUTTY=0.83 From 09c2eeb9c8a0f42716d67548c75a6f4870732caa Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 26 Jun 2026 06:17:13 +0000 Subject: [PATCH 136/196] upstream: mention that ssh-keyscan output is only as trustworthy as the network between it and the SSH server; ok markus@ OpenBSD-Commit-ID: 067845df7e8eb776408de5f23a2e6e7019945834 --- ssh-keyscan.1 | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/ssh-keyscan.1 b/ssh-keyscan.1 index e17957367367..7446b862fff2 100644 --- a/ssh-keyscan.1 +++ b/ssh-keyscan.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-keyscan.1,v 1.53 2025/10/04 21:41:35 naddy Exp $ +.\" $OpenBSD: ssh-keyscan.1,v 1.54 2026/06/26 06:17:13 djm Exp $ .\" .\" Copyright 1995, 1996 by David Mazieres . .\" @@ -6,7 +6,7 @@ .\" permitted provided that due credit is given to the author and the .\" OpenBSD project by leaving this copyright notice intact. .\" -.Dd $Mdocdate: October 4 2025 $ +.Dd $Mdocdate: June 26 2026 $ .Dt SSH-KEYSCAN 1 .Os .Sh NAME @@ -50,6 +50,15 @@ network range (e.g. 192.168.16/28). If a network range is specified, then all addresses in that range will be scanned. .Pp +.Nm +cannot verify the authenticity of the host keys it obtains, and an attacker +on the network with the ability to intercept traffic could substitute their +own host keys to enable impersonation of servers. +Because of this, +.Nm +output should be verified out of band, or only used directly for host +authentication if the network is trusted. +.Pp The options are as follows: .Bl -tag -width Ds .It Fl 4 From 8dec7df34b38ea510b5548a020f2664e59700d23 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 28 Jun 2026 23:31:28 +0000 Subject: [PATCH 137/196] upstream: avoid possible NULL deref; from Swival scanner OpenBSD-Commit-ID: 62ea8e12b7cddee933596e72f8ab0f7364147c0f --- sshconnect2.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sshconnect2.c b/sshconnect2.c index 5a48c73edbef..ecb4ae524ee7 100644 --- a/sshconnect2.c +++ b/sshconnect2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect2.c,v 1.386 2026/05/13 05:11:02 djm Exp $ */ +/* $OpenBSD: sshconnect2.c,v 1.387 2026/06/28 23:31:28 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2008 Damien Miller. All rights reserved. @@ -1441,7 +1441,8 @@ sign_and_send_pubkey(struct ssh *ssh, Identity *id) !fallback_sigtype) { if (sign_id->agent_fd != -1) loc = "agent "; - else if ((sign_id->key->flags & SSHKEY_FLAG_EXT) != 0) + else if (sign_id->key != NULL && + (sign_id->key->flags & SSHKEY_FLAG_EXT) != 0) loc = "token "; logit("%skey %s %s returned incorrect signature type", loc, sshkey_type(id->key), fp); From 36480181fa22f98e180b4f9e10203480c0346c78 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 28 Jun 2026 23:47:16 +0000 Subject: [PATCH 138/196] upstream: resist that return ".." via remote glob during remote/remote copies, similar to fixes for bz3871 for remote/local copies. From Swival scanner OpenBSD-Commit-ID: c0c20a1b746db55c08e53658bf21ea9405b300a5 --- scp.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scp.c b/scp.c index 621db83c02d1..28ac7a29d2a3 100644 --- a/scp.c +++ b/scp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: scp.c,v 1.274 2026/04/29 22:22:10 djm Exp $ */ +/* $OpenBSD: scp.c,v 1.275 2026/06/28 23:47:16 djm Exp $ */ /* * scp - secure remote copy. This is basically patched BSD rcp which * uses ssh to do the data transfer (instead of using rcmd). @@ -2039,6 +2039,10 @@ throughlocal_sftp(struct sftp_conn *from, struct sftp_conn *to, goto out; } + /* Special handling for source of '..' */ + if (strcmp(filename, "..") == 0) + filename = "."; /* Download to dest, not dest/.. */ + if (targetisdir) abs_dst = sftp_path_append(target, filename); else From 1b39f39657d2e58f8ec57341581a39bbf0be645b Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 01:47:21 +0000 Subject: [PATCH 139/196] upstream: avoid download to server-controlled path when performing download on the commandline. From Swival scanner OpenBSD-Commit-ID: d1b2c44305fdfe6d51eed9ecc727e59478bf311f --- sftp.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/sftp.c b/sftp.c index 0ab9206c2772..0b57e083398c 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.251 2026/05/31 04:51:45 djm Exp $ */ +/* $OpenBSD: sftp.c,v 1.252 2026/06/29 01:47:21 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -2289,13 +2289,8 @@ interactive_loop(struct sftp_conn *conn, char *file1, char *file2) return (-1); } } else { - /* XXX this is wrong wrt quoting */ - snprintf(cmd, sizeof cmd, "get%s %s%s%s", - global_aflag ? " -a" : "", dir, - file2 == NULL ? "" : " ", - file2 == NULL ? "" : file2); - err = parse_dispatch_command(conn, cmd, - &remote_path, startdir, 1, 0); + err = process_get(conn, dir, file2, remote_path, 0, 0, + global_aflag, 0); free(dir); free(startdir); free(remote_path); From c1cebbc7c69acfe5df07b4a95e4c32cebc3e105a Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 01:53:21 +0000 Subject: [PATCH 140/196] upstream: avoid situation where sftp_download() could get stuck in a loop if a broken server repeatedly returned zero length while reading a file. Identified by Swival scanner OpenBSD-Commit-ID: 53f1de5065ff01952d2abb51747c2418ce21cd96 --- sftp-client.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/sftp-client.c b/sftp-client.c index 69ef28cdc16b..1f031128e141 100644 --- a/sftp-client.c +++ b/sftp-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-client.c,v 1.185 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: sftp-client.c,v 1.186 2026/06/29 01:53:21 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -1585,7 +1585,7 @@ sftp_download(struct sftp_conn *conn, const char *remote_path, { struct sshbuf *msg; u_char *handle; - int local_fd = -1, write_error; + int local_fd = -1, write_error, seen_zerolen = 0; int read_error, write_errno, lmodified = 0, reordered = 0, r; uint64_t offset = 0, size, highwater = 0, maxack = 0; u_int mode, id, buflen, num_req, max_req, status = SSH2_FX_OK; @@ -1733,6 +1733,11 @@ sftp_download(struct sftp_conn *conn, const char *remote_path, if (len > req->len) fatal("Received more data than asked for " "%zu > %zu", len, req->len); + if (len == 0) { + if (seen_zerolen) + fatal_f("server sent zero data length"); + seen_zerolen = 1; + } lmodified = 1; if ((lseek(local_fd, req->offset, SEEK_SET) == -1 || atomicio(vwrite, local_fd, data, len) != len) && @@ -2446,7 +2451,7 @@ sftp_crossload(struct sftp_conn *from, struct sftp_conn *to, Attrib *a, int preserve_flag) { struct sshbuf *msg; - int write_error, read_error, r; + int write_error, read_error, r, seen_zerolen = 0; uint64_t offset = 0, size; u_int id, buflen, num_req, max_req, status = SSH2_FX_OK; u_int num_upload_req; @@ -2576,6 +2581,11 @@ sftp_crossload(struct sftp_conn *from, struct sftp_conn *to, if (len > req->len) fatal("Received more data than asked for " "%zu > %zu", len, req->len); + if (len == 0) { + if (seen_zerolen) + fatal_f("server sent zero data length"); + seen_zerolen = 1; + } /* Write this chunk out to the destination */ sshbuf_reset(msg); From c58b363e4f7c10134b583fc92556229bf6c2c16b Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 01:58:29 +0000 Subject: [PATCH 141/196] upstream: fix ECDSA order check for curves with cofactor != 1. All supported EC curves have cofactor 1, so this is a nop. From Swival scanner OpenBSD-Commit-ID: 4ae44cc97714fcb6d19fa56714ede56c1ef521e1 --- sshkey.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sshkey.c b/sshkey.c index 00572792fa63..9967ff5392ac 100644 --- a/sshkey.c +++ b/sshkey.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshkey.c,v 1.162 2026/06/14 03:59:34 djm Exp $ */ +/* $OpenBSD: sshkey.c,v 1.163 2026/06/29 01:58:29 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. * Copyright (c) 2008 Alexander von Gernler. All rights reserved. @@ -2725,6 +2725,10 @@ sshkey_ec_validate_public(const EC_GROUP *group, const EC_POINT *public) ret = SSH_ERR_ALLOC_FAIL; goto out; } + if (EC_GROUP_get_order(group, order, NULL) != 1) { + ret = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } if ((nq = EC_POINT_new(group)) == NULL) { ret = SSH_ERR_ALLOC_FAIL; goto out; From 1cfbed8a131de166d86fbf5ac3245d55046cfab3 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 02:08:55 +0000 Subject: [PATCH 142/196] upstream: Fix bounds checking when signing messages of length greater than will fit in a size_t. In OpenSSH, messages sizes are bounded by SSHBUF_SIZE_MAX so this was unreachable. From Swival scanner. OpenBSD-Commit-ID: 31ab874abe21a528fa995d78023c5ad9444a31e1 --- ed25519-openssl.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ed25519-openssl.c b/ed25519-openssl.c index d45effdca4c6..bea1572dfd7c 100644 --- a/ed25519-openssl.c +++ b/ed25519-openssl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ed25519-openssl.c,v 1.2 2026/06/14 03:59:34 djm Exp $ */ +/* $OpenBSD: ed25519-openssl.c,v 1.3 2026/06/29 02:08:55 djm Exp $ */ /* * Copyright (c) 2025 OpenSSH * @@ -194,6 +194,10 @@ crypto_sign_ed25519_open(unsigned char *m, unsigned long long *mlen, debug3_f("signed message bad length: %llu", smlen); return -1; } + if (smlen - crypto_sign_ed25519_BYTES > SIZE_MAX) { + debug3_f("signed message too long: %llu", smlen); + return -1; + } /* Signature is first crypto_sign_ed25519_BYTES, message follows */ msg = sm + crypto_sign_ed25519_BYTES; msglen = smlen - crypto_sign_ed25519_BYTES; From d6a589d3c8530375c2d56bcfb914575a7fcd3715 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 02:13:05 +0000 Subject: [PATCH 143/196] upstream: make ssh-add open it's connection to the agent after it has finished getopt() processing and not before. This allows the -v flag to work properly. ok jca@ OpenBSD-Commit-ID: b9ac820018875aeb5b43ae2119a70c16a5cd2aef --- authfd.c | 4 ++-- ssh-add.c | 33 +++++++++++++++++---------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/authfd.c b/authfd.c index 1f2151b569aa..2b7c561b3b8b 100644 --- a/authfd.c +++ b/authfd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: authfd.c,v 1.142 2026/06/14 03:59:34 djm Exp $ */ +/* $OpenBSD: authfd.c,v 1.143 2026/06/29 02:13:05 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -205,7 +205,7 @@ ssh_request_reply_decode(int sock, struct sshbuf *request) void ssh_close_authentication_socket(int sock) { - if (getenv(SSH_AUTHSOCKET_ENV_NAME)) + if (sock != -1 && getenv(SSH_AUTHSOCKET_ENV_NAME) != NULL) close(sock); } diff --git a/ssh-add.c b/ssh-add.c index 1e9eddf9048e..7ce45103644e 100644 --- a/ssh-add.c +++ b/ssh-add.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-add.c,v 1.186 2026/03/05 05:44:15 djm Exp $ */ +/* $OpenBSD: ssh-add.c,v 1.187 2026/06/29 02:13:05 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -813,7 +813,7 @@ main(int argc, char **argv) { extern char *optarg; extern int optind; - int agent_fd; + int agent_fd = -1; char *pkcs11provider = NULL, *skprovider = NULL; char **dest_constraint_strings = NULL, **hostkey_files = NULL; int r, i, ch, deleting = 0, ret = 0, key_only = 0, cert_only = 0; @@ -835,19 +835,6 @@ main(int argc, char **argv) setvbuf(stdout, NULL, _IOLBF, 0); - /* First, get a connection to the authentication agent. */ - switch (r = ssh_get_authentication_socket(&agent_fd)) { - case 0: - break; - case SSH_ERR_AGENT_NOT_PRESENT: - fprintf(stderr, "Could not open a connection to your " - "authentication agent.\n"); - exit(2); - default: - fprintf(stderr, "Error connecting to agent: %s\n", ssh_err(r)); - exit(2); - } - skprovider = getenv("SSH_SK_PROVIDER"); while ((ch = getopt(argc, argv, "vkKlLNCcdDTxXE:e:h:H:M:m:Qqs:S:t:")) != -1) { @@ -943,7 +930,21 @@ main(int argc, char **argv) if ((xflag != 0) + (lflag != 0) + (Dflag != 0) + (Qflag != 0) > 1) fatal("Invalid combination of actions"); - else if (xflag) { + + /* First, get a connection to the authentication agent. */ + switch (r = ssh_get_authentication_socket(&agent_fd)) { + case 0: + break; + case SSH_ERR_AGENT_NOT_PRESENT: + fprintf(stderr, "Could not open a connection to your " + "authentication agent.\n"); + exit(2); + default: + fprintf(stderr, "Error connecting to agent: %s\n", ssh_err(r)); + exit(2); + } + + if (xflag) { if (lock_agent(agent_fd, xflag == 'x' ? 1 : 0) == -1) ret = 1; goto done; From 84365594f44423b69392f295f82e9cbcdd8c2640 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 07:36:37 +0000 Subject: [PATCH 144/196] upstream: don't print an error message when trying to load a host private key when PKCS#11 keys are in use, as these don't need the private half on the filesystem. GHPR664 from Ingo Franzki OpenBSD-Commit-ID: c93352e218cb1b74af04e8dc3a42eddec1f312c0 --- sshd.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sshd.c b/sshd.c index 1532ee69bf62..7d1466d97e12 100644 --- a/sshd.c +++ b/sshd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd.c,v 1.627 2026/06/14 03:59:34 djm Exp $ */ +/* $OpenBSD: sshd.c,v 1.628 2026/06/29 07:36:37 djm Exp $ */ /* * Copyright (c) 2000, 2001, 2002 Markus Friedl. All rights reserved. * Copyright (c) 2002 Niels Provos. All rights reserved. @@ -1591,7 +1591,8 @@ main(int ac, char **av) if (options.host_key_files[i] == NULL) continue; if ((r = sshkey_load_private(options.host_key_files[i], "", - &key, NULL)) != 0 && r != SSH_ERR_SYSTEM_ERROR) + &key, NULL)) != 0 && + r != SSH_ERR_SYSTEM_ERROR && !have_agent) do_log2_r(r, ll, "Unable to load host key \"%s\"", options.host_key_files[i]); if (sshkey_is_sk(key) && From ef6bef31de60b077cb7da954b202d65156fd510e Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 29 Jun 2026 17:15:10 +1000 Subject: [PATCH 145/196] fix leak of error path; GHPR681 from metsw24-max ok dtucker --- openbsd-compat/bsd-cygwin_util.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openbsd-compat/bsd-cygwin_util.c b/openbsd-compat/bsd-cygwin_util.c index 9ede21d243a2..c2fd36feef90 100644 --- a/openbsd-compat/bsd-cygwin_util.c +++ b/openbsd-compat/bsd-cygwin_util.c @@ -198,8 +198,10 @@ _match_pattern(const char *s, const char *pattern) return 0; ws = (wchar_t *) xcalloc(len + 1, sizeof (wchar_t)); mbstowcs(ws, s, len + 1); - if ((len = mbstowcs(NULL, pattern, 0)) == (size_t) -1) + if ((len = mbstowcs(NULL, pattern, 0)) == (size_t) -1) { + free(ws); return 0; + } wpattern = (wchar_t *) xcalloc(len + 1, sizeof (wchar_t)); mbstowcs(wpattern, pattern, len + 1); ret = __match_pattern (ws, wpattern); From fa5416dec1232dc67d979d28942344cdc8086ae6 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 29 Jun 2026 17:16:55 +1000 Subject: [PATCH 146/196] use size_t for lengths; GHPR681 from metsw24-max ok dtucker --- openbsd-compat/bsd-cygwin_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openbsd-compat/bsd-cygwin_util.c b/openbsd-compat/bsd-cygwin_util.c index c2fd36feef90..c182fa44ad0d 100644 --- a/openbsd-compat/bsd-cygwin_util.c +++ b/openbsd-compat/bsd-cygwin_util.c @@ -222,7 +222,7 @@ cygwin_ug_match_pattern_list(const char *string, const char *pattern) char sub[1024]; int negated; int got_positive; - u_int i, subi, len = strlen(pattern); + size_t i, subi, len = strlen(pattern); got_positive = 0; for (i = 0; i < len;) { From 9d5238f44dda8d9455c085f51f2fb00774f69d38 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 29 Jun 2026 17:17:28 +1000 Subject: [PATCH 147/196] return result of raise(2); GHPR681 from metsw24-max ok dtucker --- openbsd-compat/bsd-misc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openbsd-compat/bsd-misc.c b/openbsd-compat/bsd-misc.c index d5cc3755c72b..de5ac2158b8d 100644 --- a/openbsd-compat/bsd-misc.c +++ b/openbsd-compat/bsd-misc.c @@ -455,7 +455,7 @@ bzero(void *b, size_t n) int raise(int sig) { - kill(getpid(), sig); + return kill(getpid(), sig); } #endif From fceb78d14abc710f2bab31f28d321a9bb2476781 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 29 Jun 2026 17:18:58 +1000 Subject: [PATCH 148/196] check sockaddr length; GHPR681 from metsw24-max ok dtucker --- openbsd-compat/fake-rfc2553.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openbsd-compat/fake-rfc2553.c b/openbsd-compat/fake-rfc2553.c index 5eaa47992b8d..5197c3b3790f 100644 --- a/openbsd-compat/fake-rfc2553.c +++ b/openbsd-compat/fake-rfc2553.c @@ -51,7 +51,8 @@ int getnameinfo(const struct sockaddr *sa, size_t salen, char *host, struct hostent *hp; char tmpserv[16]; - if (sa->sa_family != AF_UNSPEC && sa->sa_family != AF_INET) + if (sa->sa_family != AF_UNSPEC && sa->sa_family != AF_INET || + salen < sizeof(struct sockaddr_in)) return (EAI_FAMILY); if (serv != NULL) { snprintf(tmpserv, sizeof(tmpserv), "%d", ntohs(sin->sin_port)); From 365522938f7a44df993c38f8a51836bab3628211 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 29 Jun 2026 17:21:01 +1000 Subject: [PATCH 149/196] don't leak rrset on fail; GHPR681 from metsw24-max ok dtucker --- openbsd-compat/getrrsetbyname-ldns.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openbsd-compat/getrrsetbyname-ldns.c b/openbsd-compat/getrrsetbyname-ldns.c index 4647b623b862..2210cc255fea 100644 --- a/openbsd-compat/getrrsetbyname-ldns.c +++ b/openbsd-compat/getrrsetbyname-ldns.c @@ -235,10 +235,11 @@ getrrsetbyname(const char *hostname, unsigned int rdclass, } *res = rrset; + rrset = NULL; /* transferred */ result = ERRSET_SUCCESS; fail: - /* freerrset(rrset); */ + freerrset(rrset); ldns_rdf_deep_free(domain); ldns_pkt_free(pkt); ldns_rr_list_deep_free(rrsigs); From d9df26d7e93f76bc5b1c0cbd31cde0af00ccbbc0 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 07:46:22 +0000 Subject: [PATCH 150/196] upstream: don't use deprecated ERR_load_crypto_strings() GHPR650 from Mike Frysinger OpenBSD-Regress-ID: bfe86d9be1db4569c091f3d763cba04ddbb86ec0 --- configure.ac | 4 ++-- regress/misc/ssh-verify-attestation/ssh-verify-attestation.c | 4 ++-- regress/unittests/sshkey/tests.c | 2 +- regress/unittests/sshsig/tests.c | 5 +++-- regress/unittests/test_helper/test_helper.c | 2 +- ssherr-libcrypto.c | 2 +- 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/configure.ac b/configure.ac index 5eed06b181a0..a4d544cc58a4 100644 --- a/configure.ac +++ b/configure.ac @@ -3189,7 +3189,7 @@ if test "x$openssl" = "xyes" ; then AC_MSG_CHECKING([if programs using OpenSSL functions will link]) AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ #include ]], - [[ ERR_load_crypto_strings(); ]])], + [[ OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); ]])], [ AC_MSG_RESULT([yes]) ], @@ -3199,7 +3199,7 @@ if test "x$openssl" = "xyes" ; then AC_MSG_CHECKING([if programs using OpenSSL need -ldl]) AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ #include ]], - [[ ERR_load_crypto_strings(); ]])], + [[ OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); ]])], [ AC_MSG_RESULT([yes]) CHANNELLIBS="$CHANNELLIBS -ldl" diff --git a/regress/misc/ssh-verify-attestation/ssh-verify-attestation.c b/regress/misc/ssh-verify-attestation/ssh-verify-attestation.c index da7f5a23366c..dc3cf6ee3194 100644 --- a/regress/misc/ssh-verify-attestation/ssh-verify-attestation.c +++ b/regress/misc/ssh-verify-attestation/ssh-verify-attestation.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-verify-attestation.c,v 1.3 2025/05/12 05:42:02 tb Exp $ */ +/* $OpenBSD: ssh-verify-attestation.c,v 1.4 2026/06/29 07:46:22 djm Exp $ */ /* * Copyright (c) 2022-2024 Damien Miller * @@ -339,7 +339,7 @@ main(int argc, char **argv) extern int optind; /* extern char *optarg; */ - ERR_load_crypto_strings(); + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); sanitise_stdfd(); log_init(__progname, log_level, SYSLOG_FACILITY_AUTH, 1); diff --git a/regress/unittests/sshkey/tests.c b/regress/unittests/sshkey/tests.c index 426543bd7c37..a797d6692092 100644 --- a/regress/unittests/sshkey/tests.c +++ b/regress/unittests/sshkey/tests.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tests.c,v 1.2 2025/04/15 04:00:42 djm Exp $ */ +/* $OpenBSD: tests.c,v 1.3 2026/06/29 07:46:22 djm Exp $ */ /* * Regress test for sshbuf.h buffer API * diff --git a/regress/unittests/sshsig/tests.c b/regress/unittests/sshsig/tests.c index 5408be67ef14..68e893147635 100644 --- a/regress/unittests/sshsig/tests.c +++ b/regress/unittests/sshsig/tests.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tests.c,v 1.7 2026/06/14 04:08:06 djm Exp $ */ +/* $OpenBSD: tests.c,v 1.8 2026/06/29 07:46:22 djm Exp $ */ /* * Regress test for sshbuf.h buffer API * @@ -17,6 +17,7 @@ #include #ifdef WITH_OPENSSL +#include #include #include #endif @@ -85,7 +86,7 @@ tests(void) #ifdef WITH_OPENSSL OpenSSL_add_all_algorithms(); - ERR_load_crypto_strings(); + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); #endif TEST_START("load data"); diff --git a/regress/unittests/test_helper/test_helper.c b/regress/unittests/test_helper/test_helper.c index 450b045958da..a2cb02d838cc 100644 --- a/regress/unittests/test_helper/test_helper.c +++ b/regress/unittests/test_helper/test_helper.c @@ -151,7 +151,7 @@ main(int argc, char **argv) seed_rng(); #ifdef WITH_OPENSSL - ERR_load_crypto_strings(); + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); #endif /* Handle systems without __progname */ diff --git a/ssherr-libcrypto.c b/ssherr-libcrypto.c index 5b817e54aa80..c825e1a66386 100644 --- a/ssherr-libcrypto.c +++ b/ssherr-libcrypto.c @@ -36,7 +36,7 @@ ssherr_libcrypto(void) const char *reason = NULL, *file, *data; int ln, fl; - ERR_load_crypto_strings(); + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); while ((e = ERR_get_error_line_data(&file, &ln, &data, &fl)) != 0) { ERR_error_string_n(e, buf, sizeof(buf)); snprintf(msg, sizeof(msg), "%s:%s:%d:%s", buf, file, ln, From c8716138281d3dac33c2c7e98615c52d2b606d85 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 07:56:19 +0000 Subject: [PATCH 151/196] upstream: report errors in fill_default_options() properly, based on MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GHPR649 by Zoltán Fridrich MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OpenBSD-Commit-ID: 10137e31df74c3100e3abc7d008b1645ca5b45af --- readconf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readconf.c b/readconf.c index 10cbd04ba1b9..6ec751096b63 100644 --- a/readconf.c +++ b/readconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: readconf.c,v 1.411 2026/03/30 07:18:24 djm Exp $ */ +/* $OpenBSD: readconf.c,v 1.412 2026/06/29 07:56:19 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -2849,7 +2849,7 @@ fill_default_options(Options * options) { char *all_cipher, *all_mac, *all_kex, *all_key, *all_sig; char *def_cipher, *def_mac, *def_kex, *def_key, *def_sig; - int ret = 0, r; + int ret = -1, r; if (options->forward_agent == -1) options->forward_agent = 0; From 849748c6e5d79274020489b03d068361d98ff42f Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 08:16:46 +0000 Subject: [PATCH 152/196] upstream: correct directive name (s/Host/Match) in error message from xspielinbox via bz3968 OpenBSD-Commit-ID: 3aec5cc9d349bcef12abc951490474f1217b4aeb --- readconf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readconf.c b/readconf.c index 6ec751096b63..0218ed12853a 100644 --- a/readconf.c +++ b/readconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: readconf.c,v 1.412 2026/06/29 07:56:19 djm Exp $ */ +/* $OpenBSD: readconf.c,v 1.413 2026/06/29 08:16:46 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1863,7 +1863,7 @@ process_config_line_depth(Options *options, struct passwd *pw, const char *host, case oMatch: if (cmdline) { - error("Host directive not supported as a command-line " + error("Match directive not supported as a command-line " "option"); goto out; } From ce697f1eaf76a3d8d700894726c7a826af393ed5 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 08:19:21 +0000 Subject: [PATCH 153/196] upstream: mention RefuseConnection, VersionAddendum and WarnWeakCrypto along with other options. from xspielinbox via bz3968 OpenBSD-Commit-ID: 5d4ef72dc703a74e64175e4611961ea338379d66 --- ssh.1 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ssh.1 b/ssh.1 index 82ae5480c3ee..79b18c2c5f74 100644 --- a/ssh.1 +++ b/ssh.1 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh.1,v 1.447 2025/12/22 01:17:31 djm Exp $ -.Dd $Mdocdate: December 22 2025 $ +.\" $OpenBSD: ssh.1,v 1.448 2026/06/29 08:19:21 djm Exp $ +.Dd $Mdocdate: June 29 2026 $ .Dt SSH 1 .Os .Sh NAME @@ -582,6 +582,7 @@ For full details of the options listed below, and their possible values, see .It ProxyUseFdpass .It PubkeyAcceptedAlgorithms .It PubkeyAuthentication +.It RefuseConnection .It RekeyLimit .It RemoteCommand .It RemoteForward @@ -607,7 +608,9 @@ For full details of the options listed below, and their possible values, see .It User .It UserKnownHostsFile .It VerifyHostKeyDNS +.It VersionAddendum .It VisualHostKey +.It WarnWeakCrypto .It XAuthLocation .El .Pp From 3c3226f79cf4fa1c0436a91768760b92df87ffab Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 08:21:50 +0000 Subject: [PATCH 154/196] upstream: move documentation of the Include directive to near the start of the options list, alongside that for Match and Host which are similar insofar as they all affect configuration parsing rather than altering the configuration directly. from xspielinbox via bz3968 OpenBSD-Commit-ID: 1cde8af8d40dbbe3ea49cf56c5d408946c875230 --- ssh_config.5 | 54 ++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/ssh_config.5 b/ssh_config.5 index 50962fa719b1..082fc8ee3dbd 100644 --- a/ssh_config.5 +++ b/ssh_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh_config.5,v 1.424 2026/05/21 04:04:57 djm Exp $ -.Dd $Mdocdate: May 21 2026 $ +.\" $OpenBSD: ssh_config.5,v 1.425 2026/06/29 08:21:50 djm Exp $ +.Dd $Mdocdate: June 29 2026 $ .Dt SSH_CONFIG 5 .Os .Sh NAME @@ -280,6 +280,31 @@ for transport-only sessions, such as when is started with the .Fl N flag. +.It Cm Include +Include the specified configuration file(s). +Multiple pathnames may be specified and each pathname may contain +.Xr glob 7 +wildcards, +tokens as described in the +.Sx TOKENS +section, environment variables as described in the +.Sx ENVIRONMENT VARIABLES +section and, for user configurations, shell-like +.Sq ~ +references to user home directories. +Wildcards will be expanded and processed in lexical order. +Files without absolute paths are assumed to be in +.Pa ~/.ssh +if included in a user configuration file or +.Pa /etc/ssh +if included from the system configuration file. +.Cm Include +directive may appear inside a +.Cm Match +or +.Cm Host +block +to perform conditional inclusion. .It Cm AddKeysToAgent Specifies whether keys should be automatically added to a running .Xr ssh-agent 1 . @@ -1227,31 +1252,6 @@ It is recommended that .Cm IgnoreUnknown be listed early in the configuration file as it will not be applied to unknown options that appear before it. -.It Cm Include -Include the specified configuration file(s). -Multiple pathnames may be specified and each pathname may contain -.Xr glob 7 -wildcards, -tokens as described in the -.Sx TOKENS -section, environment variables as described in the -.Sx ENVIRONMENT VARIABLES -section and, for user configurations, shell-like -.Sq ~ -references to user home directories. -Wildcards will be expanded and processed in lexical order. -Files without absolute paths are assumed to be in -.Pa ~/.ssh -if included in a user configuration file or -.Pa /etc/ssh -if included from the system configuration file. -.Cm Include -directive may appear inside a -.Cm Match -or -.Cm Host -block -to perform conditional inclusion. .It Cm IPQoS Specifies the .Em Differentiated Services Field Codepoint Pq DSCP From a9cb2e30d3a50ba6a24047d87cd80e4b4a18b5ff Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 08:48:22 +0000 Subject: [PATCH 155/196] upstream: fix "ls -n", which was still displaying user/group names rather than numeric uids/gids. Based on patch from Tamilan in bz3953 OpenBSD-Commit-ID: 65dd2ecb870b727e872cf9df544f8767426d2cc0 --- sftp.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/sftp.c b/sftp.c index 0b57e083398c..bd4d91965a4a 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.252 2026/06/29 01:47:21 djm Exp $ */ +/* $OpenBSD: sftp.c,v 1.253 2026/06/29 08:48:22 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -899,13 +899,16 @@ do_ls_dir(struct sftp_conn *conn, const char *path, sftp_can_get_users_groups_by_id(conn)) { char *lname; struct stat sb; + const char *user = NULL, *group = NULL; + if ((lflag & LS_NUMERIC_VIEW) == 0) { + user = ruser_name(sb.st_uid); + group = rgroup_name(sb.st_gid); + } memset(&sb, 0, sizeof(sb)); attrib_to_stat(&d[n]->a, &sb); lname = ls_file(fname, &sb, 1, - (lflag & LS_SI_UNITS), - ruser_name(sb.st_uid), - rgroup_name(sb.st_gid)); + (lflag & LS_SI_UNITS), user, group); mprintf("%s\n", lname); free(lname); } else @@ -1038,15 +1041,19 @@ do_globbed_ls(struct sftp_conn *conn, const char *path, i = indices[j]; fname = path_strip(g.gl_pathv[i], strip_path); if (lflag & LS_LONG_VIEW) { + const char *user = NULL, *group = NULL; + if (g.gl_statv[i] == NULL) { error("no stat information for %s", fname); free(fname); continue; } + if ((lflag & LS_NUMERIC_VIEW) == 0) { + user = ruser_name(g.gl_statv[i]->st_uid); + group = rgroup_name(g.gl_statv[i]->st_gid); + } lname = ls_file(fname, g.gl_statv[i], 1, - (lflag & LS_SI_UNITS), - ruser_name(g.gl_statv[i]->st_uid), - rgroup_name(g.gl_statv[i]->st_gid)); + (lflag & LS_SI_UNITS), user, group); mprintf("%s\n", lname); free(lname); } else { From 0eaeddeefa4bd9b1241788b27ed2967ab596c759 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 08:57:06 +0000 Subject: [PATCH 156/196] upstream: s/calloc/xcalloc/ to reduce noise from AI bug detectors that don't understand context OpenBSD-Commit-ID: dcef5b1804620f2aed108267bbf5023a81230e14 --- authfd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/authfd.c b/authfd.c index 2b7c561b3b8b..aef809fa6064 100644 --- a/authfd.c +++ b/authfd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: authfd.c,v 1.143 2026/06/29 02:13:05 djm Exp $ */ +/* $OpenBSD: authfd.c,v 1.144 2026/06/29 08:57:06 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -805,7 +805,7 @@ ssh_agent_query_extensions(int sock, char ***exts) r = SSH_ERR_INVALID_FORMAT; goto out; } - ret = calloc(1, sizeof(*ret)); + ret = xcalloc(1, sizeof(*ret)); while (sshbuf_len(msg)) { ret = xrecallocarray(ret, i + 1, i + 2, sizeof(*ret)); if ((r = sshbuf_get_cstring(msg, ret + i, NULL)) != 0) { From 5d8e42933ab3f1a1c17608c32d680300f5524a99 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 08:59:31 +0000 Subject: [PATCH 157/196] upstream: check strdup() return to avoid NULL deref on failure. bz3948 from RuiHe-MO OpenBSD-Commit-ID: 2b1fbfb2e1f3359150feadfdf05acaa1c7d211e8 --- servconf.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/servconf.c b/servconf.c index 09fef2e7a5de..ce388f1dd93f 100644 --- a/servconf.c +++ b/servconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: servconf.c,v 1.449 2026/06/14 03:59:34 djm Exp $ */ +/* $OpenBSD: servconf.c,v 1.450 2026/06/29 08:59:31 djm Exp $ */ /* * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland * All rights reserved @@ -2166,7 +2166,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, debug2("%s line %d: no match for %s", filename, linenum, arg); item = xcalloc(1, sizeof(*item)); - item->selector = strdup(arg); + item->selector = xstrdup(arg); TAILQ_INSERT_TAIL(includes, item, entry); } @@ -2176,8 +2176,8 @@ process_server_config_line_depth(ServerOptions *options, char *line, debug2("%s line %d: including %s", filename, linenum, gbuf.gl_pathv[n]); item = xcalloc(1, sizeof(*item)); - item->selector = strdup(arg); - item->filename = strdup(gbuf.gl_pathv[n]); + item->selector = xstrdup(arg); + item->filename = xstrdup(gbuf.gl_pathv[n]); if ((item->contents = sshbuf_new()) == NULL) fatal_f("sshbuf_new failed"); load_server_config(item->filename, From 0875a78bb7228986c2e89ef2f5fe041d2ab27ed7 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 09:14:25 +0000 Subject: [PATCH 158/196] upstream: fix ineffective max file size check when loading blobs/keys from files and add another one on a patch that was not covered by the existing ones. From Tess Gauthier via bz3969 and bz3970 OpenBSD-Commit-ID: c0dec6c587853349113df85b6dc528dc15079af0 --- authfile.c | 8 +++++++- sshbuf-io.c | 7 +++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/authfile.c b/authfile.c index 3f15515c857e..954f78c001b7 100644 --- a/authfile.c +++ b/authfile.c @@ -1,4 +1,4 @@ -/* $OpenBSD: authfile.c,v 1.150 2026/06/14 03:59:34 djm Exp $ */ +/* $OpenBSD: authfile.c,v 1.151 2026/06/29 09:14:25 djm Exp $ */ /* * Copyright (c) 2000, 2013 Markus Friedl. All rights reserved. * @@ -197,6 +197,7 @@ sshkey_try_load_public(struct sshkey **kp, const char *filename, char *line = NULL, *cp; size_t linesize = 0; int r; + struct stat st; struct sshkey *k = NULL; if (kp == NULL) @@ -206,6 +207,11 @@ sshkey_try_load_public(struct sshkey **kp, const char *filename, *commentp = NULL; if ((f = fopen(filename, "r")) == NULL) return SSH_ERR_SYSTEM_ERROR; + if (stat(filename, &st) == 0 && S_ISREG(st.st_mode) && + st.st_size > SSHBUF_SIZE_MAX) { + fclose(f); + return SSH_ERR_INVALID_FORMAT; + } if ((k = sshkey_new(KEY_UNSPEC)) == NULL) { fclose(f); return SSH_ERR_ALLOC_FAIL; diff --git a/sshbuf-io.c b/sshbuf-io.c index 13ef40e7d272..2c1fb4544e2e 100644 --- a/sshbuf-io.c +++ b/sshbuf-io.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf-io.c,v 1.2 2020/01/25 23:28:06 djm Exp $ */ +/* $OpenBSD: sshbuf-io.c,v 1.3 2026/06/29 09:14:25 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -43,8 +43,7 @@ sshbuf_load_fd(int fd, struct sshbuf **blobp) if (fstat(fd, &st) == -1) return SSH_ERR_SYSTEM_ERROR; - if ((st.st_mode & (S_IFSOCK|S_IFCHR|S_IFIFO)) == 0 && - st.st_size > SSHBUF_SIZE_MAX) + if (S_ISREG(st.st_mode) && st.st_size > SSHBUF_SIZE_MAX) return SSH_ERR_INVALID_FORMAT; if ((blob = sshbuf_new()) == NULL) return SSH_ERR_ALLOC_FAIL; @@ -62,7 +61,7 @@ sshbuf_load_fd(int fd, struct sshbuf **blobp) goto out; } } - if ((st.st_mode & (S_IFSOCK|S_IFCHR|S_IFIFO)) == 0 && + if (S_ISREG(st.st_mode) == 0 && st.st_size != (off_t)sshbuf_len(blob)) { r = SSH_ERR_FILE_CHANGED; goto out; From b9d2162e4a919168bbd983fa68663f813b534034 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 22:56:44 +0000 Subject: [PATCH 159/196] upstream: Move user/group name lookup to correct place; coverity CID 910530 via dtucker@ OpenBSD-Commit-ID: 03ba9f8c720eea38436e4fef4c40814eae1b1fe3 --- sftp.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/sftp.c b/sftp.c index bd4d91965a4a..838f9b862217 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.253 2026/06/29 08:48:22 djm Exp $ */ +/* $OpenBSD: sftp.c,v 1.254 2026/06/29 22:56:44 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -326,7 +327,6 @@ local_do_shell(const char *args) fatal("Couldn't fork: %s", strerror(errno)); if (pid == 0) { - /* XXX: child has pipe fds to ssh subproc open - issue? */ if (args) { debug3("Executing %s -c \"%s\"", shell, args); execl(shell, shell, "-c", args, (char *)NULL); @@ -901,12 +901,12 @@ do_ls_dir(struct sftp_conn *conn, const char *path, struct stat sb; const char *user = NULL, *group = NULL; + memset(&sb, 0, sizeof(sb)); + attrib_to_stat(&d[n]->a, &sb); if ((lflag & LS_NUMERIC_VIEW) == 0) { user = ruser_name(sb.st_uid); group = rgroup_name(sb.st_gid); } - memset(&sb, 0, sizeof(sb)); - attrib_to_stat(&d[n]->a, &sb); lname = ls_file(fname, &sb, 1, (lflag & LS_SI_UNITS), user, group); mprintf("%s\n", lname); @@ -2403,6 +2403,8 @@ connect_to_server(char *path, char **args, int *in, int *out) *in = *out = inout[0]; c_in = c_out = inout[1]; #endif /* USE_PIPES */ + FD_CLOSEONEXEC(*in); + FD_CLOSEONEXEC(*out); if ((sshpid = fork()) == -1) fatal("fork: %s", strerror(errno)); From 23a7c4d1284694f9973ebdae7884cd25d33e5cf8 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 29 Jun 2026 23:00:00 +0000 Subject: [PATCH 160/196] upstream: revert bits that weren't ready for commit yet OpenBSD-Commit-ID: ee8a219f02db32778444356ad2d93b983a38a704 --- sftp.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/sftp.c b/sftp.c index 838f9b862217..db23a578ef46 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.254 2026/06/29 22:56:44 djm Exp $ */ +/* $OpenBSD: sftp.c,v 1.255 2026/06/29 23:00:00 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -327,6 +327,7 @@ local_do_shell(const char *args) fatal("Couldn't fork: %s", strerror(errno)); if (pid == 0) { + /* XXX: child has pipe fds to ssh subproc open - issue? */ if (args) { debug3("Executing %s -c \"%s\"", shell, args); execl(shell, shell, "-c", args, (char *)NULL); @@ -901,12 +902,12 @@ do_ls_dir(struct sftp_conn *conn, const char *path, struct stat sb; const char *user = NULL, *group = NULL; - memset(&sb, 0, sizeof(sb)); - attrib_to_stat(&d[n]->a, &sb); if ((lflag & LS_NUMERIC_VIEW) == 0) { user = ruser_name(sb.st_uid); group = rgroup_name(sb.st_gid); } + memset(&sb, 0, sizeof(sb)); + attrib_to_stat(&d[n]->a, &sb); lname = ls_file(fname, &sb, 1, (lflag & LS_SI_UNITS), user, group); mprintf("%s\n", lname); @@ -2403,8 +2404,6 @@ connect_to_server(char *path, char **args, int *in, int *out) *in = *out = inout[0]; c_in = c_out = inout[1]; #endif /* USE_PIPES */ - FD_CLOSEONEXEC(*in); - FD_CLOSEONEXEC(*out); if ((sshpid = fork()) == -1) fatal("fork: %s", strerror(errno)); From fa447bd5836f6d1c742c543207a3a6ec2909da75 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Tue, 30 Jun 2026 00:09:01 +0000 Subject: [PATCH 161/196] upstream: check key and IV length received in privsep state transfer exactly match the expected sizes for the selected cipher; partially redundant to similar checks in cipher_init(), but nice to be more exact. GHPR from jmestwa-coder; ok dtucker@ OpenBSD-Commit-ID: d4a9deef194cc44189e835ac59b7b800b9b5c281 --- packet.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packet.c b/packet.c index 8d8f73ca0263..4c89e60c5e57 100644 --- a/packet.c +++ b/packet.c @@ -1,4 +1,4 @@ -/* $OpenBSD: packet.c,v 1.338 2026/05/31 04:44:38 djm Exp $ */ +/* $OpenBSD: packet.c,v 1.339 2026/06/30 00:09:01 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -2548,6 +2548,11 @@ newkeys_from_blob(struct sshbuf *m, struct ssh *ssh, int mode) r = SSH_ERR_INVALID_FORMAT; goto out; } + if (keylen != cipher_keylen(enc->cipher) || + ivlen != cipher_ivlen(enc->cipher)) { + r = SSH_ERR_INVALID_FORMAT; + goto out; + } if (cipher_authlen(enc->cipher) == 0) { if ((r = sshbuf_get_cstring(b, &mac->name, NULL)) != 0) goto out; From 710cd5abcea22aeddbd5d5d661c224eaa05e47b9 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Tue, 30 Jun 2026 00:10:48 +0000 Subject: [PATCH 162/196] upstream: set FD_CLOEXEC on the fds between sftp and its ssh process, avoids risk of subcommands that write on odd fds breaking the connection. GHPR693 from Manuel Einfalt; feedback deraadt@ ok dtucker@ OpenBSD-Commit-ID: 91b12cd66580dab6b3bfe5e507a1a8310c8f9149 --- sftp.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sftp.c b/sftp.c index db23a578ef46..a526fade2d33 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.255 2026/06/29 23:00:00 djm Exp $ */ +/* $OpenBSD: sftp.c,v 1.256 2026/06/30 00:10:48 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -327,7 +327,6 @@ local_do_shell(const char *args) fatal("Couldn't fork: %s", strerror(errno)); if (pid == 0) { - /* XXX: child has pipe fds to ssh subproc open - issue? */ if (args) { debug3("Executing %s -c \"%s\"", shell, args); execl(shell, shell, "-c", args, (char *)NULL); @@ -2404,6 +2403,8 @@ connect_to_server(char *path, char **args, int *in, int *out) *in = *out = inout[0]; c_in = c_out = inout[1]; #endif /* USE_PIPES */ + FD_CLOSEONEXEC(*in); + FD_CLOSEONEXEC(*out); if ((sshpid = fork()) == -1) fatal("fork: %s", strerror(errno)); From dcba967d3f39f89d17634e550e1741b2b91f4c5c Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Tue, 30 Jun 2026 02:30:19 +0000 Subject: [PATCH 163/196] upstream: another ruser_name/ruser_group vs attrib_to_stat() ordering screwup. Coverity CID 910530 via dtucker@ OpenBSD-Commit-ID: d8c4656119f09304e79fcf2ab32299ed68006a29 --- sftp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sftp.c b/sftp.c index a526fade2d33..31d8fa4949b8 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.256 2026/06/30 00:10:48 djm Exp $ */ +/* $OpenBSD: sftp.c,v 1.257 2026/06/30 02:30:19 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -901,12 +901,12 @@ do_ls_dir(struct sftp_conn *conn, const char *path, struct stat sb; const char *user = NULL, *group = NULL; + memset(&sb, 0, sizeof(sb)); + attrib_to_stat(&d[n]->a, &sb); if ((lflag & LS_NUMERIC_VIEW) == 0) { user = ruser_name(sb.st_uid); group = rgroup_name(sb.st_gid); } - memset(&sb, 0, sizeof(sb)); - attrib_to_stat(&d[n]->a, &sb); lname = ls_file(fname, &sb, 1, (lflag & LS_SI_UNITS), user, group); mprintf("%s\n", lname); From aabe6d25498d9dc69fa21fbb14352fd4b3d5e9fa Mon Sep 17 00:00:00 2001 From: "tb@openbsd.org" Date: Tue, 30 Jun 2026 03:42:53 +0000 Subject: [PATCH 164/196] upstream: ssherr-libcrypto: avoid use of deprecated ERR_load_crypto_strings() Follow regress and use unchecked OPENSSL_init_crypto() because ERR_load_crypto_strings() has been deprecated in OpenSSL 1.1.0. This call can in principle fail, in which case there's a fallback to generic error strings. There is still use of OpenSSL 3.x-deprecated API in here. That's a problem for someone else to solve. ok djm OpenBSD-Commit-ID: 3e9dc94caa83b361775b83a92425e858f8680c05 --- ssherr-libcrypto.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ssherr-libcrypto.c b/ssherr-libcrypto.c index c825e1a66386..8f84183f46eb 100644 --- a/ssherr-libcrypto.c +++ b/ssherr-libcrypto.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssherr-libcrypto.c,v 1.1 2026/02/06 23:31:29 dtucker Exp $ */ +/* $OpenBSD: ssherr-libcrypto.c,v 1.2 2026/06/30 03:42:53 tb Exp $ */ /* * Copyright (c) 2026 Darren Tucker * From fe85df40aed36a49b9883186a123a1435c17f895 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Tue, 30 Jun 2026 23:55:32 +0000 Subject: [PATCH 165/196] upstream: mention mldsa44-ed25519 in usage(); based on GHPR695 from Loganaden Velvindron OpenBSD-Commit-ID: 4af2400312b6ca232a68a758160ca5c64ca6a168 --- ssh-keygen.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ssh-keygen.c b/ssh-keygen.c index 981bbf93e41d..a62e5dc4a26c 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keygen.c,v 1.491 2026/06/14 03:59:34 djm Exp $ */ +/* $OpenBSD: ssh-keygen.c,v 1.492 2026/06/30 23:55:32 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1994 Tatu Ylonen , Espoo, Finland @@ -3247,7 +3247,7 @@ usage(void) fprintf(stderr, "usage: ssh-keygen [-q] [-a rounds] [-b bits] [-C comment] [-f output_keyfile]\n" " [-m format] [-N new_passphrase] [-O option]\n" - " [-t ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa]\n" + " [-t ecdsa|ecdsa-sk|ed25519|ed25519-sk|mldsa44-ed25519|rsa]\n" " [-w provider] [-Z cipher]\n" " ssh-keygen -p [-a rounds] [-f keyfile] [-m format] [-N new_passphrase]\n" " [-P old_passphrase] [-Z cipher]\n" From 296393226e4849010516150f3e19dbfc68789503 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 1 Jul 2026 00:04:46 +0000 Subject: [PATCH 166/196] upstream: ssh -o doesn't support Host or Include options, they are only valid in the config file. bz3968 from xspielinbox OpenBSD-Commit-ID: cbecf11f2eea63e3cf6752e9bbe59091ba60cd32 --- ssh.1 | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ssh.1 b/ssh.1 index 79b18c2c5f74..22f385f06bd6 100644 --- a/ssh.1 +++ b/ssh.1 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh.1,v 1.448 2026/06/29 08:19:21 djm Exp $ -.Dd $Mdocdate: June 29 2026 $ +.\" $OpenBSD: ssh.1,v 1.449 2026/07/01 00:04:46 djm Exp $ +.Dd $Mdocdate: July 1 2026 $ .Dt SSH 1 .Os .Sh NAME @@ -547,7 +547,6 @@ For full details of the options listed below, and their possible values, see .It GatewayPorts .It GlobalKnownHostsFile .It HashKnownHosts -.It Host .It HostKeyAlgorithms .It HostKeyAlias .It HostbasedAcceptedAlgorithms @@ -558,7 +557,6 @@ For full details of the options listed below, and their possible values, see .It IdentityAgent .It IdentityFile .It IgnoreUnknown -.It Include .It KbdInteractiveAuthentication .It KbdInteractiveDevices .It KexAlgorithms From 8b05bbeb293c5f777915e37e9ed43a06fb8e7614 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Wed, 1 Jul 2026 00:52:23 +0000 Subject: [PATCH 167/196] upstream: Move negative-FD checks to before first use. CID 909998, ok djm@ OpenBSD-Commit-ID: f0208911d27fd5bd66cd608c7b6fb5a36002d6a5 --- sftp-server.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sftp-server.c b/sftp-server.c index 156d5ece58c3..f87fc5825c22 100644 --- a/sftp-server.c +++ b/sftp-server.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-server.c,v 1.155 2026/06/05 08:48:43 djm Exp $ */ +/* $OpenBSD: sftp-server.c,v 1.156 2026/07/01 00:52:23 dtucker Exp $ */ /* * Copyright (c) 2000-2004 Markus Friedl. All rights reserved. * @@ -1633,6 +1633,11 @@ process_extended_copy_data(uint32_t id) /* Disallow reading & writing to the same handle, path or inode */ read_fd = handle_to_fd(read_handle); write_fd = handle_to_fd(write_handle); + if (read_fd < 0 || write_fd < 0) { + error_f("bad read or write fd"); + status = errno_to_portable(EBADF); + goto out; + } if (fstat(read_fd, &st_read) != 0) { status = errno_to_portable(errno); error_f("fstat read_fd failed: %s", strerror(errno)); @@ -1643,7 +1648,7 @@ process_extended_copy_data(uint32_t id) error_f("fstat write_fd failed: %s", strerror(errno)); goto out; } - if (read_handle == write_handle || read_fd < 0 || write_fd < 0 || + if (read_handle == write_handle || !strcmp(handle_to_name(read_handle), handle_to_name(write_handle)) || (st_read.st_dev != 0 && st_read.st_ino != 0 && st_read.st_dev == st_write.st_dev && From 55ffd11b88f073662cdf0c8c48fe0800b8a71fc4 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 1 Jul 2026 00:52:31 +0000 Subject: [PATCH 168/196] upstream: Tighten up the introduction a little: Mention Match as a conditional directive (previously it only mentioned Host) Try to use consistent language in the introduction to refer to configuration directives (previously it used "parameters" and "keywords" interchangeably). Mention that comments may appear at the end of the line too, and that whitespace at the beginning/end of lines is not significant. OpenBSD-Commit-ID: e08f34413eeced47478c14d5005726f9bdd5d80e --- ssh_config.5 | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/ssh_config.5 b/ssh_config.5 index 082fc8ee3dbd..4ac0d3d45d04 100644 --- a/ssh_config.5 +++ b/ssh_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh_config.5,v 1.425 2026/06/29 08:21:50 djm Exp $ -.Dd $Mdocdate: June 29 2026 $ +.\" $OpenBSD: ssh_config.5,v 1.426 2026/07/01 00:52:31 djm Exp $ +.Dd $Mdocdate: July 1 2026 $ .Dt SSH_CONFIG 5 .Os .Sh NAME @@ -56,31 +56,36 @@ system-wide configuration file .Pq Pa /etc/ssh/ssh_config .El .Pp -Unless noted otherwise, for each parameter, the first obtained value -will be used. -The configuration files contain sections separated by +Unless noted otherwise, for each configuration directive, the first +specified value will be used. +.Pp +The configuration files may contain sections separated by conditional .Cm Host -specifications, and that section is only applied for hosts that -match one of the patterns given in the specification. -The matched host name is usually the one given on the command line -(see the -.Cm CanonicalizeHostname -option for exceptions). +or +.Cm Match +directives. +Configuration in these sections is only applied if the conditional directive +that started the section matches. .Pp -Since the first obtained value for each parameter is used, more +Since the first obtained value for each directive is used, more host-specific declarations should be given near the beginning of the file, and general defaults at the end. .Pp -The file contains keyword-argument pairs, one per line. +The file contains directive/values pairs, one per line. Lines starting with .Ql # and empty lines are interpreted as comments. -Arguments may optionally be enclosed in double quotes +.Ql # +outside of a quoted string may be used to add a comment to the end of a line. +Whitespace at the beginning or end of lines is ignored. +Values may optionally be enclosed in double quotes .Pq \&" in order to represent arguments containing spaces. -Configuration options may be separated by whitespace or -optional whitespace and exactly one -.Ql = ; +.Pp +Configuration directives are separated from their values by whitespace +or exactly one +.Ql = +character (which may be surrounded by whitespace); the latter format is useful to avoid the need to quote whitespace when specifying configuration options using the .Nm ssh , From 0cdead097bde10712cd0635b5d350c16e07ba52a Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 1 Jul 2026 01:06:54 +0000 Subject: [PATCH 169/196] upstream: simplify SIGINFO output: remove list of active channels (too verbose) and just display destination and connection duration; requested deraadt@ OpenBSD-Commit-ID: cb36192cd53483f8e452ea91bc42be7bbb2fffa3 --- clientloop.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/clientloop.c b/clientloop.c index 8f9d16ca867c..a34db499a531 100644 --- a/clientloop.c +++ b/clientloop.c @@ -1,4 +1,4 @@ -/* $OpenBSD: clientloop.c,v 1.423 2026/04/19 23:37:22 djm Exp $ */ +/* $OpenBSD: clientloop.c,v 1.424 2026/07/01 01:06:54 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -107,6 +107,8 @@ /* Uncertainty (in percent) of keystroke timing intervals */ #define SSH_KEYSTROKE_TIMING_FUZZ 10 +extern char *__progname; + /* import options */ extern Options options; @@ -1594,8 +1596,12 @@ client_loop(struct ssh *ssh, int have_pty, int escape_char_arg, if (sigprocmask(SIG_BLOCK, &bsigset, &osigset) == -1) error_f("bsigset sigprocmask: %s", strerror(errno)); if (siginfo_received) { + char ident[256]; + + sshpkt_fmt_connection_id(ssh, ident, sizeof(ident)); + logit("%s: connection to %s, up %.1f seconds", + __progname, ident, monotime_double() - start_time); siginfo_received = 0; - channel_report_open(ssh, SYSLOG_LEVEL_INFO); } if (quit_pending) break; From 088ca00b8f19a0257b2f869cb828ab75e99ab3a1 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 1 Jul 2026 01:08:51 +0000 Subject: [PATCH 170/196] upstream: whitespace OpenBSD-Commit-ID: 730e54174b2182c7011cc87a0fdae595cd9bcc2d --- clientloop.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clientloop.c b/clientloop.c index a34db499a531..49950ceccfe0 100644 --- a/clientloop.c +++ b/clientloop.c @@ -1,4 +1,4 @@ -/* $OpenBSD: clientloop.c,v 1.424 2026/07/01 01:06:54 djm Exp $ */ +/* $OpenBSD: clientloop.c,v 1.425 2026/07/01 01:08:51 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1598,7 +1598,7 @@ client_loop(struct ssh *ssh, int have_pty, int escape_char_arg, if (siginfo_received) { char ident[256]; - sshpkt_fmt_connection_id(ssh, ident, sizeof(ident)); + sshpkt_fmt_connection_id(ssh, ident, sizeof(ident)); logit("%s: connection to %s, up %.1f seconds", __progname, ident, monotime_double() - start_time); siginfo_received = 0; From 654e1a3e5b58029b05f1df0308e7e4d4407b37c2 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 1 Jul 2026 01:14:39 +0000 Subject: [PATCH 171/196] upstream: more missing mldsa44-ed25519, based on GHPR696 from Loganaden Velvindron OpenBSD-Commit-ID: f32e17df54fa66b0e936f1aeb3963f949e4a9bb8 --- ssh-keygen.1 | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/ssh-keygen.1 b/ssh-keygen.1 index c5f3f741017f..33f78fe3937b 100644 --- a/ssh-keygen.1 +++ b/ssh-keygen.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-keygen.1,v 1.237 2025/12/22 01:49:03 djm Exp $ +.\" $OpenBSD: ssh-keygen.1,v 1.238 2026/07/01 01:14:39 djm Exp $ .\" .\" Author: Tatu Ylonen .\" Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -35,7 +35,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: December 22 2025 $ +.Dd $Mdocdate: July 1 2026 $ .Dt SSH-KEYGEN 1 .Os .Sh NAME @@ -51,7 +51,7 @@ .Op Fl m Ar format .Op Fl N Ar new_passphrase .Op Fl O Ar option -.Op Fl t Cm ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa +.Op Fl t Cm ecdsa | ecdsa-sk | ed25519 | ed25519-sk | mldsa44-ed25519 | rsa .Op Fl w Ar provider .Op Fl Z Ar cipher .Nm ssh-keygen @@ -208,7 +208,8 @@ key in .Pa ~/.ssh/id_ecdsa , .Pa ~/.ssh/id_ecdsa_sk , .Pa ~/.ssh/id_ed25519 , -.Pa ~/.ssh/id_ed25519_sk +.Pa ~/.ssh/id_ed25519_sk , +.Pa ~/.ssh/id_mldsa44-ed25519 or .Pa ~/.ssh/id_rsa . Additionally, the system administrator may use this to generate host keys, @@ -270,7 +271,7 @@ should be placed to be activated. The options are as follows: .Bl -tag -width Ds .It Fl A -Generate host keys of all default key types (rsa, ecdsa, and +Generate host keys of all default key types (rsa, ecdsa, mldsa44-ed25519 and ed25519) if they do not already exist. The host keys are generated with the default key file path, an empty passphrase, default bits for the key type, and default comment. @@ -576,13 +577,14 @@ by key ID or serial number. See the .Sx KEY REVOCATION LISTS section for details. -.It Fl t Cm ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa +.It Fl t Cm ecdsa | ecdsa-sk | ed25519 | ed25519-sk | mldsa44-ed25519 | rsa Specifies the type of key to create. The possible values are .Dq ecdsa , .Dq ecdsa-sk , .Dq ed25519 (the default), .Dq ed25519-sk , +.Dq mldsa44-ed25519 or .Dq rsa . .Pp @@ -1299,6 +1301,7 @@ the built-in USB HID support. .It Pa ~/.ssh/id_ecdsa_sk .It Pa ~/.ssh/id_ed25519 .It Pa ~/.ssh/id_ed25519_sk +.It Pa ~/.ssh/id_mldsa44-ed25519 .It Pa ~/.ssh/id_rsa Contains the ECDSA, authenticator-hosted ECDSA, Ed25519, authenticator-hosted Ed25519 or RSA authentication identity of the user. @@ -1316,6 +1319,7 @@ will read this file when a login attempt is made. .It Pa ~/.ssh/id_ecdsa_sk.pub .It Pa ~/.ssh/id_ed25519.pub .It Pa ~/.ssh/id_ed25519_sk.pub +.It Pa ~/.ssh/id_mldsa44-ed25519.pub .It Pa ~/.ssh/id_rsa.pub Contains the ECDSA, authenticator-hosted ECDSA, Ed25519, authenticator-hosted Ed25519 or RSA public key for authentication. From 0a75a95d582028c5ce91f524c20365df9f2515f2 Mon Sep 17 00:00:00 2001 From: Zoltan Fridrich Date: Wed, 16 Apr 2025 15:11:59 +0200 Subject: [PATCH 172/196] Provide better error for non-supported private keys Signed-off-by: Zoltan Fridrich --- sshkey.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sshkey.c b/sshkey.c index 9967ff5392ac..7f389daa9299 100644 --- a/sshkey.c +++ b/sshkey.c @@ -3464,6 +3464,9 @@ translate_libcrypto_error(unsigned long pem_err) return SSH_ERR_LIBCRYPTO_ERROR; } case ERR_LIB_ASN1: +#ifdef ERR_LIB_OSSL_DECODER + case ERR_LIB_OSSL_DECODER: +#endif return SSH_ERR_INVALID_FORMAT; } return SSH_ERR_LIBCRYPTO_ERROR; From c53864fc40045d0413c36a19ca784b1b2f985dd9 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 25 Jun 2026 18:43:48 +1000 Subject: [PATCH 173/196] Tabs -> spaces. --- .github/configs | 2 +- .github/run_test.sh | 8 +-- .github/setup_ci.sh | 116 ++++++++++++++++++++++---------------------- 3 files changed, 63 insertions(+), 63 deletions(-) diff --git a/.github/configs b/.github/configs index a7bb698e25ca..ece6441b1617 100755 --- a/.github/configs +++ b/.github/configs @@ -208,7 +208,7 @@ case "$config" in ;; sk) CONFIGFLAGS="--with-security-key-builtin --with-security-key-standalone" - ;; + ;; without-openssl) LIBCRYPTOFLAGS="--without-openssl" TEST_TARGET=t-exec diff --git a/.github/run_test.sh b/.github/run_test.sh index e8f24ad1803a..63aa31f6c004 100755 --- a/.github/run_test.sh +++ b/.github/run_test.sh @@ -15,8 +15,8 @@ if [ ! -z "$SUDO" ] && [ ! -z "$TEST_SSH_HOSTBASED_AUTH" ]; then $SUDO mkdir -p $sshconf $SUDO make install for key in $sshconf/ssh_host*key*.pub; do - echo `hostname` `cat $key` | \ - $SUDO tee -a $sshconf/ssh_known_hosts >/dev/null + echo `hostname` `cat $key` | \ + $SUDO tee -a $sshconf/ssh_known_hosts >/dev/null done fi @@ -75,8 +75,8 @@ fi if [ ! -z "${SSHD_CONFOPTS}" ]; then echo "rerunning t-exec with TEST_SSH_SSHD_CONFOPTS='${SSHD_CONFOPTS}'" if [ -z "${LTESTS}" ]; then - ${env} make t-exec SKIP_LTESTS="${SKIP_LTESTS}" TEST_SSH_SSHD_CONFOPTS="${SSHD_CONFOPTS}" + ${env} make t-exec SKIP_LTESTS="${SKIP_LTESTS}" TEST_SSH_SSHD_CONFOPTS="${SSHD_CONFOPTS}" else - ${env} make t-exec SKIP_LTESTS="${SKIP_LTESTS}" LTESTS="${LTESTS}" TEST_SSH_SSHD_CONFOPTS="${SSHD_CONFOPTS}" + ${env} make t-exec SKIP_LTESTS="${SKIP_LTESTS}" LTESTS="${LTESTS}" TEST_SSH_SSHD_CONFOPTS="${SSHD_CONFOPTS}" fi fi diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index 038511a8cefa..c8314025d9da 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -107,83 +107,83 @@ echo "Setting up for '$TARGETS'" for TARGET in $TARGETS; do case $TARGET in default|without-openssl|without-zlib|c89) - # nothing to do - ;; + # nothing to do + ;; clang-sanitize*) - PACKAGES="$PACKAGES clang-12" - ;; + PACKAGES="$PACKAGES clang-12" + ;; cygwin-release) - PACKAGES="$PACKAGES libcrypt-devel libfido2-devel libkrb5-devel" - ;; + PACKAGES="$PACKAGES libcrypt-devel libfido2-devel libkrb5-devel" + ;; gcc-sanitize*) - ;; + ;; clang-*|gcc-*) - compiler=$(echo $TARGET | sed 's/-Werror//') - PACKAGES="$PACKAGES $compiler" - ;; + compiler=$(echo $TARGET | sed 's/-Werror//') + PACKAGES="$PACKAGES $compiler" + ;; krb5) - PACKAGES="$PACKAGES libkrb5-dev libnss-wrapper krb5-admin-server" + PACKAGES="$PACKAGES libkrb5-dev libnss-wrapper krb5-admin-server" ;; heimdal) - PACKAGES="$PACKAGES heimdal-dev libnss-wrapper krb5-admin-server" - ;; + PACKAGES="$PACKAGES heimdal-dev libnss-wrapper krb5-admin-server" + ;; libedit) case "$PACKAGER" in setup) PACKAGES="$PACKAGES libedit-devel" ;; apt) PACKAGES="$PACKAGES libedit-dev" ;; esac - ;; + ;; *pam) case "$PACKAGER" in apt) PACKAGES="$PACKAGES libpam0g-dev" ;; esac - ;; + ;; sk) - INSTALL_FIDO_PPA="yes" - PACKAGES="$PACKAGES libfido2-dev libu2f-host-dev libcbor-dev" - ;; + INSTALL_FIDO_PPA="yes" + PACKAGES="$PACKAGES libfido2-dev libu2f-host-dev libcbor-dev" + ;; selinux) - PACKAGES="$PACKAGES libselinux1-dev selinux-policy-dev libaudit-dev" - ;; + PACKAGES="$PACKAGES libselinux1-dev selinux-policy-dev libaudit-dev" + ;; hardenedmalloc) - INSTALL_HARDENED_MALLOC=yes - ;; + INSTALL_HARDENED_MALLOC=yes + ;; musl) PACKAGES="$PACKAGES musl-tools" ;; tcmalloc) - PACKAGES="$PACKAGES libgoogle-perftools-dev" - ;; + PACKAGES="$PACKAGES libgoogle-perftools-dev" + ;; openssl-noec) INSTALL_OPENSSL=OpenSSL_1_1_1k SSLCONFOPTS="no-ec" ;; openssl-*) - INSTALL_OPENSSL=$(echo ${TARGET} | cut -f2 -d-) - case ${INSTALL_OPENSSL} in - 1.1.1_stable) INSTALL_OPENSSL="OpenSSL_1_1_1-stable" ;; - 1.*) INSTALL_OPENSSL="OpenSSL_$(echo ${INSTALL_OPENSSL} | tr . _)" ;; - master) ;; - *) INSTALL_OPENSSL="openssl-${INSTALL_OPENSSL}" ;; - esac - PACKAGES="${PACKAGES} putty-tools dropbear-bin" + INSTALL_OPENSSL=$(echo ${TARGET} | cut -f2 -d-) + case ${INSTALL_OPENSSL} in + 1.1.1_stable) INSTALL_OPENSSL="OpenSSL_1_1_1-stable" ;; + 1.*) INSTALL_OPENSSL="OpenSSL_$(echo ${INSTALL_OPENSSL} | tr . _)" ;; + master) ;; + *) INSTALL_OPENSSL="openssl-${INSTALL_OPENSSL}" ;; + esac + PACKAGES="${PACKAGES} putty-tools dropbear-bin" ;; libressl-*) - INSTALL_LIBRESSL=$(echo ${TARGET} | cut -f2 -d-) - case ${INSTALL_LIBRESSL} in - master) ;; - *) INSTALL_LIBRESSL="$(echo ${TARGET} | cut -f2 -d-)" ;; - esac - PACKAGES="${PACKAGES} putty-tools dropbear-bin" + INSTALL_LIBRESSL=$(echo ${TARGET} | cut -f2 -d-) + case ${INSTALL_LIBRESSL} in + master) ;; + *) INSTALL_LIBRESSL="$(echo ${TARGET} | cut -f2 -d-)" ;; + esac + PACKAGES="${PACKAGES} putty-tools dropbear-bin" ;; boringssl) - INSTALL_BORINGSSL=1 - PACKAGES="${PACKAGES} cmake ninja-build" + INSTALL_BORINGSSL=1 + PACKAGES="${PACKAGES} cmake ninja-build" ;; aws-lc) - INSTALL_AWSLC=1 - PACKAGES="${PACKAGES} cmake ninja-build" - ;; + INSTALL_AWSLC=1 + PACKAGES="${PACKAGES} cmake ninja-build" + ;; dropbear-versions) INSTALL_DROPBEAR=main ;; @@ -197,8 +197,8 @@ for TARGET in $TARGETS; do zlib-*) ;; *) echo "Invalid option '${TARGET}'" - exit 1 - ;; + exit 1 + ;; esac done @@ -255,20 +255,20 @@ fi if [ ! -z "${INSTALL_LIBRESSL}" ]; then if [ "${INSTALL_LIBRESSL}" = "master" ]; then - (mkdir -p ${HOME}/libressl && cd ${HOME}/libressl && - git clone https://github.com/libressl-portable/portable.git && - cd ${HOME}/libressl/portable && - git checkout ${INSTALL_LIBRESSL} && - sh update.sh && sh autogen.sh && - ./configure --prefix=/opt/libressl && - make && sudo make install) + (mkdir -p ${HOME}/libressl && cd ${HOME}/libressl && + git clone https://github.com/libressl-portable/portable.git && + cd ${HOME}/libressl/portable && + git checkout ${INSTALL_LIBRESSL} && + sh update.sh && sh autogen.sh && + ./configure --prefix=/opt/libressl && + make && sudo make install) else - LIBRESSL_URLBASE=https://cdn.openbsd.org/pub/OpenBSD/LibreSSL - (cd ${HOME} && - wget ${LIBRESSL_URLBASE}/libressl-${INSTALL_LIBRESSL}.tar.gz && - tar xfz libressl-${INSTALL_LIBRESSL}.tar.gz && - cd libressl-${INSTALL_LIBRESSL} && - ./configure --prefix=/opt/libressl && make && sudo make install) + LIBRESSL_URLBASE=https://cdn.openbsd.org/pub/OpenBSD/LibreSSL + (cd ${HOME} && + wget ${LIBRESSL_URLBASE}/libressl-${INSTALL_LIBRESSL}.tar.gz && + tar xfz libressl-${INSTALL_LIBRESSL}.tar.gz && + cd libressl-${INSTALL_LIBRESSL} && + ./configure --prefix=/opt/libressl && make && sudo make install) fi fi From a5ecfdc21864b29ef9a939b9cfe7a2a8ffcdf439 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 2 Jul 2026 10:05:43 +1000 Subject: [PATCH 174/196] Need clang >= 19 for constexpr in hardened_malloc. --- .github/setup_ci.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index c8314025d9da..6ab4e4fb56f2 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -147,6 +147,8 @@ for TARGET in $TARGETS; do ;; hardenedmalloc) INSTALL_HARDENED_MALLOC=yes + # Need clang >= 19 for constexpr. + PACKAGES="$PACKAGES clang-19" ;; musl) PACKAGES="$PACKAGES musl-tools" @@ -245,7 +247,7 @@ if [ "${INSTALL_HARDENED_MALLOC}" = "yes" ]; then (cd ${HOME} && git clone https://github.com/GrapheneOS/hardened_malloc.git && cd ${HOME}/hardened_malloc && - make CC=clang && sudo cp out/libhardened_malloc.so /usr/lib/) + make CC=clang-19 && sudo cp out/libhardened_malloc.so /usr/lib/) fi if [ ! -z "${INSTALL_OPENSSL}" ]; then From 85dcff277e7a5299ec13af12517aefb123b1aa95 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Fri, 3 Jul 2026 12:31:27 +1000 Subject: [PATCH 175/196] revise README.privsep for multi-binary model This rewrites most of the privsep description to more accurately capture recent changes in how sshd managed privilege across its lifecycle, including describing the roles of the sshd-session and sshd-auth helper binaries. Also 100% more ASCII art --- README.privsep | 180 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 149 insertions(+), 31 deletions(-) diff --git a/README.privsep b/README.privsep index d658c46db11e..8244d25212c3 100644 --- a/README.privsep +++ b/README.privsep @@ -1,15 +1,134 @@ -Privilege separation, or privsep, is method in OpenSSH by which +Privilege separation, or privsep, is a method in OpenSSH by which operations that require root privilege are performed by a separate -privileged monitor process. Its purpose is to prevent privilege -escalation by containing corruption to an unprivileged process. -More information is available at: - http://www.citi.umich.edu/u/provos/ssh/privsep.html +privileged monitor process. Its purpose is to prevent privilege +escalation by: -Privilege separation is now mandatory. During the pre-authentication -phase sshd will chroot(2) to "/var/empty" and change its privileges to the -"sshd" user and its primary group. sshd is a pseudo-account that should -not be used by other daemons, and must be locked and should contain a -"nologin" or invalid shell. + - reducing the privileged attack surface by performing most + operations with untrusted data in unprivileged code, + - facilitating OS-level sandboxing of the components that are most + exposed to attack, + - reducing information-sharing between privileged and + unprivileged code, and + - containing attacks as much as possible the unprivileged process, + should they occur. + +To achieve privilege separation in OpenSSH's sshd, the functions +it performs are split across three discrete binaries: + +sshd is the main entry-point binary for the server. This binary +retains privilege but performs a very limited set of tasks: loading +and checking the configuration, listening for incoming connections +and monitoring the status of connections through the +pre-authentication phase of their lifecycle to implement the +MaxStartups and PerSourcePenalties features. + +Apart from listening for and accepting connections, the sshd binary +deals with no untrusted, network-derived data; instead it forks and +executes the sshd-session binary for each new connection. + ++---------------------------------------------------------------+ +| | +| listening socket +-------------------+ | +| \--------------+ sshd (listener) | | +| +--------++---------+ | +| || | +| || fork+exec | +| || | +| +--------------++------------------+ | +| | sshd-session (preauth monitor) | | +| +--------------++------------------+ | +| || | +| || fork+exec | +| || | +| network socket +------------++--------------+ | +| \-----------+ sshd-auth (unprivileged) | | +| +------------++--------------+ | +| | ++---------------------------------------------------------------+ + pre-authentication process structure + +sshd-session initially acts as the privileged monitor process for +a connection before it completes authentication. During this phase, +it does not deal directly with network-derived data, but forks and +executes a third binary (sshd-auth, described next) to handle the +SSH protocol communication over the network socket. sshd-session +receives RPC messages from the sshd-auth subprocess when it needs +to perform privileged operations, such as verifying an account's +existence, signing with a host key, or checking a user's password. +The monitor process implements a loose state machine that enforces +the required structure and order of operations that sshd-auth may +request. + +sshd-auth is the network-facing process that implements the initial +key agreement and authentication phase of the SSH protocol. It is +started with privilege, but will sandbox and/or chroot(2) itself +and drop privilege to an unprivileged account before processing +any network traffic. All operations that require privilege, such as +looking up user information, private key signatures, checking +passwords, etc are performed by RPC to the parent sshd-session +process. After authentication completes, sshd-auth serialises its +SSH protocol and connection state, exports this to the parent +sshd-session process and exits. + +Communication between parent and child processes occurs over shared +file descriptors. Parent processes also monitor their children for +abnormal exit conditions, such as crashes or signalling via exit(3) +status. These conditions are used in sshd to implement the +PerSourcePenalties controls. + ++---------------------------------------------------------------+ +| | +| +---------------++------------------+ | +| | sshd-session (postauth monitor) | | +| +---------------++------------------+ | +| || | +| || fork+exec | +| || | +| network socket +--------------++---------------+ | +| \-----------+ sshd-session (unprivileged) | | +| +--------------++---------------+ | +| | ++---------------------------------------------------------------+ + post-authentication process structure + +After authentication, sshd-session disconnects from its parent +listener sshd (which doesn't track connections after authentication +has succeeded) and forks again. The forked sshd-session child process +will drop privilege to that of the authenticated user, import the +previously-serialised connection state from sshd-auth and continue to +perform network and SSH protocol operations for the remainder of the +session. + +The parent sshd-session process continues to act as a privileged +monitor process, performing actions that require privilege when +requested via RPC. These operations include allocating PTYs and +signing key re-exchange messages. + +In portable OpenSSH several compile-time options affect privilege +separation: + + --with-sandbox=style + +Controls the sandboxing implementation used by sshd-auth. OS level +sandboxing is supported on a number of platforms. A fallback +rlimit(2)-based sandbox provides some basic control on a wider set +of platforms. + + --with-privsep-user=user + +Specifies the unprivileged user that sshd-auth will switch to +before it starts handling untrusted data. This user must not be +shared with any other system service, should own no files, should +have a locked password, a shell that denies access (such as +/bin/nologin or /bin/false) and the home directory set to the +privilege separation path. + + --with-privsep-path=/path + +Controls the directory that sshd-auth will chroot(2) to before +dropping privileges. This directory should be empty, not shared +with other system accounts and not readable or writable by the +sandbox user. You should do something like the following to prepare the privsep preauth environment: @@ -20,32 +139,31 @@ preauth environment: # groupadd sshd # useradd -g sshd -c 'sshd privsep' -d /var/empty -s /bin/false sshd -/var/empty should not contain any files. +On some platforms, only the pre-authentication part of privsep is +supported, and the post-authentication part is disabled due to lack +of support from the operating system. -configure supports the following options to change the default -privsep user and chroot directory: +This is an example process list for a connection in the +pre-authentication phase: - --with-privsep-path=xxx Path for privilege separation chroot - --with-privsep-user=user Specify non-privileged user for privilege separation + PID PPID UID CMD -PAM-enabled OpenSSH is known to function with privsep on AIX, FreeBSD, -HP-UX (including Trusted Mode), Linux, NetBSD and Solaris. + 1436 1 0 sshd: /usr/sbin/sshd -D [listener] 1 of 10-100 startups + 47077 1436 0 sshd-session: djm [priv] + 47078 47077 107 sshd-auth: djm [net] -On Cygwin, Tru64 Unix and OpenServer only the pre-authentication part -of privsep is supported. Post-authentication privsep is disabled -automatically (so you won't see the additional process mentioned below). +Where process 1436 is the listener, 47077 is the privileged +sshd-session monitor process and 47078 is the unprivileged, +network-facing sshd-auth process. -Note that for a normal interactive login with a shell, enabling privsep -will require 1 additional process per login session. +And in the post-authentication phase: -Given the following process listing (from HP-UX): + PID PPID UID CMD + 47077 1436 0 sshd-session: djm [priv] + 47091 47077 1000 sshd-session: djm@pts/1 + 47092 47091 1000 -bash - UID PID PPID C STIME TTY TIME COMMAND - root 1005 1 0 10:45:17 ? 0:08 /opt/openssh/sbin/sshd -u0 - root 6917 1005 0 15:19:16 ? 0:00 sshd: stevesk [priv] - stevesk 6919 6917 0 15:19:17 ? 0:03 sshd: stevesk@2 - stevesk 6921 6919 0 15:19:17 pts/2 0:00 -bash +Where process 47077 continues its role as a privileged monitor, +47091 is the user-privileged network-facing post-authentication +process and 47092 is the user shell started for the session. -process 1005 is the sshd process listening for new connections. -process 6917 is the privileged monitor process, 6919 is the user owned -sshd process and 6921 is the shell process. From 01ed1c648a2c42e85e73cac3b7647f1cddc4abba Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Fri, 3 Jul 2026 12:49:26 +1000 Subject: [PATCH 176/196] tweak previous --- README.privsep | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.privsep b/README.privsep index 8244d25212c3..79617d90345f 100644 --- a/README.privsep +++ b/README.privsep @@ -1,7 +1,7 @@ Privilege separation, or privsep, is a method in OpenSSH by which operations that require root privilege are performed by a separate privileged monitor process. Its purpose is to prevent privilege -escalation by: +escalation and mitigate attacks by: - reducing the privileged attack surface by performing most operations with untrusted data in unprivileged code, @@ -82,7 +82,7 @@ PerSourcePenalties controls. | | sshd-session (postauth monitor) | | | +---------------++------------------+ | | || | -| || fork+exec | +| || fork | | || | | network socket +--------------++---------------+ | | \-----------+ sshd-session (unprivileged) | | From f80e6545ee9eb60b3fb8b0097fcc12aad47a54b4 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Fri, 3 Jul 2026 13:33:16 +1000 Subject: [PATCH 177/196] tweak; from dlg@ --- README.privsep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.privsep b/README.privsep index 79617d90345f..871e6a2ea2c4 100644 --- a/README.privsep +++ b/README.privsep @@ -23,7 +23,7 @@ pre-authentication phase of their lifecycle to implement the MaxStartups and PerSourcePenalties features. Apart from listening for and accepting connections, the sshd binary -deals with no untrusted, network-derived data; instead it forks and +does not handle untrusted, network-derived data; instead it forks and executes the sshd-session binary for each new connection. +---------------------------------------------------------------+ From 3912be7baa05819c382ce0e5d0ef847c9d80f230 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Fri, 3 Jul 2026 14:10:16 +1000 Subject: [PATCH 178/196] more README.privsep polish --- README.privsep | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.privsep b/README.privsep index 871e6a2ea2c4..f8602ccd3ab4 100644 --- a/README.privsep +++ b/README.privsep @@ -4,7 +4,7 @@ privileged monitor process. Its purpose is to prevent privilege escalation and mitigate attacks by: - reducing the privileged attack surface by performing most - operations with untrusted data in unprivileged code, + operations involving untrusted data in unprivileged code, - facilitating OS-level sandboxing of the components that are most exposed to attack, - reducing information-sharing between privileged and From c123ac1c579212c08c17d927cb8e379d45f9fccb Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Fri, 3 Jul 2026 14:16:29 +1000 Subject: [PATCH 179/196] more config option details in README.privsep --- README.privsep | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.privsep b/README.privsep index f8602ccd3ab4..da9c2d316f50 100644 --- a/README.privsep +++ b/README.privsep @@ -112,7 +112,10 @@ separation: Controls the sandboxing implementation used by sshd-auth. OS level sandboxing is supported on a number of platforms. A fallback rlimit(2)-based sandbox provides some basic control on a wider set -of platforms. +of platforms. Most supported sandboxes are detected and enabled +automatically, so this option is mostly used to disable the sandbox +(this is handy when debugging or running under tools like +AddressSanitizer). --with-privsep-user=user @@ -121,14 +124,15 @@ before it starts handling untrusted data. This user must not be shared with any other system service, should own no files, should have a locked password, a shell that denies access (such as /bin/nologin or /bin/false) and the home directory set to the -privilege separation path. +privilege separation path. For most platforms the default user is +"sshd". --with-privsep-path=/path Controls the directory that sshd-auth will chroot(2) to before dropping privileges. This directory should be empty, not shared with other system accounts and not readable or writable by the -sandbox user. +sandbox user. The default privsep path is "/var/empty". You should do something like the following to prepare the privsep preauth environment: From aab5620a66777afbe9e0939b4961e5751d6e7938 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Fri, 3 Jul 2026 14:20:02 +1000 Subject: [PATCH 180/196] grammar fix; from Daniel O'Connor --- README.privsep | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.privsep b/README.privsep index da9c2d316f50..27995d9a1875 100644 --- a/README.privsep +++ b/README.privsep @@ -9,8 +9,8 @@ escalation and mitigate attacks by: exposed to attack, - reducing information-sharing between privileged and unprivileged code, and - - containing attacks as much as possible the unprivileged process, - should they occur. + - containing attacks as much as possible to the unprivileged + process, should they occur. To achieve privilege separation in OpenSSH's sshd, the functions it performs are split across three discrete binaries: From 93d6348ae44491b7542d78c0d55da7130e9db017 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 5 Jul 2026 00:16:21 +0000 Subject: [PATCH 181/196] upstream: fix inverted test that broke ssh-add with keys on stdin. From Laurence Tratt OpenBSD-Commit-ID: bcef522cfa587c7cf035660bb347cff36b65bfbd --- sshbuf-io.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sshbuf-io.c b/sshbuf-io.c index 2c1fb4544e2e..426b7e2343c0 100644 --- a/sshbuf-io.c +++ b/sshbuf-io.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf-io.c,v 1.3 2026/06/29 09:14:25 djm Exp $ */ +/* $OpenBSD: sshbuf-io.c,v 1.4 2026/07/05 00:16:21 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -61,7 +61,7 @@ sshbuf_load_fd(int fd, struct sshbuf **blobp) goto out; } } - if (S_ISREG(st.st_mode) == 0 && + if (S_ISREG(st.st_mode) != 0 && st.st_size != (off_t)sshbuf_len(blob)) { r = SSH_ERR_FILE_CHANGED; goto out; From cf67d46cba77d493152830a108b5f294ee9c5140 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Sun, 5 Jul 2026 02:46:44 +0000 Subject: [PATCH 182/196] upstream: void functions should not return anything. Patch from Tim Rice. OpenBSD-Commit-ID: bb5021b2b45d9d3f54a012d569872805d107f59c --- ssh-agent.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ssh-agent.c b/ssh-agent.c index a8bbf8d73a67..5fc73d6971cd 100644 --- a/ssh-agent.c +++ b/ssh-agent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-agent.c,v 1.329 2026/06/13 00:37:13 djm Exp $ */ +/* $OpenBSD: ssh-agent.c,v 1.330 2026/07/05 02:46:44 dtucker Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -613,7 +613,7 @@ send_status_generic(SocketEntry *e, u_int code) static void send_status(SocketEntry *e, int success) { - return send_status_generic(e, + send_status_generic(e, success ? SSH_AGENT_SUCCESS : SSH_AGENT_FAILURE); } From d43ba60c91cb323ca921049b7d43b1908c318454 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 6 Jul 2026 07:44:48 +0000 Subject: [PATCH 183/196] upstream: Fix cases in GSSAPI and keyboard-interactive authentication where the minimum per-attempt delay was not being enforced. Reported by Orange Cyberdefense Vulnerability Team OpenBSD-Commit-ID: c40bd35cc2428fcaccad7a141703c28baa6da01e --- auth.h | 3 ++- auth2-chall.c | 6 +++++- auth2-gss.c | 9 ++++++++- auth2.c | 12 +++++++++--- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/auth.h b/auth.h index 634a84aa85f7..0f11458ca2c8 100644 --- a/auth.h +++ b/auth.h @@ -1,4 +1,4 @@ -/* $OpenBSD: auth.h,v 1.109 2026/02/06 01:24:36 djm Exp $ */ +/* $OpenBSD: auth.h,v 1.110 2026/07/06 07:44:48 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. @@ -175,6 +175,7 @@ void auth_log(struct ssh *, int, int, const char *, const char *); void auth_maxtries_exceeded(struct ssh *) __attribute__((noreturn)); void userauth_finish(struct ssh *, int, const char *, const char *); int auth_root_allowed(struct ssh *, const char *); +void auth_failure_delay(Authctxt *, double); char *auth2_read_banner(void); int auth2_methods_valid(const char *, int); diff --git a/auth2-chall.c b/auth2-chall.c index f3889079b64f..8a23ca2dca2a 100644 --- a/auth2-chall.c +++ b/auth2-chall.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth2-chall.c,v 1.60 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: auth2-chall.c,v 1.61 2026/07/06 07:44:48 djm Exp $ */ /* * Copyright (c) 2001 Markus Friedl. All rights reserved. * Copyright (c) 2001 Per Allansson. All rights reserved. @@ -300,6 +300,7 @@ input_userauth_info_response(int type, uint32_t seq, struct ssh *ssh) u_int i, nresp; const char *devicename = NULL; char **response = NULL; + double tstart = monotime_double(); if (authctxt == NULL) fatal_f("no authctxt"); @@ -358,6 +359,9 @@ input_userauth_info_response(int type, uint32_t seq, struct ssh *ssh) auth2_challenge_start(ssh); } } + + if (!authenticated) + auth_failure_delay(authctxt, tstart); userauth_finish(ssh, authenticated, "keyboard-interactive", devicename); return 0; diff --git a/auth2-gss.c b/auth2-gss.c index 0535485277a6..355926afcd6e 100644 --- a/auth2-gss.c +++ b/auth2-gss.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth2-gss.c,v 1.39 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: auth2-gss.c,v 1.40 2026/07/06 07:44:48 djm Exp $ */ /* * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved. @@ -255,6 +255,7 @@ input_gssapi_exchange_complete(int type, uint32_t plen, struct ssh *ssh) { Authctxt *authctxt = ssh->authctxt; int r, authenticated; + double tstart = monotime_double(); if (authctxt == NULL) fatal("No authentication or GSSAPI context"); @@ -268,6 +269,8 @@ input_gssapi_exchange_complete(int type, uint32_t plen, struct ssh *ssh) fatal_fr(r, "parse packet"); authenticated = mm_ssh_gssapi_userok(authctxt->user); + if (!authenticated) + auth_failure_delay(authctxt, tstart); authctxt->postponed = 0; ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL); @@ -288,6 +291,7 @@ input_gssapi_mic(int type, uint32_t plen, struct ssh *ssh) gss_buffer_desc mic, gssbuf; u_char *p; size_t len; + double tstart = monotime_double(); if (authctxt == NULL) fatal("No authentication or GSSAPI context"); @@ -315,6 +319,9 @@ input_gssapi_mic(int type, uint32_t plen, struct ssh *ssh) sshbuf_free(b); free(mic.value); + if (!authenticated) + auth_failure_delay(authctxt, tstart); + authctxt->postponed = 0; ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL); ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, NULL); diff --git a/auth2.c b/auth2.c index 3a168274631e..3f353a719ba0 100644 --- a/auth2.c +++ b/auth2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth2.c,v 1.173 2026/03/03 09:57:25 dtucker Exp $ */ +/* $OpenBSD: auth2.c,v 1.174 2026/07/06 07:44:48 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * @@ -265,6 +265,12 @@ ensure_minimum_time_since(double start, double seconds) nanosleep(&ts, NULL); } +void +auth_failure_delay(Authctxt *authctxt, double tstart) +{ + ensure_minimum_time_since(tstart, user_specific_delay(authctxt->user)); +} + static int input_userauth_request(int type, uint32_t seq, struct ssh *ssh) { @@ -346,8 +352,8 @@ input_userauth_request(int type, uint32_t seq, struct ssh *ssh) authenticated = m->userauth(ssh, method); } if (!authctxt->authenticated && strcmp(method, "none") != 0) - ensure_minimum_time_since(tstart, - user_specific_delay(authctxt->user)); + auth_failure_delay(authctxt, tstart); + userauth_finish(ssh, authenticated, method, NULL); r = 0; out: From e8bdfb151a356d0171fea4194dd205fbb252be23 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 6 Jul 2026 07:49:58 +0000 Subject: [PATCH 184/196] upstream: fix ownership and lifetime of several bits of client state that need to persist for the life of the connection, especially the cached hostkey that was being incorrectly freed early on some paths, possibly allowing its use after free. Reported by Zhenpeng (Leo) Lin from depthfirst.com OpenBSD-Commit-ID: faaa6ad72e7d69d41fa8b197b606265b7d9bc73f --- ssh.c | 26 +++----------------------- sshconnect.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- sshconnect.h | 9 ++++++--- sshconnect2.c | 22 ++++++++++++---------- 4 files changed, 67 insertions(+), 39 deletions(-) diff --git a/ssh.c b/ssh.c index 5a160c8c1352..7c644c23c214 100644 --- a/ssh.c +++ b/ssh.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh.c,v 1.633 2026/06/14 03:59:34 djm Exp $ */ +/* $OpenBSD: ssh.c,v 1.634 2026/07/06 07:49:58 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -613,26 +613,6 @@ set_addrinfo_port(struct addrinfo *addrs, int port) } } -static void -ssh_conn_info_free(struct ssh_conn_info *cinfo) -{ - if (cinfo == NULL) - return; - free(cinfo->conn_hash_hex); - free(cinfo->shorthost); - free(cinfo->uidstr); - free(cinfo->keyalias); - free(cinfo->thishost); - free(cinfo->host_arg); - free(cinfo->portstr); - free(cinfo->remhost); - free(cinfo->remuser); - free(cinfo->homedir); - free(cinfo->locuser); - free(cinfo->jmphost); - free(cinfo); -} - /* * Main program for the ssh client. */ @@ -1803,8 +1783,8 @@ main(int ac, char **av) ssh_signal(SIGCHLD, main_sigchld_handler); /* Log into the remote system. Never returns if the login fails. */ - ssh_login(ssh, &sensitive_data, host, (struct sockaddr *)&hostaddr, - options.port, pw, timeout_ms, cinfo); + ssh_login(ssh, &sensitive_data, host, &hostaddr, options.port, + pw, timeout_ms, cinfo); /* We no longer need the private host keys. Clear them now. */ if (sensitive_data.nkeys != 0) { diff --git a/sshconnect.c b/sshconnect.c index 2fc1f6026eb2..0ddfc76b367b 100644 --- a/sshconnect.c +++ b/sshconnect.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect.c,v 1.383 2026/06/14 03:59:34 djm Exp $ */ +/* $OpenBSD: sshconnect.c,v 1.384 2026/07/06 07:49:58 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -70,6 +70,49 @@ extern char *__progname; static int show_other_keys(struct hostkeys *, struct sshkey *); static void warn_changed_key(struct sshkey *); +void +ssh_conn_info_free(struct ssh_conn_info *cinfo) +{ + if (cinfo == NULL) + return; + free(cinfo->conn_hash_hex); + free(cinfo->shorthost); + free(cinfo->uidstr); + free(cinfo->keyalias); + free(cinfo->thishost); + free(cinfo->host_arg); + free(cinfo->portstr); + free(cinfo->remhost); + free(cinfo->remuser); + free(cinfo->homedir); + free(cinfo->locuser); + free(cinfo->jmphost); + freezero(cinfo, sizeof(*cinfo)); +} + +struct ssh_conn_info * +ssh_conn_info_dup(const struct ssh_conn_info *cinfo) +{ + struct ssh_conn_info *ret; + + if (cinfo == NULL) + return NULL; + ret = xcalloc(1, sizeof(*ret)); + ret->conn_hash_hex = xstrdup(cinfo->conn_hash_hex); + ret->shorthost = xstrdup(cinfo->shorthost); + ret->uidstr = xstrdup(cinfo->uidstr); + ret->keyalias = xstrdup(cinfo->keyalias); + ret->thishost = xstrdup(cinfo->thishost); + ret->host_arg = xstrdup(cinfo->host_arg); + ret->portstr = xstrdup(cinfo->portstr); + ret->remhost = xstrdup(cinfo->remhost); + ret->remuser = xstrdup(cinfo->remuser); + ret->homedir = xstrdup(cinfo->homedir); + ret->locuser = xstrdup(cinfo->locuser); + ret->jmphost = xstrdup(cinfo->jmphost); + return ret; +} + /* Expand a proxy command */ static char * expand_proxy_command(const char *proxy_command, const char *user, @@ -1585,8 +1628,8 @@ warn_nonpq_kex(void) */ void ssh_login(struct ssh *ssh, Sensitive *sensitive, const char *orighost, - struct sockaddr *hostaddr, u_short port, struct passwd *pw, int timeout_ms, - const struct ssh_conn_info *cinfo) + struct sockaddr_storage *hostaddr, u_short port, struct passwd *pw, + int timeout_ms, const struct ssh_conn_info *cinfo) { char *host; char *server_user, *local_user; diff --git a/sshconnect.h b/sshconnect.h index 4c19490da487..2ac2c07e005a 100644 --- a/sshconnect.h +++ b/sshconnect.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect.h,v 1.50 2026/02/13 01:04:47 jsg Exp $ */ +/* $OpenBSD: sshconnect.h,v 1.51 2026/07/06 07:49:58 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. @@ -76,7 +76,7 @@ int ssh_connect(struct ssh *, const char *, const char *, void ssh_kill_proxy_command(void); void ssh_login(struct ssh *, Sensitive *, const char *, - struct sockaddr *, u_short, struct passwd *, int, + struct sockaddr_storage *, u_short, struct passwd *, int, const struct ssh_conn_info *); int verify_host_key(char *, struct sockaddr *, struct sshkey *, @@ -85,7 +85,7 @@ int verify_host_key(char *, struct sockaddr *, struct sshkey *, void get_hostfile_hostname_ipaddr(char *, struct sockaddr *, u_short, char **, char **); -void ssh_kex2(struct ssh *ssh, char *, struct sockaddr *, u_short, +void ssh_kex2(struct ssh *ssh, char *, struct sockaddr_storage *, u_short, const struct ssh_conn_info *); void ssh_userauth2(struct ssh *ssh, const char *, const char *, @@ -101,3 +101,6 @@ void load_hostkeys_command(struct hostkeys *, const char *, const struct sshkey *, const char *); int hostkey_accepted_by_hostkeyalgs(const struct sshkey *); + +void ssh_conn_info_free(struct ssh_conn_info *); +struct ssh_conn_info *ssh_conn_info_dup(const struct ssh_conn_info *); diff --git a/sshconnect2.c b/sshconnect2.c index ecb4ae524ee7..d1555ee97274 100644 --- a/sshconnect2.c +++ b/sshconnect2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect2.c,v 1.387 2026/06/28 23:31:28 djm Exp $ */ +/* $OpenBSD: sshconnect2.c,v 1.388 2026/07/06 07:49:58 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2008 Damien Miller. All rights reserved. @@ -83,7 +83,7 @@ extern Options options; */ static char *xxx_host; -static struct sockaddr *xxx_hostaddr; +static struct sockaddr_storage xxx_hostaddr; static const struct ssh_conn_info *xxx_conn_info; static int key_type_allowed(struct sshkey *, const char *); @@ -99,7 +99,7 @@ verify_host_key_callback(struct sshkey *hostkey, struct ssh *ssh) fatal("Server host key %s not in HostKeyAlgorithms", sshkey_ssh_name(hostkey)); } - if (verify_host_key(xxx_host, xxx_hostaddr, hostkey, + if (verify_host_key(xxx_host, (struct sockaddr *)&xxx_hostaddr, hostkey, xxx_conn_info) != 0) fatal("Host key verification failed."); return 0; @@ -216,16 +216,16 @@ order_hostkeyalgs(char *host, struct sockaddr *hostaddr, u_short port, } void -ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, - const struct ssh_conn_info *cinfo) +ssh_kex2(struct ssh *ssh, char *host, struct sockaddr_storage *hostaddr, + u_short port, const struct ssh_conn_info *cinfo) { char *myproposal[PROPOSAL_MAX]; char *all_key, *hkalgs = NULL; int r, use_known_hosts_order = 0; - xxx_host = host; - xxx_hostaddr = hostaddr; - xxx_conn_info = cinfo; + xxx_host = xstrdup(host); + xxx_hostaddr = *hostaddr; + xxx_conn_info = ssh_conn_info_dup(cinfo); if (options.rekey_limit || options.rekey_interval) ssh_packet_set_rekey_limits(ssh, options.rekey_limit, @@ -248,8 +248,10 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, fatal_fr(r, "kex_assemble_namelist"); free(all_key); - if (use_known_hosts_order) - hkalgs = order_hostkeyalgs(host, hostaddr, port, cinfo); + if (use_known_hosts_order) { + hkalgs = order_hostkeyalgs(host, (struct sockaddr *)hostaddr, + port, cinfo); + } kex_proposal_populate_entries(ssh, myproposal, options.kex_algorithms, options.ciphers, options.macs, From 5d04ca6af739b82fd30d84d2783ca802ebfa1192 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 6 Jul 2026 07:53:30 +0000 Subject: [PATCH 185/196] upstream: Fix multiple RFC 4462 (GSSAPIAuthentication) compliance problems 1) Remove an early failure return for GSSAPI authentication attempts made for invalid accounts that yielded different behaviour for valid vs invalid accounts. 2) Fix a situation where some GSSAPI requestes were not correctly subjected to MaxAuthTries. 3) Fix a moderate pre-authentication resource DoS related to #2. Add missing logging for error cases. Report and fixes from Manfred Kaiser, milCERT AT OpenBSD-Commit-ID: ca0acdd64eea435d6f89534538a9eb404a5629d3 --- auth2-gss.c | 55 ++++++++++++++++++++++++----------------------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/auth2-gss.c b/auth2-gss.c index 355926afcd6e..85251b7d0b57 100644 --- a/auth2-gss.c +++ b/auth2-gss.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth2-gss.c,v 1.40 2026/07/06 07:44:48 djm Exp $ */ +/* $OpenBSD: auth2-gss.c,v 1.41 2026/07/06 07:53:30 djm Exp $ */ /* * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved. @@ -111,12 +111,6 @@ userauth_gssapi(struct ssh *ssh, const char *method) return (0); } - if (!authctxt->valid || authctxt->user == NULL) { - debug2_f("disabled because of invalid user"); - free(doid); - return (0); - } - if (GSS_ERROR(mm_ssh_gssapi_server_ctx(&ctxt, &goid))) { if (ctxt != NULL) ssh_gssapi_delete_ctx(&ctxt); @@ -178,8 +172,14 @@ input_gssapi_token(int type, uint32_t plen, struct ssh *ssh) (r = sshpkt_send(ssh)) != 0) fatal_fr(r, "send ERRTOK packet"); } + logit("Failed gssapi-with-mic for %s%.100s " + "from %.200s port %d ssh2", + authctxt->valid ? "" : "invalid user ", + authctxt->user, + ssh_remote_ipaddr(ssh), ssh_remote_port(ssh)); authctxt->postponed = 0; ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL); + ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, NULL); userauth_finish(ssh, 0, "gssapi-with-mic", NULL); } else { if (send_tok.length != 0) { @@ -191,14 +191,18 @@ input_gssapi_token(int type, uint32_t plen, struct ssh *ssh) fatal_fr(r, "send TOKEN packet"); } if (maj_status == GSS_S_COMPLETE) { - ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL); - if (flags & GSS_C_INTEG_FLAG) - ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_MIC, + ssh_dispatch_set(ssh, + SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL); + /* note: keep ERRTOK handler as per RFC 4462 s3.4 */ + if (flags & GSS_C_INTEG_FLAG) { + ssh_dispatch_set(ssh, + SSH2_MSG_USERAUTH_GSSAPI_MIC, &input_gssapi_mic); - else + } else { ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE, &input_gssapi_exchange_complete); + } } } @@ -210,10 +214,6 @@ static int input_gssapi_errtok(int type, uint32_t plen, struct ssh *ssh) { Authctxt *authctxt = ssh->authctxt; - Gssctxt *gssctxt; - gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER; - gss_buffer_desc recv_tok; - OM_uint32 maj_status; int r; u_char *p; size_t len; @@ -221,26 +221,21 @@ input_gssapi_errtok(int type, uint32_t plen, struct ssh *ssh) if (authctxt == NULL) fatal("No authentication or GSSAPI context"); - gssctxt = authctxt->methoddata; - if ((r = sshpkt_get_string(ssh, &p, &len)) != 0 || + /* Minimal error handling - just cancel auth and return FAILURE */ + if ((r = sshpkt_get_string_direct(ssh, NULL, NULL)) != 0 || (r = sshpkt_get_end(ssh)) != 0) fatal_fr(r, "parse packet"); - recv_tok.value = p; - recv_tok.length = len; - - /* Push the error token into GSSAPI to see what it says */ - maj_status = mm_ssh_gssapi_accept_ctx(gssctxt, &recv_tok, - &send_tok, NULL); - - free(recv_tok.value); - /* We can't return anything to the client, even if we wanted to */ + logit("Failed gssapi-with-mic for %s%.100s from %.200s port %d ssh2", + authctxt->valid ? "" : "invalid user ", + authctxt->user, + ssh_remote_ipaddr(ssh), ssh_remote_port(ssh)); + authctxt->postponed = 0; ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL); ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, NULL); - - /* The client will have already moved on to the next auth */ - - gss_release_buffer(&maj_status, &send_tok); + ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_MIC, NULL); + ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE, NULL); + userauth_finish(ssh, 0, "gssapi-with-mic", NULL); return 0; } From 0210c7cc942ee54bd6a647d5732df9786c4b08d0 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 6 Jul 2026 07:54:26 +0000 Subject: [PATCH 186/196] upstream: openssh-10.4 OpenBSD-Commit-ID: ce7b0749e5139c70410ee92a13d368d7d34262b5 --- version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/version.h b/version.h index fceafae97661..e26bb18d9086 100644 --- a/version.h +++ b/version.h @@ -1,6 +1,6 @@ -/* $OpenBSD: version.h,v 1.108 2026/04/02 07:51:12 djm Exp $ */ +/* $OpenBSD: version.h,v 1.109 2026/07/06 07:54:26 djm Exp $ */ -#define SSH_VERSION "OpenSSH_10.3" +#define SSH_VERSION "OpenSSH_10.4" #define SSH_PORTABLE "p1" #define SSH_RELEASE SSH_VERSION SSH_PORTABLE From 0227fe4606ebf86b3f6f9b80af12e171eaa58416 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 6 Jul 2026 17:56:10 +1000 Subject: [PATCH 187/196] crank version numbers --- contrib/redhat/openssh.spec | 2 +- contrib/suse/openssh.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/redhat/openssh.spec b/contrib/redhat/openssh.spec index 735d532d04aa..e81f623c2d7a 100644 --- a/contrib/redhat/openssh.spec +++ b/contrib/redhat/openssh.spec @@ -1,4 +1,4 @@ -%global ver 10.3p1 +%global ver 10.4p1 %global rel 1%{?dist} # OpenSSH privilege separation requires a user & group ID diff --git a/contrib/suse/openssh.spec b/contrib/suse/openssh.spec index 1ca2db16a14d..a7700860f3f6 100644 --- a/contrib/suse/openssh.spec +++ b/contrib/suse/openssh.spec @@ -13,7 +13,7 @@ Summary: OpenSSH, a free Secure Shell (SSH) protocol implementation Name: openssh -Version: 10.3p1 +Version: 10.4p1 URL: https://www.openssh.com/ Release: 1 Source0: openssh-%{version}.tar.gz From 449d25b4f8b8d3bb55a865ebcbec17b39b37c208 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 6 Jul 2026 17:56:53 +1000 Subject: [PATCH 188/196] depend --- .depend | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.depend b/.depend index ecb33594981d..03e8c423d3ab 100644 --- a/.depend +++ b/.depend @@ -73,6 +73,7 @@ kexgexs.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compa kexmlkem768x25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshkey.h kex.h mac.h crypto_api.h sshbuf.h digest.h ssherr.h log.h kexsntrup761x25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h krl.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshbuf.h ssherr.h sshkey.h misc.h log.h digest.h bitmap.h utf8.h krl.h +libcrux-mlkem-mldsa.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h match.h loginrec.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshkey.h hostfile.h ssh.h loginrec.h log.h ssherr.h atomicio.h packet.h dispatch.h canohost.h auth.h auth-pam.h audit.h sshbuf.h misc.h logintest.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h loginrec.h @@ -136,6 +137,7 @@ ssh-keygen.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-co ssh-keyscan.o: atomicio.h misc.h hostfile.h ssh_api.h ssh2.h dns.h addr.h ssh-keyscan.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h sshbuf.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h digest.h kex.h mac.h crypto_api.h compat.h myproposal.h packet.h dispatch.h log.h ssherr.h ssh-keysign.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h ssherr.h sshkey.h ssh.h ssh2.h misc.h sshbuf.h authfile.h msg.h canohost.h pathnames.h readconf.h uidswap.h +ssh-mldsa-eddsa.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh-pkcs11-client.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h pathnames.h xmalloc.h sshbuf.h log.h ssherr.h misc.h sshkey.h authfd.h atomicio.h ssh-pkcs11.h ssh-pkcs11-helper.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshbuf.h log.h ssherr.h misc.h sshkey.h authfd.h ssh-pkcs11.h ssh-pkcs11.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h sshkey.h ssh-pkcs11.h From e8dd756725e8800fcd0b3fd71ee6b4382d1e8fab Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 6 Jul 2026 17:57:12 +1000 Subject: [PATCH 189/196] autogenerated files for release --- .gitignore | 6 - ChangeLog | 11147 +++++++++++++++++ aclocal.m4 | 15 + config.h.in | 2114 ++++ configure | 28446 ++++++++++++++++++++++++++++++++++++++++++ moduli.0 | 74 + scp.0 | 273 + sftp-server.0 | 102 + sftp.0 | 477 + ssh-add.0 | 219 + ssh-agent.0 | 180 + ssh-keygen.0 | 914 ++ ssh-keyscan.0 | 129 + ssh-keysign.0 | 50 + ssh-pkcs11-helper.0 | 35 + ssh-sk-helper.0 | 34 + ssh.0 | 1034 ++ ssh_config.0 | 1513 +++ sshd.0 | 687 + sshd_config.0 | 1459 +++ 20 files changed, 48902 insertions(+), 6 deletions(-) create mode 100644 ChangeLog create mode 100644 aclocal.m4 create mode 100644 config.h.in create mode 100755 configure create mode 100644 moduli.0 create mode 100644 scp.0 create mode 100644 sftp-server.0 create mode 100644 sftp.0 create mode 100644 ssh-add.0 create mode 100644 ssh-agent.0 create mode 100644 ssh-keygen.0 create mode 100644 ssh-keyscan.0 create mode 100644 ssh-keysign.0 create mode 100644 ssh-pkcs11-helper.0 create mode 100644 ssh-sk-helper.0 create mode 100644 ssh.0 create mode 100644 ssh_config.0 create mode 100644 sshd.0 create mode 100644 sshd_config.0 diff --git a/.gitignore b/.gitignore index 002d102b88e0..907533067c8b 100644 --- a/.gitignore +++ b/.gitignore @@ -37,9 +37,3 @@ sshd-auth !regress/unittests/**/Makefile tags -# Ignored on main branch -config.h.in -configure -aclocal.m4 -ChangeLog -**/*.0 diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 000000000000..8d71745072ca --- /dev/null +++ b/ChangeLog @@ -0,0 +1,11147 @@ +commit 449d25b4f8b8d3bb55a865ebcbec17b39b37c208 +Author: Damien Miller +Date: Mon Jul 6 17:56:53 2026 +1000 + + depend + +commit 0227fe4606ebf86b3f6f9b80af12e171eaa58416 +Author: Damien Miller +Date: Mon Jul 6 17:56:10 2026 +1000 + + crank version numbers + +commit 0210c7cc942ee54bd6a647d5732df9786c4b08d0 +Author: djm@openbsd.org +Date: Mon Jul 6 07:54:26 2026 +0000 + + upstream: openssh-10.4 + + OpenBSD-Commit-ID: ce7b0749e5139c70410ee92a13d368d7d34262b5 + +commit 5d04ca6af739b82fd30d84d2783ca802ebfa1192 +Author: djm@openbsd.org +Date: Mon Jul 6 07:53:30 2026 +0000 + + upstream: Fix multiple RFC 4462 (GSSAPIAuthentication) compliance + + problems + + 1) Remove an early failure return for GSSAPI authentication attempts + made for invalid accounts that yielded different behaviour for + valid vs invalid accounts. + + 2) Fix a situation where some GSSAPI requestes were not correctly + subjected to MaxAuthTries. + + 3) Fix a moderate pre-authentication resource DoS related to #2. + + Add missing logging for error cases. + + Report and fixes from Manfred Kaiser, milCERT AT + + OpenBSD-Commit-ID: ca0acdd64eea435d6f89534538a9eb404a5629d3 + +commit e8bdfb151a356d0171fea4194dd205fbb252be23 +Author: djm@openbsd.org +Date: Mon Jul 6 07:49:58 2026 +0000 + + upstream: fix ownership and lifetime of several bits of client + + state that need to persist for the life of the connection, especially the + cached hostkey that was being incorrectly freed early on some paths, possibly + allowing its use after free. + + Reported by Zhenpeng (Leo) Lin from depthfirst.com + + OpenBSD-Commit-ID: faaa6ad72e7d69d41fa8b197b606265b7d9bc73f + +commit d43ba60c91cb323ca921049b7d43b1908c318454 +Author: djm@openbsd.org +Date: Mon Jul 6 07:44:48 2026 +0000 + + upstream: Fix cases in GSSAPI and keyboard-interactive + + authentication where the minimum per-attempt delay was not being enforced. + + Reported by Orange Cyberdefense Vulnerability Team + + OpenBSD-Commit-ID: c40bd35cc2428fcaccad7a141703c28baa6da01e + +commit cf67d46cba77d493152830a108b5f294ee9c5140 +Author: dtucker@openbsd.org +Date: Sun Jul 5 02:46:44 2026 +0000 + + upstream: void functions should not return anything. Patch from Tim + + Rice. + + OpenBSD-Commit-ID: bb5021b2b45d9d3f54a012d569872805d107f59c + +commit 93d6348ae44491b7542d78c0d55da7130e9db017 +Author: djm@openbsd.org +Date: Sun Jul 5 00:16:21 2026 +0000 + + upstream: fix inverted test that broke ssh-add with keys on stdin. From + + Laurence Tratt + + OpenBSD-Commit-ID: bcef522cfa587c7cf035660bb347cff36b65bfbd + +commit aab5620a66777afbe9e0939b4961e5751d6e7938 +Author: Damien Miller +Date: Fri Jul 3 14:20:02 2026 +1000 + + grammar fix; from Daniel O'Connor + +commit c123ac1c579212c08c17d927cb8e379d45f9fccb +Author: Damien Miller +Date: Fri Jul 3 14:16:29 2026 +1000 + + more config option details in README.privsep + +commit 3912be7baa05819c382ce0e5d0ef847c9d80f230 +Author: Damien Miller +Date: Fri Jul 3 14:10:16 2026 +1000 + + more README.privsep polish + +commit f80e6545ee9eb60b3fb8b0097fcc12aad47a54b4 +Author: Damien Miller +Date: Fri Jul 3 13:33:16 2026 +1000 + + tweak; from dlg@ + +commit 01ed1c648a2c42e85e73cac3b7647f1cddc4abba +Author: Damien Miller +Date: Fri Jul 3 12:49:26 2026 +1000 + + tweak previous + +commit 85dcff277e7a5299ec13af12517aefb123b1aa95 +Author: Damien Miller +Date: Fri Jul 3 12:31:27 2026 +1000 + + revise README.privsep for multi-binary model + + This rewrites most of the privsep description to more accurately capture + recent changes in how sshd managed privilege across its lifecycle, + including describing the roles of the sshd-session and sshd-auth + helper binaries. + + Also 100% more ASCII art + +commit a5ecfdc21864b29ef9a939b9cfe7a2a8ffcdf439 +Author: Darren Tucker +Date: Thu Jul 2 10:05:43 2026 +1000 + + Need clang >= 19 for constexpr in hardened_malloc. + +commit c53864fc40045d0413c36a19ca784b1b2f985dd9 +Author: Darren Tucker +Date: Thu Jun 25 18:43:48 2026 +1000 + + Tabs -> spaces. + +commit 0a75a95d582028c5ce91f524c20365df9f2515f2 +Author: Zoltan Fridrich +Date: Wed Apr 16 15:11:59 2025 +0200 + + Provide better error for non-supported private keys + + Signed-off-by: Zoltan Fridrich + +commit 654e1a3e5b58029b05f1df0308e7e4d4407b37c2 +Author: djm@openbsd.org +Date: Wed Jul 1 01:14:39 2026 +0000 + + upstream: more missing mldsa44-ed25519, based on GHPR696 from Loganaden + + Velvindron + + OpenBSD-Commit-ID: f32e17df54fa66b0e936f1aeb3963f949e4a9bb8 + +commit 088ca00b8f19a0257b2f869cb828ab75e99ab3a1 +Author: djm@openbsd.org +Date: Wed Jul 1 01:08:51 2026 +0000 + + upstream: whitespace + + OpenBSD-Commit-ID: 730e54174b2182c7011cc87a0fdae595cd9bcc2d + +commit 0cdead097bde10712cd0635b5d350c16e07ba52a +Author: djm@openbsd.org +Date: Wed Jul 1 01:06:54 2026 +0000 + + upstream: simplify SIGINFO output: remove list of active channels (too + + verbose) and just display destination and connection duration; requested + deraadt@ + + OpenBSD-Commit-ID: cb36192cd53483f8e452ea91bc42be7bbb2fffa3 + +commit 55ffd11b88f073662cdf0c8c48fe0800b8a71fc4 +Author: djm@openbsd.org +Date: Wed Jul 1 00:52:31 2026 +0000 + + upstream: Tighten up the introduction a little: + + Mention Match as a conditional directive (previously it only + mentioned Host) + + Try to use consistent language in the introduction to refer to + configuration directives (previously it used "parameters" and + "keywords" interchangeably). + + Mention that comments may appear at the end of the line too, and that + whitespace at the beginning/end of lines is not significant. + + OpenBSD-Commit-ID: e08f34413eeced47478c14d5005726f9bdd5d80e + +commit 8b05bbeb293c5f777915e37e9ed43a06fb8e7614 +Author: dtucker@openbsd.org +Date: Wed Jul 1 00:52:23 2026 +0000 + + upstream: Move negative-FD checks to before first use. CID 909998, + + ok djm@ + + OpenBSD-Commit-ID: f0208911d27fd5bd66cd608c7b6fb5a36002d6a5 + +commit 296393226e4849010516150f3e19dbfc68789503 +Author: djm@openbsd.org +Date: Wed Jul 1 00:04:46 2026 +0000 + + upstream: ssh -o doesn't support Host or Include options, they are only + + valid in the config file. bz3968 from xspielinbox + + OpenBSD-Commit-ID: cbecf11f2eea63e3cf6752e9bbe59091ba60cd32 + +commit fe85df40aed36a49b9883186a123a1435c17f895 +Author: djm@openbsd.org +Date: Tue Jun 30 23:55:32 2026 +0000 + + upstream: mention mldsa44-ed25519 in usage(); based on GHPR695 from + + Loganaden Velvindron + + OpenBSD-Commit-ID: 4af2400312b6ca232a68a758160ca5c64ca6a168 + +commit aabe6d25498d9dc69fa21fbb14352fd4b3d5e9fa +Author: tb@openbsd.org +Date: Tue Jun 30 03:42:53 2026 +0000 + + upstream: ssherr-libcrypto: avoid use of deprecated + + ERR_load_crypto_strings() + + Follow regress and use unchecked OPENSSL_init_crypto() because + ERR_load_crypto_strings() has been deprecated in OpenSSL 1.1.0. + This call can in principle fail, in which case there's a fallback + to generic error strings. + + There is still use of OpenSSL 3.x-deprecated API in here. That's + a problem for someone else to solve. + + ok djm + + OpenBSD-Commit-ID: 3e9dc94caa83b361775b83a92425e858f8680c05 + +commit dcba967d3f39f89d17634e550e1741b2b91f4c5c +Author: djm@openbsd.org +Date: Tue Jun 30 02:30:19 2026 +0000 + + upstream: another ruser_name/ruser_group vs attrib_to_stat() ordering + + screwup. Coverity CID 910530 via dtucker@ + + OpenBSD-Commit-ID: d8c4656119f09304e79fcf2ab32299ed68006a29 + +commit 710cd5abcea22aeddbd5d5d661c224eaa05e47b9 +Author: djm@openbsd.org +Date: Tue Jun 30 00:10:48 2026 +0000 + + upstream: set FD_CLOEXEC on the fds between sftp and its ssh + + process, avoids risk of subcommands that write on odd fds breaking the + connection. GHPR693 from Manuel Einfalt; feedback deraadt@ ok dtucker@ + + OpenBSD-Commit-ID: 91b12cd66580dab6b3bfe5e507a1a8310c8f9149 + +commit fa447bd5836f6d1c742c543207a3a6ec2909da75 +Author: djm@openbsd.org +Date: Tue Jun 30 00:09:01 2026 +0000 + + upstream: check key and IV length received in privsep state + + transfer exactly match the expected sizes for the selected cipher; partially + redundant to similar checks in cipher_init(), but nice to be more exact. + + GHPR from jmestwa-coder; ok dtucker@ + + OpenBSD-Commit-ID: d4a9deef194cc44189e835ac59b7b800b9b5c281 + +commit 23a7c4d1284694f9973ebdae7884cd25d33e5cf8 +Author: djm@openbsd.org +Date: Mon Jun 29 23:00:00 2026 +0000 + + upstream: revert bits that weren't ready for commit yet + + OpenBSD-Commit-ID: ee8a219f02db32778444356ad2d93b983a38a704 + +commit b9d2162e4a919168bbd983fa68663f813b534034 +Author: djm@openbsd.org +Date: Mon Jun 29 22:56:44 2026 +0000 + + upstream: Move user/group name lookup to correct place; coverity + + CID 910530 via dtucker@ + + OpenBSD-Commit-ID: 03ba9f8c720eea38436e4fef4c40814eae1b1fe3 + +commit 0875a78bb7228986c2e89ef2f5fe041d2ab27ed7 +Author: djm@openbsd.org +Date: Mon Jun 29 09:14:25 2026 +0000 + + upstream: fix ineffective max file size check when loading + + blobs/keys from files and add another one on a patch that was not covered by + the existing ones. From Tess Gauthier via bz3969 and bz3970 + + OpenBSD-Commit-ID: c0dec6c587853349113df85b6dc528dc15079af0 + +commit 5d8e42933ab3f1a1c17608c32d680300f5524a99 +Author: djm@openbsd.org +Date: Mon Jun 29 08:59:31 2026 +0000 + + upstream: check strdup() return to avoid NULL deref on failure. + + bz3948 from RuiHe-MO + + OpenBSD-Commit-ID: 2b1fbfb2e1f3359150feadfdf05acaa1c7d211e8 + +commit 0eaeddeefa4bd9b1241788b27ed2967ab596c759 +Author: djm@openbsd.org +Date: Mon Jun 29 08:57:06 2026 +0000 + + upstream: s/calloc/xcalloc/ to reduce noise from AI bug detectors + + that don't understand context + + OpenBSD-Commit-ID: dcef5b1804620f2aed108267bbf5023a81230e14 + +commit a9cb2e30d3a50ba6a24047d87cd80e4b4a18b5ff +Author: djm@openbsd.org +Date: Mon Jun 29 08:48:22 2026 +0000 + + upstream: fix "ls -n", which was still displaying user/group names + + rather than numeric uids/gids. Based on patch from Tamilan in bz3953 + + OpenBSD-Commit-ID: 65dd2ecb870b727e872cf9df544f8767426d2cc0 + +commit 3c3226f79cf4fa1c0436a91768760b92df87ffab +Author: djm@openbsd.org +Date: Mon Jun 29 08:21:50 2026 +0000 + + upstream: move documentation of the Include directive to near the + + start of the options list, alongside that for Match and Host which are + similar insofar as they all affect configuration parsing rather than altering + the configuration directly. from xspielinbox via bz3968 + + OpenBSD-Commit-ID: 1cde8af8d40dbbe3ea49cf56c5d408946c875230 + +commit ce697f1eaf76a3d8d700894726c7a826af393ed5 +Author: djm@openbsd.org +Date: Mon Jun 29 08:19:21 2026 +0000 + + upstream: mention RefuseConnection, VersionAddendum and + + WarnWeakCrypto along with other options. from xspielinbox via bz3968 + + OpenBSD-Commit-ID: 5d4ef72dc703a74e64175e4611961ea338379d66 + +commit 849748c6e5d79274020489b03d068361d98ff42f +Author: djm@openbsd.org +Date: Mon Jun 29 08:16:46 2026 +0000 + + upstream: correct directive name (s/Host/Match) in error message + + from xspielinbox via bz3968 + + OpenBSD-Commit-ID: 3aec5cc9d349bcef12abc951490474f1217b4aeb + +commit c8716138281d3dac33c2c7e98615c52d2b606d85 +Author: djm@openbsd.org +Date: Mon Jun 29 07:56:19 2026 +0000 + + upstream: report errors in fill_default_options() properly, based on + + GHPR649 by Zoltán Fridrich + MIME-Version: 1.0 + Content-Type: text/plain; charset=UTF-8 + Content-Transfer-Encoding: 8bit + + OpenBSD-Commit-ID: 10137e31df74c3100e3abc7d008b1645ca5b45af + +commit d9df26d7e93f76bc5b1c0cbd31cde0af00ccbbc0 +Author: djm@openbsd.org +Date: Mon Jun 29 07:46:22 2026 +0000 + + upstream: don't use deprecated ERR_load_crypto_strings() + + GHPR650 from Mike Frysinger + + OpenBSD-Regress-ID: bfe86d9be1db4569c091f3d763cba04ddbb86ec0 + +commit 365522938f7a44df993c38f8a51836bab3628211 +Author: Damien Miller +Date: Mon Jun 29 17:21:01 2026 +1000 + + don't leak rrset on fail; GHPR681 from metsw24-max + + ok dtucker + +commit fceb78d14abc710f2bab31f28d321a9bb2476781 +Author: Damien Miller +Date: Mon Jun 29 17:18:58 2026 +1000 + + check sockaddr length; GHPR681 from metsw24-max + + ok dtucker + +commit 9d5238f44dda8d9455c085f51f2fb00774f69d38 +Author: Damien Miller +Date: Mon Jun 29 17:17:28 2026 +1000 + + return result of raise(2); GHPR681 from metsw24-max + + ok dtucker + +commit fa5416dec1232dc67d979d28942344cdc8086ae6 +Author: Damien Miller +Date: Mon Jun 29 17:16:55 2026 +1000 + + use size_t for lengths; GHPR681 from metsw24-max + + ok dtucker + +commit ef6bef31de60b077cb7da954b202d65156fd510e +Author: Damien Miller +Date: Mon Jun 29 17:15:10 2026 +1000 + + fix leak of error path; GHPR681 from metsw24-max + + ok dtucker + +commit 84365594f44423b69392f295f82e9cbcdd8c2640 +Author: djm@openbsd.org +Date: Mon Jun 29 07:36:37 2026 +0000 + + upstream: don't print an error message when trying to load a host + + private key when PKCS#11 keys are in use, as these don't need the private + half on the filesystem. GHPR664 from Ingo Franzki + + OpenBSD-Commit-ID: c93352e218cb1b74af04e8dc3a42eddec1f312c0 + +commit d6a589d3c8530375c2d56bcfb914575a7fcd3715 +Author: djm@openbsd.org +Date: Mon Jun 29 02:13:05 2026 +0000 + + upstream: make ssh-add open it's connection to the agent after it + + has finished getopt() processing and not before. This allows the -v flag to + work properly. + + ok jca@ + + OpenBSD-Commit-ID: b9ac820018875aeb5b43ae2119a70c16a5cd2aef + +commit 1cfbed8a131de166d86fbf5ac3245d55046cfab3 +Author: djm@openbsd.org +Date: Mon Jun 29 02:08:55 2026 +0000 + + upstream: Fix bounds checking when signing messages of length + + greater than will fit in a size_t. In OpenSSH, messages sizes are bounded by + SSHBUF_SIZE_MAX so this was unreachable. From Swival scanner. + + OpenBSD-Commit-ID: 31ab874abe21a528fa995d78023c5ad9444a31e1 + +commit c58b363e4f7c10134b583fc92556229bf6c2c16b +Author: djm@openbsd.org +Date: Mon Jun 29 01:58:29 2026 +0000 + + upstream: fix ECDSA order check for curves with cofactor != 1. All + + supported EC curves have cofactor 1, so this is a nop. From Swival scanner + + OpenBSD-Commit-ID: 4ae44cc97714fcb6d19fa56714ede56c1ef521e1 + +commit c1cebbc7c69acfe5df07b4a95e4c32cebc3e105a +Author: djm@openbsd.org +Date: Mon Jun 29 01:53:21 2026 +0000 + + upstream: avoid situation where sftp_download() could get stuck in + + a loop if a broken server repeatedly returned zero length while reading a + file. Identified by Swival scanner + + OpenBSD-Commit-ID: 53f1de5065ff01952d2abb51747c2418ce21cd96 + +commit 1b39f39657d2e58f8ec57341581a39bbf0be645b +Author: djm@openbsd.org +Date: Mon Jun 29 01:47:21 2026 +0000 + + upstream: avoid download to server-controlled path when performing + + download on the commandline. From Swival scanner + + OpenBSD-Commit-ID: d1b2c44305fdfe6d51eed9ecc727e59478bf311f + +commit 36480181fa22f98e180b4f9e10203480c0346c78 +Author: djm@openbsd.org +Date: Sun Jun 28 23:47:16 2026 +0000 + + upstream: resist that return ".." via remote glob during + + remote/remote copies, similar to fixes for bz3871 for remote/local copies. + From Swival scanner + + OpenBSD-Commit-ID: c0c20a1b746db55c08e53658bf21ea9405b300a5 + +commit 8dec7df34b38ea510b5548a020f2664e59700d23 +Author: djm@openbsd.org +Date: Sun Jun 28 23:31:28 2026 +0000 + + upstream: avoid possible NULL deref; from Swival scanner + + OpenBSD-Commit-ID: 62ea8e12b7cddee933596e72f8ab0f7364147c0f + +commit 09c2eeb9c8a0f42716d67548c75a6f4870732caa +Author: djm@openbsd.org +Date: Fri Jun 26 06:17:13 2026 +0000 + + upstream: mention that ssh-keyscan output is only as trustworthy as + + the network between it and the SSH server; ok markus@ + + OpenBSD-Commit-ID: 067845df7e8eb776408de5f23a2e6e7019945834 + +commit 6f74eb3c56f8dc4886d2bc5b068c5bf82cb6db74 +Author: Darren Tucker +Date: Thu Jun 25 08:14:47 2026 +1000 + + Dropbear master -> main here too. + +commit b0894a23a6bcb4f008d119854cb520f0b44b0973 +Author: Darren Tucker +Date: Wed Jun 24 22:05:05 2026 +1000 + + Dropbear's master is now main. + +commit aa60cf3f41e89530448a720e08ec31a6d8ffd79e +Author: dtucker@openbsd.org +Date: Wed Jun 24 11:59:09 2026 +0000 + + upstream: Avoid printf("%s", NULL) since it's not guaranteed to be safe + + and will segfault on some -portable platforms. + + OpenBSD-Commit-ID: b49d588f8becf6363305aac42d7d9660fc7fe3ba + +commit 7c70c3d352f7e8f16ed799f03957ee87840da4e6 +Author: Darren Tucker +Date: Wed Jun 24 19:22:36 2026 +1000 + + Fix handling of rh-allow-sha1-signatures on Cygwin + + The format of openssl.cnf has changed, so append to it instead of trying + to insert into it. Test that openssl can sign RSA with SHA1 before + proceeding. + +commit a4c5d09657860cb8583e4cb176b2396fc8bdb523 +Author: Darren Tucker +Date: Wed Jun 24 19:05:12 2026 +1000 + + Make -j2 for faster builds. + +commit 110117accb95fc310a3923115e9316a9748ff6ae +Author: Darren Tucker +Date: Wed Jun 24 19:04:48 2026 +1000 + + Set CYGWIN at top-level. + + The ensures the symlinks created in any step (eg, logs) are native + symlinks and can be understood by the log upload step. + +commit 8058c5bdb507591b79ec926221fbe6fcc296d432 +Author: djm@openbsd.org +Date: Wed Jun 24 06:55:12 2026 +0000 + + upstream: mention a caveat regarding GSSAPIStrictAcceptorCheck in + + some environments + + OpenBSD-Commit-ID: aa7158d8f22cb34063c1c2d3cbcf30a9489847c2 + +commit 87e21b16d033700819a1381b9a2bfa2f8b3a217d +Author: djm@openbsd.org +Date: Wed Jun 24 06:53:57 2026 +0000 + + upstream: add some logging to make debugging interactive/bulk + + classification mistakes easier next time (though I think we've got them all + now, really) + + OpenBSD-Commit-ID: 5fe3dd4e76ffba787a423e301095d55cf5b0f0dc + +commit 162cb8721ca0fdb71aaf00688ac7d59a81fc8d5f +Author: djm@openbsd.org +Date: Wed Jun 24 06:53:11 2026 +0000 + + upstream: add a missing channels type for bulk/interactive + + classification bz3972; ok dtucker@ + + OpenBSD-Commit-ID: 9c9442ea14be74877e2c876b1fe9fa20d158dd97 + +commit 5dac5a9252074fb39da617ffc123830266614a4c +Author: Darren Tucker +Date: Wed Jun 24 12:19:53 2026 +1000 + + Set build options in /etc/mk.conf once at startup. + +commit 512bfedf61129788d680210081e89843858dde85 +Author: dtucker@openbsd.org +Date: Mon Jun 22 12:28:48 2026 +0000 + + upstream: Check return values from malloc. + + OpenBSD-Regress-ID: 28c8ab94a4fa5d047cec9c865b10bbf3c9ccf6d1 + +commit e683097d90e4698893c86a6f61c8c994b68cbcc6 +Author: dtucker@openbsd.org +Date: Mon Jun 22 12:08:33 2026 +0000 + + upstream: Check return value of sscanf. + + OpenBSD-Regress-ID: e06a8c769541b1aa7d663cc8859ddabd93847e81 + +commit b88165a06c8e195f267909de002450245e60002e +Author: tb@openbsd.org +Date: Sun Jun 21 19:23:56 2026 +0000 + + upstream: annotate tm_wday = -1 with /* sentinel for error */ per + + timegm(3) manpage + + suggested by deraadt + + OpenBSD-Commit-ID: 2fa92f0b826f0ab9e5d1cb0b2243b8e2f80951b2 + +commit 0d08d384a6783d3f3bc5a01d10015f527e0792ba +Author: djm@openbsd.org +Date: Fri Jun 19 05:26:04 2026 +0000 + + upstream: remove cipher_set_keyiv() as nothing uses it from + + Loganaden Velvindron + + OpenBSD-Commit-ID: 2a6636388028e6f7aa6837d6484a369f3d9c0818 + +commit 10715f25c40f5f7c670c341fadc52fbe1935db08 +Author: Darren Tucker +Date: Mon Jun 22 21:28:58 2026 +1000 + + Output Actions allowlist for uploading to Github. + +commit 01404fa5da11ed08c6ebecd09aaa3ebfbd79f206 +Author: Darren Tucker +Date: Mon Jun 22 19:00:15 2026 +1000 + + Add script to lookup and pin Actions to hashes. + + Update recently changed Cygwin Actions and pin remaining unpinned ones. + +commit faa646a9bf6c8d0ec2d8a52dcd155979c8f7eb8e +Author: El Mehdi Abenhazou +Date: Wed Jun 3 02:02:31 2026 +0100 + + ci: pin upstream.yml actions to full commit SHAs + + Signed-off-by: El Mehdi Abenhazou + +commit 983096a7b27eaf789b5ceb321867d4511ba779c3 +Author: El Mehdi Abenhazou +Date: Wed Jun 3 02:02:30 2026 +0100 + + ci: pin GitHub Actions to full commit SHAs + + Pinning actions/checkout, actions/upload-artifact, and + cygwin/cygwin-install-action to their full commit SHA instead of + mutable branch/tag references (main, master). + + Using mutable refs means a compromised or malicious update to the + action repository could silently alter the workflow behavior. + Pinning to SHA makes the exact version immutable and auditable. + + Signed-off-by: El Mehdi Abenhazou + +commit 0d156d385e1e9c31bd5fb3652cf620a1f51c9b19 +Author: dtucker@openbsd.org +Date: Tue Jun 16 22:27:10 2026 +0000 + + upstream: Factor out hex2bin into a shared helper function. + + Replace sscanf %hhx (which is C99) with plain %x for better compatibility + in -portable. ok djm@ + + OpenBSD-Regress-ID: 4d30bb27ffdf2154f1a9f2317df18d256717b300 + +commit b9d134a0b16a1810e9bbfac5bc687f5dbc75e7fa +Author: dtucker@openbsd.org +Date: Tue Jun 16 10:58:42 2026 +0000 + + upstream: Use awk instead of cut to help -portable. + + Some platforms have size limits on cut. + + OpenBSD-Regress-ID: fe871e8ed43fd92efb0df76f61c5cc9c5429ea82 + +commit 60978ddb08701d409c8236765caab10d1acded1b +Author: dtucker@openbsd.org +Date: Tue Jun 16 09:00:47 2026 +0000 + + upstream: Include stdarg.h for va_list (needed for xmalloc.h). + + OpenBSD-Regress-ID: 34a6d5db48eec77f92f868093dfa0bfc10ae4622 + +commit 3de49e0d281ac7efb766f06eb2942ae147f64bbb +Author: dtucker@openbsd.org +Date: Tue Jun 16 08:15:35 2026 +0000 + + upstream: Include stdlib.h for malloc/free and sort headers. + + OpenBSD-Regress-ID: 4f5f427b131f5d6b32ed107b9bef098153f768ce + +commit 61ca39c119108e95f94e3d914aa6fd79d99e288d +Author: Darren Tucker +Date: Tue Jun 16 18:16:32 2026 +1000 + + Remove check for OpenSSL w/out AES192/256. + + This was the case for some old Solaris versions, but the support for it + has long been removed from our compat layer so there's no point checking + for it. + +commit f433c09931665b1139dc9ef0951d3540242e4a38 +Author: djm@openbsd.org +Date: Mon Jun 15 06:36:52 2026 +0000 + + upstream: use different strategy to check whether keys are present or + + absent in the agent; helps some -portable tests on platforms that have stupid + grep(1) + + OpenBSD-Regress-ID: 0cee7ecc437eee7471dc6ccc3b3a0c2b60c1ad2d + +commit 860ed04158f2c6dc870ea7c98c23dcafc7772dd4 +Author: djm@openbsd.org +Date: Mon Jun 15 06:24:20 2026 +0000 + + upstream: avoid use of paste(1); helps portable + + OpenBSD-Regress-ID: ce3ad41b34af9fc16af83e4711a62231ee52a95c + +commit f5f02aafe89971d838d7fbc6b0cf240cee4d48bc +Author: Damien Miller +Date: Mon Jun 15 12:53:53 2026 +1000 + + another place mldsa-ed25519 keys need deactivation + +commit 1d6064d25fed17b184ead85ef6fddec1a2132c53 +Author: djm@openbsd.org +Date: Mon Jun 15 01:55:44 2026 +0000 + + upstream: fix multiple problems with testing hostkey types that are not + + enabled by default. + + 1) Add all hostkey types in the "multiple hostkeys" subtest. + Previously known_hosts was accidentally clobbered, causing + only the last added hostkey type to be used. + 2) Explicitly enable the hostkey types under test via + HostKeyAlgorithms + + OpenBSD-Regress-ID: 8f12d18b79b5cc8a748e187a0e95529cd85a9dcc + +commit ebdaacf4907033af1cbf1fef593436081dcd67a7 +Author: Damien Miller +Date: Mon Jun 15 11:43:52 2026 +1000 + + bring back mlkem768x25519-sha256 stubs + + should fix C89 compile + +commit b35a6a153f4164a56174e4795d4384867349e9aa +Author: Damien Miller +Date: Sun Jun 14 20:32:12 2026 +1000 + + don't build ML-KEM/ML-DSA code with +Date: Sun Jun 14 20:24:25 2026 +1000 + + include includes.h + +commit ea505c83ecae67c66c020f03b964cf471055191e +Author: Damien Miller +Date: Sun Jun 14 18:56:31 2026 +1000 + + provide a htobe32() replacement + +commit 8e0cb471774e39a308e41cf5890823dfb418fd5b +Author: Damien Miller +Date: Sun Jun 14 15:02:24 2026 +1000 + + hook up new regress/unittests/crypto + +commit 5a474d1bf338a895ce5973883c2f79d766f7dd42 +Author: djm@openbsd.org +Date: Sun Jun 14 04:08:05 2026 +0000 + + upstream: unit and regression tests for composite PQ ML-DSA44/Ed25519 + + keys. + + Includes a new unittests/crypto test that tests basic functionality + of the underlying crypto primitives against public test vectors + + OpenBSD-Regress-ID: 4463b2e8adec391efa24a953f3c911b72892ca80 + +commit db1bad146ff3e9aa8e2e8eac926b185870417b2f +Author: djm@openbsd.org +Date: Sun Jun 14 04:16:19 2026 +0000 + + upstream: make crypto_sign_ed25519_keypair_from_seed non-static. + + The new ML-DSA/ed25519 code needs it + + OpenBSD-Commit-ID: 48d00a2094bca8e422494aaa76105c708837436e + +commit 81ca1451bf94edd9533c4f6787130f2396219049 +Author: djm@openbsd.org +Date: Sun Jun 14 03:59:34 2026 +0000 + + upstream: Add experimental support for a composite post-quantum + + signature scheme that combines ML-DSA 44 and Ed25519 using the construction + specified in draft-ietf-lamps-pq-composite-sigs. There's also an early draft + documenting use of the integration of this scheme into SSH as + draft-miller-sshm-mldsa44-ed25519-composite-sigs + + This scheme is not enabled by default. To you use, you'll need + to add it to HostKeyAlgorithms, PubkeyAcceptedAlgorithms, etc. + Keys may be generated using "ssh-keygen -t mldsa44-ed25519". + + The ML-DSA implementation comes from libcrux. Thanks to + Jonas Schneider-Bensch and Jonathan Protzenko for their work to + make this available. + + Consensus is that it's time to get this in to allow people to + experiment with it. + + feedback markus@ tb@ logan@ deraadt@ + + OpenBSD-Commit-ID: 85f2d41e3d3374b4e8c28a45a7c92f153c4489e2 + +commit b7e552138b8861469295e33e1457040e3f747d06 +Author: djm@openbsd.org +Date: Sat Jun 13 00:37:13 2026 +0000 + + upstream: when replying to a "query" SSH_AGENTC_EXTENSION request, + + don't append an SSH_AGENT_SUCCESS to the reply to the query. bz3967 ok + dtucker@ + + OpenBSD-Commit-ID: b51418708096e26dbf73a0c1d3cb49b7352bc899 + +commit 5af8f3f290bd892352eb007866c066b7bf4a4385 +Author: dtucker@openbsd.org +Date: Sun Jun 7 08:50:17 2026 +0000 + + upstream: Make crypto_sign_ed25519_keypair_from_seed() + + static to prevent compiler warnings since it's only used within ed25519.c. + + OpenBSD-Commit-ID: cf8b1e8f364167eb1766f646cc18a40f32242991 + +commit 5ebfdf3afaede40b1f0f9b5874ba53bf9d21d6d5 +Author: dtucker@openbsd.org +Date: Sun Jun 7 08:21:07 2026 +0000 + + upstream: Import updated moduli + + OpenBSD-Commit-ID: c3081ccc6e4c1cb21e68c36f5a92e6d9f09e70b3 + +commit 47af21eb8d480c0f368a629ab58e31b993ed28f2 +Author: Damien Miller +Date: Sun Jun 7 09:56:41 2026 +1000 + + sync fmt_scaled.c with OpenBSD upstream + + Notably picks up this commit: + + revision 1.24 + date: 2026/06/06 23:49:25; author: djm; state: Exp; lines: +28 -12; commitid: oznzDs0MaUT3FEqO; + rearrange scan_scaled(3) ordering of multiplications and divisions + to better preserve accuracy for large exponents. From metsw24-max + via https://github.com/openssh/openssh-portable/pull/671/ + + ok tb@ + +commit e9916c44c1324ab9ab022719e4df08a390a83014 +Author: djm@openbsd.org +Date: Fri Jun 5 08:53:07 2026 +0000 + + upstream: pass >9 commandline arguments to the internal-sftp server, + + previously they were silently dropped; reported by Steve Caffrey ok deraadt@ + + OpenBSD-Commit-ID: ee6cd5430a3ca027c3223af54b58ad3cc7ccd624 + +commit 70d7044a966a541d9df6002fbeb62d005555cc78 +Author: djm@openbsd.org +Date: Fri Jun 5 08:48:43 2026 +0000 + + upstream: avoid truncation of pathnames headed to lstat() for + + systems where PATH_MAX is not the actual max; reported by sahvx655-wq via + GHPR688 + + OpenBSD-Commit-ID: fcbeeff99d857f2f3916ad06570fa05fc38b0f07 + +commit 37bf1431aa0f5e746f9ae0247f52da1e8b5758d6 +Author: djm@openbsd.org +Date: Fri Jun 5 06:51:02 2026 +0000 + + upstream: rename a variable to be more accurate + + OpenBSD-Commit-ID: bf277f2832125eb40ac2c9fa3ea66e31214f2131 + +commit 7763a38bc2595be50baf1d72b19bf4720e41e8e3 +Author: djm@openbsd.org +Date: Thu Jun 4 04:26:51 2026 +0000 + + upstream: add signature malleability and pubkey validity checks to + + ed25519 verification (SSH doesn't depend on these properties) Pointed out by + Soatok Dreamseeker + + Add an explicit-seed variant of the keygen function. + + feedback / "looks fine" tb@ + + OpenBSD-Commit-ID: 2a71926bfda24628cf34a88357f44a790e338d5d + +commit 65c6ac0a82f8bc3faf5a18fef36112fec1b54fc2 +Author: djm@openbsd.org +Date: Tue Jun 2 06:18:27 2026 +0000 + + upstream: refer to RFC9987 instead of I-D + + OpenBSD-Commit-ID: 6b273c50c2aa818b9144b8d9ab568c4239023297 + +commit c9ebebb22fa50ca50bd036599028d7e09f841c3f +Author: Darren Tucker +Date: Tue Jun 2 21:57:42 2026 +1000 + + Reformat setup_ci command line. + + This prevents setup_ci from running twice on Cygwin due to different + parsing of the command line since on Windows it's run via Powershell. + +commit 60343e46d5f8b79137a14d2ea5c85bf0b7359cc1 +Author: Darren Tucker +Date: Tue Jun 2 22:20:44 2026 +1000 + + Fix search for awk formatter. + + AC_PATH_PROG only takes a single binary to look for, AC_PATH_PROGS is + what's needed for more than one. Looks like an error by me in 285546b. + +commit 7e5590cf8ff732a946629b6f766c7a2c9b2ac425 +Author: Darren Tucker +Date: Tue Jun 2 18:49:02 2026 +1000 + + Replace shell-level timeout with dedicated command. + + It turns out the systems we run this workflow on all have timeout(1), + +commit 41bb8c1823a337dca1b027a1e5c560f6a5fc4acc +Author: Darren Tucker +Date: Tue Jun 2 18:10:25 2026 +1000 + + Add a single retry to VM package install steps. + + These are potentially flaky due to network issues, so hopefully this + will reduce the number of manual retries needed. + +commit 14d88d4da7fb72d94239049d76c7651723b1a3d9 +Author: Darren Tucker +Date: Tue Jun 2 17:44:12 2026 +1000 + + Add includes.h for compat functions. + + Fixes build on at least old AIX. + +commit e8c12cc085272894e7c14eb761e82ec7c0d8f599 +Author: Darren Tucker +Date: Mon Jun 1 20:43:31 2026 +1000 + + setup_ci.sh: add timeout and allow one retry + +commit de97e5a44c88179b834939b84cd555249382de0e +Author: djm@openbsd.org +Date: Mon Jun 1 08:27:28 2026 +0000 + + upstream: differentiate between execution failures and subsystem not + + found when logging why a subsystem failed to start; GHPR#637 from cuiweixie + + OpenBSD-Commit-ID: 42bc40dd6272b7f6726b069a8c4e16025a354056 + +commit 51db029b53488bc972deba13724034f8e35e6e38 +Author: Darren Tucker +Date: Mon Jun 1 18:26:31 2026 +1000 + + Don't install shim for AWK=awk. + + If configure finds an undadorned awk, don't install the shim to prevent + recursive calls to it. + +commit 2afcdf7b3e429428d9b6415e0c948001bf968477 +Author: Darren Tucker +Date: Mon Jun 1 17:40:03 2026 +1000 + + Pass awk detected by configure to regress tests. + + Some platforms' basic awk don't have toupper, but other awks like nawk + or gawk do. Pass the one found by configure through to the regress + tests, and make a wrapper for it so we don't need to modify any tests. + +commit 7b776066bc00a12ec3a7f9b04cf8a69a8d260c2c +Author: Darren Tucker +Date: Mon Jun 1 17:39:40 2026 +1000 + + Update LibreSSL test 4.3.1->4.3.2. + +commit 684d26a3c4d07e78027517fd6e98875ae5dff71d +Author: djm@openbsd.org +Date: Mon Jun 1 05:49:20 2026 +0000 + + upstream: sk-usbhid: skip unsupported key types in read_rks() + + When enumerating resident keys, encountering a credential with an + unsupported COSE key type (not ES256 or EdDSA) caused the entire + enumeration to abort via goto out, discarding all valid keys. + + Move the key type check before the per-credential allocation so + unsupported types can be skipped with continue instead. This + preserves all valid resident keys on the token. + + Patch from Akhilesh Arora via GHPR657 + + OpenBSD-Commit-ID: b344a44ff97d26faf099b8e0cad72ad1e793ac0f + +commit de24573efc60ca145e4f2d7e45787eccf8bd41a4 +Author: djm@openbsd.org +Date: Mon Jun 1 05:40:13 2026 +0000 + + upstream: Actually set pollfd.events correctly for socket type + + channels; previously we were throwing away the events we computed if the + channel had a c->sock distinct from it's other read and write fds. + Fortunately, it appears that this case happens rarely, if ever. + + Reported by Darafei Praliaskouski via GHPR660 + + OpenBSD-Commit-ID: d3f483b7919946c5649e8c697d5b927af35aac4b + +commit 58b9381e0b1dbc8e56190b26fb61bae4cfb240be +Author: djm@openbsd.org +Date: Sun May 31 13:12:07 2026 +0000 + + upstream: handle compiled-time unsupported options in servconf.h + + better; leave a zero placeholder variable so we don't have #ifdef around + their absence elsehwere in the tree + + OpenBSD-Commit-ID: 9601de2c67042aacb0ea12ca424e67c092fa7801 + +commit ea91c7a1a9ccb22bacd8fcff824c84e3b8414af5 +Author: Damien Miller +Date: Sun May 31 22:03:56 2026 +1000 + + depend + +commit 3bc4ac43943852b214a3d85e3424d9304c8a736d +Author: djm@openbsd.org +Date: Sun May 31 11:39:44 2026 +0000 + + upstream: unit test for new servconf.[ch] code, including a basic + + fuzz test for deserialisation + + OpenBSD-Regress-ID: f182c21485dc37a41a125f067b59bee48adbfe6c + +commit f2b815e42d9fd654cb457cd7e7d1cb751f1a5a33 +Author: djm@openbsd.org +Date: Sun May 31 11:31:57 2026 +0000 + + upstream: the new configuration dump code emits configuration + + directives with capitalisation (previously they were all lowercase), so make + the tests that consume them insensitive to case + + OpenBSD-Regress-ID: 9a81d8501b8b8fc1c1a0d268d4cc91cbb19668f5 + +commit 633a4c1a24605e48c46fe76afc0814d20593fc00 +Author: djm@openbsd.org +Date: Sun May 31 04:20:58 2026 +0000 + + upstream: flesh out match_pattern() tests, including a new + + comparison test of the new NFA-based implementation against the original one + for all possible combinations of short inputs and patterns constructed from a + small dictionary of possibilities. + + OpenBSD-Regress-ID: a18e86c95afb6243ac270468f5dd0ab4a78c8074 + +commit bebc855fdb3f8c7f96fd392f67bec2134cc42b1b +Author: djm@openbsd.org +Date: Sun May 31 11:30:50 2026 +0000 + + upstream: big refactor of sshd config management code. + + This generates much of the initialisation, defaults and keyword table + code from a set of macros rather than hand coding them. These same + macros are also used to generate serialisation and deserialisation + code. + + The macros are admittedly ugly but have the advantage of forcing a + good degree of consistency across places that need to stay in sync + with each other. + + The new de/serialisation code is used to pass configurations across + the various sshd-* process boundaries. This removes the need to pass + around raw text configurations that need to be re-parsed as well as + eliminating some raw pointer leakage across the processes where + structures were previously clumsily serialised. + + feedback/ok markus@ + + OpenBSD-Commit-ID: 9a5109a480637e08c290eeb82aa8ef2ca7e848ce + +commit a1dd1c80687fbfbdca19d3a314a8176b90ae471b +Author: djm@openbsd.org +Date: Sun May 31 06:14:42 2026 +0000 + + upstream: avoid strlen(NULL) crash if an X11 channel was created before + + the x11-req SSH_MSG_CHANNEL_REQUEST was sent. Reported by Ben Perry via + GHPR679 + + OpenBSD-Commit-ID: 31db0da9ab6c73e6bbf4021ffd53dc3ce5c65f23 + +commit df18979e1137f41a3ffa25f9d06c4fc55073cb34 +Author: djm@openbsd.org +Date: Sun May 31 05:55:21 2026 +0000 + + upstream: DNS0x20[1] can randomise the case of domain names returned by + + lookup to force some more uniqueness in queries to reduce the likelihood of + spoofing attacks succeeding. + + Normally this should be hidden from the user by the resolver, but + in some cases it can leak through. When it does, it can mess up + ssh's CanonicalizePermittedCNAMEs. + + Fix this by forcing the name we received from the system resolver to + lowercase. + + bz3966, report and fix by Martin D Kealey + + [1] https://datatracker.ietf.org/doc/html/draft-vixie-dnsext-dns0x20-00 + + OpenBSD-Commit-ID: e0b300d3b3af289e053d928380af71949f95bfb0 + +commit 5a5e47740b6466d58242aca28b9e584bab4ccf1d +Author: djm@openbsd.org +Date: Sun May 31 04:59:51 2026 +0000 + + upstream: disallow use of the copy-data extension to read and write + + to the same inode simultaneously; reported by Qifan Zhang of Palo Alto + Networks; ok markus@ + + OpenBSD-Commit-ID: 94ceb85146d92dbc1289c55d308498d5f56f274a + +commit 073faa6beceea162eeeb7963c7352a6c851e507a +Author: djm@openbsd.org +Date: Sun May 31 04:51:45 2026 +0000 + + upstream: Fix two separate one-byte out-of-cound reads + + 1) if a server sent an empty reply to a SSH2_FXP_REALPATH request + 2) if a batch command used the full 2048 byte buffer but ended in a + literal backslash character + + Both reported by Zhenpeng (Leo) Lin from depthfirst + + ok markus@ + + OpenBSD-Commit-ID: d1ccc1f5a6eb109065ce8a552fea8e502381ce59 + +commit 8dfe7ed6e2fd988de08df508355a196b956b2753 +Author: djm@openbsd.org +Date: Sun May 31 04:47:29 2026 +0000 + + upstream: DisableForwarding=yes didn't override PermitTunnel=yes + + Reported independently by Huzaifa Sidhpurwala of Redhat and Marko + Jevtic; ok markus@ + + OpenBSD-Commit-ID: b5c13f0746cf079b21f8deba47407fad49ccbf4c + +commit 72b05ecd141b9683285dcdb439de01903c1a07d3 +Author: djm@openbsd.org +Date: Sun May 31 04:44:38 2026 +0000 + + upstream: make the transport protocol stricter by disconnecting if + + the peer sends non-KEX messages during a key re-exchange. + + Previously an evil peer could continue sending non-KEX messages + without penalty, causing memory to be wasted up until the + connection terminated or the server/client hit a OOM limit. + + reported by Marko Jevtic; ok markus@ + + OpenBSD-Commit-ID: 8937f0f2096156f5c68ae2dce77956373589d757 + +commit 26cde4cfc55eb1d336e1249d702c0c4705b0424b +Author: djm@openbsd.org +Date: Sun May 31 04:37:56 2026 +0000 + + upstream: stricter validation of the transport state passed from + + the unprivileged preauth sshd-auth process to the user-privileged postauth + sshd-session process. + + These are harmless unless an attacker had an exploit for sshd-auth + in which case they could be used for post-auth memory DoS or to + crash you own session in a new and exciting way. + + Reported by bylee3 and Kayky Vinicius + + ok markus + + OpenBSD-Commit-ID: 214e256904a4ae4f83d2083096796c9689c1d7b5 + +commit 10f66b2af950c94af3b25027abec5209d90eb451 +Author: djm@openbsd.org +Date: Sun May 31 04:31:04 2026 +0000 + + upstream: Enforce a maximum size for usernames in agent key use + + constraints + + Along with the match_pattern() performance change that was just + committed this avoids a denial-of-service where an agent client could + waste CPU on an agent by sending user constraints with lots of + wildcards. + + Reported by Huzaifa Sidhpurwala of Redhat + + ok markus + + OpenBSD-Commit-ID: 0483817f1a8accf4dbff42b7073ee4d119105d71 + +commit 1e82d2cfcfd05ec2e4515894a92223f40839c7b8 +Author: djm@openbsd.org +Date: Sun May 31 04:24:39 2026 +0000 + + upstream: fix client use-after-free on error path if cipher_init() + + fails; reported by Qualys Security Advisory Team, ok markus@ + + OpenBSD-Commit-ID: a8731da0c462b2b9d11314ba505c26ee0cdada83 + +commit 9d4c0b31f172782def72ccc2fb2dc217d3135e6f +Author: djm@openbsd.org +Date: Sun May 31 04:19:16 2026 +0000 + + upstream: Replace the old recursive match_pattern() with an + + implementation that uses a NFA for matching. This avoids the exponential + worst- case behaviour for the old implementation. + + ok markus@ + + OpenBSD-Commit-ID: fc6b75a52f4c0acb52b7900658c8d25ff873cbae + +commit 7ab700f1706b154d4bc5cf66e19c05be6d9b1fc1 +Author: Damien Miller +Date: Sat May 30 23:24:01 2026 +1000 + + Make failure to set SECCOMP or NO_NEW_PRIVS fatal + + If your Linux system lacks support for these then please don't + enable the seccomp sandbox. + + Prompted by manfred.kaiser@ssh-mitm.at + +commit 4f4aeee6edaa248f1e7ce22ee3f35ce183eabf38 +Author: Manfred Kaiser +Date: Sun May 24 09:53:42 2026 +0200 + + sandbox-seccomp-filter: remove duplicate SC_ALLOW(__NR_clock_gettime64) + + The syscall is already permitted at line 297 in its own ifdef guard. + No functional change. + +commit 16908221360a01b1801c6ca70c26b73c83509ea3 +Author: deraadt@openbsd.org +Date: Wed May 27 13:57:26 2026 +0000 + + upstream: Use the new RELINK feature in bsd.prog.mk to build the + + relink kits. + + OpenBSD-Commit-ID: df5c950444e208b320265fa8a1afd676e2edfa6e + +commit 3bee4a1a260809992a0877d7ef202c4ff3e0be24 +Author: tb@openbsd.org +Date: Wed May 27 13:54:15 2026 +0000 + + upstream: ssh: use sentinel idiom for timegm(3) and mktime(3) + + There is nothing wrong with times before the epoch, even -1, so use the + idiom recently added to the CAVEATS section to figure out whether there + was an error in the timegm() or mktime() calls. + + We should sweep the tree for this. If anyone is bored, feel free to beat + me to it... + + ok deraadt djm + + OpenBSD-Commit-ID: e2b1721966dc782e776db5d6cfb18958534f9d4b + +commit 26a8c13e6154a905b4eaf48798b134372747e86f +Author: tb@openbsd.org +Date: Wed May 27 03:28:07 2026 +0000 + + upstream: ssh-agent: add -V to usage() + + ok djm + + OpenBSD-Commit-ID: ea9bc250ce34c4c8317896673ca37f3ee17223c7 + +commit 3a05a07e78f7b88ba70fa7f96808bcb86a55cbe8 +Author: djm@openbsd.org +Date: Wed May 27 03:05:21 2026 +0000 + + upstream: use "ssh-agent -V" to test the binary is functional after + + relinking requested deraadt@ + + OpenBSD-Commit-ID: eb4169949bf61188fb7336b11b73833019d10d7b + +commit 7fbe3e440eae0cd2315545ce5abd89e936b3a92f +Author: djm@openbsd.org +Date: Wed May 27 03:04:30 2026 +0000 + + upstream: add a -V flag to print the version, but mostly as a way + + to check the binary is functional; ok deraadt@ + + OpenBSD-Commit-ID: 0cc5cb22cbfe09ac4c316dd5da0af7a4193a42af + +commit f44f124a234785b9d2cd59a6da28737fb3c4ad9a +Author: dtucker@openbsd.org +Date: Wed May 27 23:04:36 2026 +0000 + + upstream: Test all mutually supported algorithms, + + using dropbear's new -Q option to query its algorithms where possible. + + OpenBSD-Regress-ID: 7e1fa733dec3bfa9f8931e535a9397209b5953f3 + +commit 0cadf7e0e88f4088595afbea21f2e43f3ae28abc +Author: dtucker@openbsd.org +Date: Tue May 12 13:02:40 2026 +0000 + + upstream: Dropbear recently added a -Q option; + + use it to query KEX if available. + + OpenBSD-Regress-ID: beab781f357e27e75dfdd2ec600a7dff2c63cb5b + +commit 0e2db7bc017d968ef57b0b5b4fd86643ecdb05e4 +Author: dtucker@openbsd.org +Date: Mon May 4 10:57:24 2026 +0000 + + upstream: Fix skip message. + + OpenBSD-Regress-ID: d192bbc19cc5914e64a3bb35a347eca0318729af + +commit 0a561f90672b6dc6187763f3b90e47c4c4247875 +Author: Darren Tucker +Date: Tue May 26 10:48:19 2026 +1000 + + Run hardenedmalloc test on ubuntu-latest. + + Needed for newer clang that supports -std=c23. + +commit 3468ac72962970728a204e5052a3be9826090b13 +Author: Darren Tucker +Date: Tue May 26 09:33:51 2026 +1000 + + Hardenedmalloc needs -std=c23 so build with clang. + +commit 42b213c66ba143f543b824ea5951f1ceb3fdd15b +Author: Michael Forney +Date: Fri May 22 03:02:00 2026 +1000 + + Fix IPTOS_DSCP_VA fallback + + 0x2c is the unshifted value, and was copied over from openbsd before + it was fixed to be 0xb0 in [0]. + + Source of discrepancy identified by Leah Neukirchen. + + [0] https://cvsweb.openbsd.org/log/src/sys/netinet/ip.h#rev1.22 + +commit 66847768ffd5a2a004891c8d3bd79eaba12625b7 +Author: Darren Tucker +Date: Thu May 21 18:39:54 2026 +1000 + + Add OpenBSD 7.9 test VM. + +commit d0d7981cf56363e6320f2aa6cf798e293420a7cf +Author: Darren Tucker +Date: Thu May 21 18:38:47 2026 +1000 + + Another shell portability fix for Solaris. + +commit 498372545f48effd30a4d4c005eea25b1141fc74 +Author: Darren Tucker +Date: Thu May 21 18:25:50 2026 +1000 + + Use backticks for shell portability w/ Solaris. + +commit 18b9db789e278c4d6a5ff21093a45683950db3ae +Author: Darren Tucker +Date: Tue May 19 18:37:26 2026 +1000 + + Add interop tests against Dropbear >= 2020.79 + +commit a5a1b7e75389231bf817433d93f15732ba13c0ad +Author: djm@openbsd.org +Date: Thu May 21 04:04:57 2026 +0000 + + upstream: mention that compression could potentially leak + + information about session contents (cf. the CRIME attack on TLS) if a + connection allows attacker- controlled traffic over it alongside trused + traffic. This might occur in some forwarding scenarios. + + with deraadt@ + + OpenBSD-Commit-ID: 03d145cdbf3a8713e8309724b5c9a9b76c317749 + +commit e5c9cf9ac7543a5e59dabf11f993a9c032b9b71f +Author: djm@openbsd.org +Date: Thu May 21 02:50:59 2026 +0000 + + upstream: mention usefulness of request type allow/denylisting for + + servers accepting untrusted clients + + OpenBSD-Commit-ID: 8b991bd263b46374a8e73f02d05cdccca73ae520 + +commit 62fce76130485773c635da8adaeb7de78382a5f0 +Author: tb@openbsd.org +Date: Mon May 18 04:14:57 2026 +0000 + + upstream: chacha: avoid -Wunterminated-string-initialization + + warning + + The sizes of sigma[] and tau[] aren't used, so include a trailing NUL and + thereby avoid upsetting modern compilers about use of dangerous, valid C. + + ok deraadt djm + + OpenBSD-Commit-ID: 030a71ff16bb1e6135170c6507bc558eabe7345c + +commit 33392024f46e7aabaeaf947cc3b110d60a9fd9e3 +Author: djm@openbsd.org +Date: Wed May 13 05:58:58 2026 +0000 + + upstream: avoid validating bad cipher or mac lists in config files + + / commandline arguments as valid. + + Identified by SUSE and reported by Camila Camargo de Matos + + ok deraadt@ tb@ + + OpenBSD-Commit-ID: 45d51154f2418549e08b80fa33df6c6532046054 + +commit cf6c0b3b94cdc223f1b8be1ef2d93e993af5d976 +Author: djm@openbsd.org +Date: Wed May 13 05:11:02 2026 +0000 + + upstream: fix hard-to-reach NULL deref during pubkey auth + + To hit this, the user must be using a PEM style private key with no + corresponding .pub key adjacent to it. + + OpenBSD-Commit-ID: b7150acc5322fa33f21491834d9471fbe3d30f20 + +commit 55df196e39cb23fd53e42b2f07292ffc01650bff +Author: Darren Tucker +Date: Tue May 12 19:53:54 2026 +1000 + + Retire OmniOS r151046 & r151054 test configs. + + They require packages from an external mirror which has been unreliable + lately, so stop relying on it. + +commit 6d9116d4dfefe387e42250ec7c01aad56ce43bda +Author: Darren Tucker +Date: Tue May 12 19:43:48 2026 +1000 + + Handle missing packages for FreeBSD 12.4. + + (Most) FreeBSD mirrors no longer have packages for 12.x, so install the + only thing we need (sudo) from source on. + +commit 99f1e0c2f91f00e0bb3c4a814ec448fda2b0e144 +Author: Darren Tucker +Date: Tue May 12 18:50:20 2026 +1000 + + OmniOS: check for gcc before installing. + +commit ded80eb0ff89f18ccf25cd3dc7997d92d755ef6a +Author: Darren Tucker +Date: Tue May 12 18:05:24 2026 +1000 + + Add VM test versions for : OmniOS and FreeBSD. + + Add OmniOS r151056 and r151058 (with build-essentials, so hopefully + faster and lower dependency) and FreeBSD 12.4 for better coverage. + +commit 67f31cefd8ccf0f55f24e806c4dc86b028fa65ff +Author: Damien Miller +Date: Tue May 12 14:36:27 2026 +1000 + + update getrrsetbyname.c from OpenBSD upstream + + revision 1.15 + date: 2026/05/09 01:54:51; author: tb; state: Exp; lines: +14 -13; commitid: zZPVUWycKAslGJtO; + Avoid recursive cleanup in getrrsetbyname() + + Instead of freeing struct dns_query and struct dns_rr by walking the + linked lists recursively, use a simple loop. This avoids a possible + stack exhaustion unlikely to be reachable with the limits modern + resolvers impose. + + From Dhiraj Mishra + +commit 56e73cd804cff08e38caaa03b75bec253f16fd62 +Author: Darafei Praliaskouski +Date: Sat May 9 19:50:31 2026 +0400 + + ci: avoid rsync dependency in NetBSD VM jobs + +commit ac4a41265a3beccba7dc6f45c657298311280f01 +Author: djm@openbsd.org +Date: Tue May 5 06:21:14 2026 +0000 + + upstream: unbreak; spotted by Darren's test army + + OpenBSD-Commit-ID: e95ceda842a2c7a08fc00ac3a529877d87fee7b2 + +commit 3754f2edd42039ace7d53873975870fbe9143b94 +Author: djm@openbsd.org +Date: Tue May 5 05:34:27 2026 +0000 + + upstream: classify dynamic-tcpip channels as bulk, not interactive; + + bz3958, ok markus@ + + OpenBSD-Commit-ID: b18f1c1eaff8423bf069ff6103e8865cec18d64b + +commit 4ea08a0353f85b5b0cc1ddd70da5fa23e7d588a4 +Author: Darren Tucker +Date: Mon May 4 23:33:57 2026 +1000 + + Improve NetBSD PAM tests. + + - Set random password and use for password auth test. + - When testing PAM builds, test with and without UsePAM. + +commit 504d01d81fe0d17725786b05737db9cd7f3b2b5c +Author: Darren Tucker +Date: Mon May 4 23:15:05 2026 +1000 + + Improve FreeBSD PAM tests. + + - Set random password and use for password auth test. + - When testing PAM builds, test with and without UsePAM. + +commit a05de3f67f69582e061445d5d78e5fcd01067299 +Author: Darren Tucker +Date: Mon May 4 22:57:58 2026 +1000 + + Update to FreeBSD 14.4, add 15.0. + +commit 6296749fe19a14d11826dd04591ebb84c110e96b +Author: Darren Tucker +Date: Mon May 4 21:40:52 2026 +1000 + + Improve Solaris PAM tests. + + - Set up and run tests with SUDO. + - Set random password to use for password & kbdint auth tests. + - Only run t-exec when re-testing with PAM, don't rerun unit tests. + - When testing PAM builds, test with and without UsePAM. + +commit f9d62eaa536cba92bcb42658ff5f72c287c47e49 +Author: Darren Tucker +Date: Mon May 4 21:39:01 2026 +1000 + + Only run t-exec when re-testing with PAM. + + There's no point rerunning unit tests. + +commit 05af6553e9026df935163a12d14ff4d205465717 +Author: Darren Tucker +Date: Mon May 4 18:47:03 2026 +1000 + + Add Solaris 11.4-clang-19 test. + +commit cb654c2ce7b0113a14aba979ffe9f7f5ad312013 +Author: Darren Tucker +Date: Mon May 4 17:41:37 2026 +1000 + + Add RUN_ONLY_PLATFORM to run a subset of tests. + +commit 328993c8991e5cde61f5abf1b87b26fa2537ae6c +Author: Damien Miller +Date: Mon May 4 16:05:34 2026 +1000 + + skip ("#if 0") strvisx and stravis + + we don't use the in OpenSSH and some compilers throw warnings + compiling them that break -Werror + +commit 5fa60ae0d2ed3fc441f54c9349afbd63b6301929 +Author: Darren Tucker +Date: Fri May 1 09:19:56 2026 +1000 + + Remove 9.9 and 10.0 branches from build status page. + +commit 7ab5e4073a508a342be49e2c238087b2de4e099f +Author: Renaud Allard +Date: Sat Mar 21 19:23:04 2026 +0100 + + vm.yml: fix solaris PAM tests + + Add missing SSHD_CONFOPTS="UsePam yes" to the solaris PAM test + step so it actually tests PAM functionality instead of re-running + the default tests with a PAM-enabled binary. + +commit 1c553a16065a95284468cd79b1c4919929dfe3ac +Author: djm@openbsd.org +Date: Wed Apr 29 22:22:10 2026 +0000 + + upstream: fiddle with mask after umask call and not before; avoids + + fortify warnings on android. bz3954 + + OpenBSD-Commit-ID: 82224426b2ee989c68f305caa50aa3d3b4993a84 + +commit 1bfe4ce37c3c531150b33d1a9d4dae6234028076 +Author: djm@openbsd.org +Date: Tue Apr 28 21:32:05 2026 +0000 + + upstream: unveil the actual listening socket path and its directory + + so it can be cleaned up at exit. + + Reported by / tested by David Krause, ok markus@ + + OpenBSD-Commit-ID: b45d740e9a63dec0fad436ed78f6912b39f0cd53 + +commit f24dc9e993de6f99d5dcb06ba3a401fe5792b2f4 +Author: job@openbsd.org +Date: Mon Apr 20 07:43:52 2026 +0000 + + upstream: Clarify comment on what setting extended types for + + channels does + + OK djm@ + + OpenBSD-Commit-ID: fa035fb19b74571992fa3adca4396a4c572a7a8a + +commit b9ccca0edfbd46b3114192956d9aaea3e7bc3c08 +Author: Darren Tucker +Date: Wed Apr 29 09:14:31 2026 +1000 + + Add tracking for 10.3 branch. + +commit 6185d1e6f74fb7749ff0227dfe44b2c3a9dd0885 +Author: Darren Tucker +Date: Tue Apr 28 09:09:57 2026 +1000 + + Rename obsd arm64 snapshot VM for consistency. + +commit 2029eddf4d57c654d53cdac7a192511de3b386dd +Author: dtucker@openbsd.org +Date: Mon Apr 27 05:49:41 2026 +0000 + + upstream: Use supported hostkeyalgorithms specifically in + + sshd_config instead of supported key types, which is almost but not + completely correct. + + OpenBSD-Regress-ID: 43c3b348576900f3e710bff5d6a87f0e803c5b3d + +commit ff254f67401fb27e6ae81a266f2d41d4c16bdbba +Author: claudio@openbsd.org +Date: Thu Apr 23 12:57:47 2026 +0000 + + upstream: Drop -Winline from CDIAGFLAGS it breaks on sparc64 + + On sparc64 ssh/unittests/kex fails to build with: + usr.bin/ssh/libcrux_mlkem768_sha3.h:8196: warning: inlining failed + in call to 'libcrux_ml_kem_polynomial_ZERO_89_ea': + --param max-inline-insns-single limit reached + + OK djm@ (long time ago) reminded by tb@ + + OpenBSD-Regress-ID: c32094e3436536474039a4aeefabdbf0bd826554 + +commit 2be9cec2fc062ffa087db55d26203db8f1567661 +Author: Darren Tucker +Date: Mon Apr 27 21:53:36 2026 +1000 + + Update OpenSSL tested versions. + +commit b41203e500e067095ef64a8de8ca4417a6f39552 +Author: Darren Tucker +Date: Mon Apr 27 21:16:56 2026 +1000 + + Comment out new PAM valgrind test until debugged. + +commit 4e0d1aea897d77d3b93e191eda58436e44a53818 +Author: Darren Tucker +Date: Mon Apr 20 18:47:23 2026 +1000 + + Simplify Cygwin permissions setting. + +commit 6c5235cb6692415e475fea4c0b69ee7ea0af8055 +Author: Darren Tucker +Date: Mon Apr 20 18:45:37 2026 +1000 + + Reorder steps to change perms before displaying. + +commit ba110a56a7180fef18e02dfaccad97cc510a558f +Author: Darren Tucker +Date: Mon Apr 20 22:46:17 2026 +1000 + + Allow setting TEST_SSH_TRACE via Github. + +commit 8751cd9c5cac7b358b5648df0510b3f53b95fc22 +Author: Darren Tucker +Date: Mon Apr 20 22:55:48 2026 +1000 + + Add tests for libressl-4.3.1. + +commit 1afbd7bd1fb71e8b1d06f99978d439aec59dddca +Author: Darren Tucker +Date: Mon Apr 27 20:51:17 2026 +1000 + + Re-enable SHA1 sigs in OpenSSL on Cygwin for tests. + + Recently Cygwin imported changes from Fedora which disable SHA1 + signatures by default. This breaks the unit tests (and a couple of + regression tests), so set rh-allow-sha1-signatures=yes in the OpenSSL + config to re-enable them. + +commit 7235471fb40705130d7f5816ec31ab562efc8cf9 +Author: Darren Tucker +Date: Sat Apr 25 20:00:38 2026 +1000 + + Check for OPENSSL_NO_ENGINE for --with-ssl-engine. + + OpenSSL 4 removes support for ENGINE, but it provides no-op stubs + for the ENGINE functions in addition to setting OPENSSL_NO_ENGINE. + + The presence of the stubs fooled the old configure test, so if someone + tried --with-ssl-engine with OpenSSL 4.0.0 it'd try but fail at build + time. Explicitly check for OPENSSL_NO_ENGINE. before trying to enable + ENGINE support. bz#3952. + +commit 45b30e0a5439a02417a4fe982a4b16a9c126ba6b +Author: djm@openbsd.org +Date: Sun Apr 19 23:37:22 2026 +0000 + + upstream: correctly set extended type for client-side channels. + + Fixes interactive vs bulk IPQoS for client->server traffic. ok job@ + + OpenBSD-Commit-ID: 34f5131face8d6dc4ae6955196e5fcafb3570cfe + +commit ca19b95ab6cd4efe5f2d8a08a377a2ac0b9caca1 +Author: job@openbsd.org +Date: Mon Apr 13 08:18:33 2026 +0000 + + upstream: Also show the duration of the current session through the + + ~I escape + + OK dtucker@ + + OpenBSD-Commit-ID: 695c1a09c4cc8b417a1bd3eb207b0cc7fa831c7a + +commit 00d955cf9e2e09eb3e98ebf6b375adccb7f25842 +Author: djm@openbsd.org +Date: Tue Apr 7 07:40:40 2026 +0000 + + upstream: want stdint.h here now that we've switched from u_intXX_t + + -> uintXX_t + + OpenBSD-Commit-ID: 6d5e80bd6f29a9db18b18beeb1cbe5423b59de44 + +commit eb34f95206c3556e10046f091ea95431c4be84f8 +Author: Bob Beck +Date: Thu Apr 16 10:09:02 2026 -0600 + + Make ci work for OpenSSL 4 variants + +commit 713ec5c5ae9b8ca91c3b752bec12e728612d13f4 +Author: Darren Tucker +Date: Thu Apr 16 20:55:23 2026 +1000 + + Test against OpenSSL 3.6.2, 4.0.0 and 4.0-stable. + +commit b6d46558dbd482d0d9c46ab53805d1803967b59c +Author: Dmitry Misharov +Date: Mon Mar 16 09:08:57 2026 +0100 + + account newer openssl versions in .github/setup_ci.sh + +commit f2da6737e237324b43afc002ce4836e65659fb2e +Author: Darren Tucker +Date: Thu Apr 16 19:32:34 2026 +1000 + + Match case with other messages. + +commit b433d015a6547598e568808d9cae16325bc8928f +Author: Damien Miller +Date: Wed Apr 15 08:14:58 2026 +1000 + + regen signature on allowed_signers file + + This was missed after the file was updated, but nobody noticed it + until now. + +commit 4168c905943f7f715182180b9f7c8cda54af2514 +Author: Damien Miller +Date: Thu Apr 2 18:56:48 2026 +1100 + + depend + +commit f8b9d694fc20349b6c48a4af03a0499dea00f5f9 +Author: Damien Miller +Date: Thu Apr 2 18:55:50 2026 +1100 + + Update versions in RPM spec files + +commit 5aa09926fbf050d484a79717fadec8360c5c5645 +Author: djm@openbsd.org +Date: Thu Apr 2 07:52:15 2026 +0000 + + upstream: adapt to username validity check change + + OpenBSD-Regress-ID: d22c66ca60f0d934a75e6ca752c4c11b9f4a5324 + +commit eb3a5bb2abd4798ff546564eb2210d188efaf0f1 +Author: djm@openbsd.org +Date: Thu Apr 2 07:51:12 2026 +0000 + + upstream: openssh-10.3 + + OpenBSD-Commit-ID: 05e22de74e090e5a174998fa5799317d70ad19c4 + +commit 76685c9b09a66435cd2ad8373246adf1c53976d3 +Author: djm@openbsd.org +Date: Thu Apr 2 07:50:55 2026 +0000 + + upstream: move username validity check for usernames specified on + + the commandline to earlier in main(), specifically before some contexts where + a username with shell characters might be expanded by a %u directive in + ssh_config. + MIME-Version: 1.0 + Content-Type: text/plain; charset=UTF-8 + Content-Transfer-Encoding: 8bit + + We continue to recommend against using untrusted input on + the SSH commandline. Mitigations like this are not 100% + guarantees of safety because we can't control every + combination of user shell and configuration where they are + used. + + Reported by Florian Kohnhäuser + + OpenBSD-Commit-ID: 25ef72223f5ccf1c38d307ae77c23c03f59acc55 + +commit fd1c7e131f331942d20f42f31e79912d570081fa +Author: djm@openbsd.org +Date: Thu Apr 2 07:48:13 2026 +0000 + + upstream: correctly match ECDSA signature algorithms against + + algorithm allowlists: HostKeyAlgorithms, PubkeyAcceptedAlgorithms and + HostbasedAcceptedAlgorithms. + + Previously, if any ECDSA type (say "ecdsa-sha2-nistp521") was + present in one of these lists, then all ECDSA algorithms would + be permitted. + + Reported by Christos Papakonstantinou of Cantina and Spearbit. + + OpenBSD-Commit-ID: c790e2687c35989ae34a00e709be935c55b16a86 + +commit 487e8ac146f7d6616f65c125d5edb210519b833a +Author: djm@openbsd.org +Date: Thu Apr 2 07:42:16 2026 +0000 + + upstream: when downloading files as root in legacy (-O) mode and + + without the -p (preserve modes) flag set, clear setuid/setgid bits from + downloaded files as one might expect. + + AFAIK this bug dates back to the original Berkeley rcp program. + + Reported by Christos Papakonstantinou of Cantina and Spearbit. + + OpenBSD-Commit-ID: 49e902fca8dd933a92a9b547ab31f63e86729fa1 + +commit c805b97b67c774e0bf922ffb29dfbcda9d7b5add +Author: djm@openbsd.org +Date: Thu Apr 2 07:39:57 2026 +0000 + + upstream: add missing askpass check when using + + ControlMaster=ask/autoask and "ssh -O proxy ..."; reported by Michalis + Vasileiadis + + OpenBSD-Commit-ID: 8dd7b9b96534e9a8726916b96d36bed466d3836a + +commit 78d549857e0cc480c3cbb0a3571078920e3b79c5 +Author: djm@openbsd.org +Date: Thu Apr 2 07:38:14 2026 +0000 + + upstream: Fix possible sshd crash when sshd_config set MaxStartups + + to a value <10 using the single-argument form of MaxStartups (e.g. + MaxStartups=3). This doesn't affect the three-argument form of the directive + (e.g. MaxStartups 3:20:5). + + Patch from Peter Kaestle via bz3941 + + OpenBSD-Commit-ID: 1ad093cae69f55ebfdea1ab24318aefd593d63b8 + +commit 5d72f1865b95ebfd99ea7baa8f6f2a4b721d151e +Author: Damien Miller +Date: Thu Apr 2 18:32:00 2026 +1100 + + properly bail out when PAM changes username + + OpenSSH doesn't support PAM changing its conception of the + username via a module calling pam_set_item(h, PAM_USER, ...). + We were supposed to bail out here, but I messed up while "fixing" + this last time and dropped a return statement. + + Reported by Mike Damm + +commit fe86c39751d38eb9e9b03ace1e31aa4586ea6660 +Author: Michael Forney +Date: Wed Apr 1 12:09:00 2026 +1100 + + avoid k suffix in dd count operand in sftp-resume test + + Not all dd implementations support this. POSIX only specifies + suffixes for block size operands. + + Instead, just use 1024k to avoid the special case. This also removes + an incorrect redirection operator that appeared in the 1m case. + +commit 52c01f2a8019002c70cfd93be87ff9adee1d0e73 +Author: Michael Forney +Date: Tue Mar 31 12:54:22 2026 +1100 + + add missing include to unit tests for printf + + This fixes the build with --without-openssl on musl. glibc worked + previously because it got stdio.h implicitly through resolv.h. + +commit 1340d3fa8e4bb122906a82159c4c9b91584d65ce +Author: Darren Tucker +Date: Mon Mar 30 21:58:44 2026 +1100 + + Add proxyjump.sh omitted from previous commit. + +commit 607bd871ec029e9aa22e632a22547250f3cae223 +Author: djm@openbsd.org +Date: Mon Mar 30 07:19:02 2026 +0000 + + upstream: add a regression test for ProxyJump/-J; ok dtucker + + OpenBSD-Regress-ID: 400dc1b5fb7f2437d0dfbd2eb9a3583dafb412b3 + +commit 55fc7bfd1d3a46f4856fd68f09da60d901fac626 +Author: dtucker@openbsd.org +Date: Tue Mar 24 12:31:35 2026 +0000 + + upstream: Use ~/.shosts for Hostbased test. + + OpenBSD-Regress-ID: ab64fd0a86422df1eadacde56c0a2cff5d93425d + +commit 445db5cb620d73c9af1f1791c523aaf3d2236854 +Author: dtucker@openbsd.org +Date: Tue Mar 24 10:21:14 2026 +0000 + + upstream: Ensure known_hosts file exists when setting up. + + OpenBSD-Regress-ID: 92721cad4c219fe62b7b795a73505c22e56f09e0 + +commit 2ecfcc0aae651621535e345a1c23ff6d2a9593c9 +Author: dtucker@openbsd.org +Date: Mon Mar 23 09:53:52 2026 +0000 + + upstream: Check if host keys exist before adding them, and expand + + on the warning about modifying the system config. + + OpenBSD-Regress-ID: 68038da909f9c992375b7665dab0331d6af426b7 + +commit 5576e260a0f9836ca55c8279e342c63d1a0851d1 +Author: dtucker@openbsd.org +Date: Mon Mar 23 09:09:36 2026 +0000 + + upstream: Add special handling of + + TEST_SSH_HOSTBASED_AUTH=setupandrun. + + This will MODIFY THE CONFIG OF THE SYSTEM IT IS RUNNING ON to enable + hostbased authentication to/from itself and run the hostbased tests. It + won't undo these changes, so don't do this on a system where this matters. + + OpenBSD-Regress-ID: ae5a86db1791a2b8f999b07b5c8cc756d40bf645 + +commit 0a0ef4515361143cad21afa072319823854c1cf6 +Author: djm@openbsd.org +Date: Mon Mar 30 07:18:24 2026 +0000 + + upstream: apply the same validity rules to usernames and hostnames + + set for ProxyJump/-J on the commandline as we do for destination user/host + names. + + Specifically, they are no longer allowed to contain most characters + that have special meaning for common shells. Special characters are + still allowed in ProxyJump commands that are specified in the config + files. + + This _reduces_ the chance that shell characters from a hostile -J + option from ending up in a shell execution context. + + Don't pass untrusted stuff to the ssh commandline, it's not intended + to be a security boundary. We try to make it safe where we can, but + we can't make guarantees, because we can't know the parsing rules + and special characters for all the shells in the world, nor can we + know what the user does with this data in their ssh_config wrt + percent expansion, LocalCommand, match exec, etc. + + While I'm in there, make ProxyJump and ProxyCommand first-match-wins + between each other. + + reported by rabbit; ok dtucker@ + + OpenBSD-Commit-ID: f05ad8a1eb5f6735f9a935a71a90580226759263 + +commit b62a6cfbed3481dac8bff35fab22cf489bb0b77f +Author: djm@openbsd.org +Date: Sun Mar 29 01:08:13 2026 +0000 + + upstream: switch from int to long long for bandwidth calculations; + + fixes rate display when rate > 2GB/s; based on patch from Cyril Servant + feedback/ok deraadt@ + + OpenBSD-Commit-ID: 071eb48c4cba598d70ea3854bef7c49ddfabf8d3 + +commit 54443b8665c9c29ea0e3f5a5176d8f3c3403ad7c +Author: Damien Miller +Date: Sun Mar 29 16:43:59 2026 +1100 + + depend + +commit c90f46b6230826cdadacd6c32b62b0f8106a09da +Author: Damien Miller +Date: Sun Mar 29 16:42:33 2026 +1100 + + use nonnull attribute when available + + Set this attribute on a few string to avoid compiler warnings from + -Wunterminated-string-initialization warnings in recent gcc. + +commit bdaf65ae51d62c6cb676bd341cc34217c1b24920 +Author: Damien Miller +Date: Sun Mar 29 16:24:59 2026 +1100 + + fix state confusion between PAM and privsep code + + Commits b9a6dd4d6 and df2b28163 introduced a potential desynchronisation + between the PAM code and the sshd-session monitor that could result in + authentication bypass if the unprivileged sshd-auth process had been + compromised. + + Reported by Ben Edelman of NIST. Only git HEAD is affected, these + changes have not yet been included in an OpenSSH release. + +commit 6eb5a68c42a587df802d3d9a19088671269ffca8 +Author: Laurent Chardon +Date: Sat Mar 28 04:22:54 2026 -0400 + + openbsd-compat: reword EAI_NONAME error string + + Reword the EAI_NONAME message in fake-rfc2553.c to make it + clearer and grammatically correct. + + While there, remove a couple of stray periods from other error + strings to keep the messages consistent. + + No functional change. + +commit fd7d4b2b52deaf296b06d78b85c97fdae31912e8 +Author: Icenowy Zheng +Date: Sun Mar 22 15:13:31 2026 +0800 + + seccomp sandbox: allow riscv_hwprobe syscall if present + + The development branch of zlib-ng now contains code for utilizing + riscv_hwprobe syscall to retrieve availability information for several + RISC-V extensions (and accelerate deflate algorithm with them). + + As the seccomp sandbox of OpenSSH will raise SIGSYS for filtered out + syscalls, this will abruptly terminate the process when the + riscv_hwprobe syscall is tried. + + Put it into the allowlist to prevent process termination. As all + syscalls here are guarded by #ifdef's, the same will be done for + riscv_hwprobe, and thus on non-RISC-V builds nothing will happen. + + Signed-off-by: Icenowy Zheng + +commit fd5018fbeb6e91ae4321490c2825ecc632b83748 +Author: djm@openbsd.org +Date: Sat Mar 28 05:16:18 2026 +0000 + + upstream: ensure c->local_window doesn't underflow during updates; + + similar to checks performed elsewhere. From Renaud Allard + + OpenBSD-Commit-ID: 4827c10807936e9ab9af2cf1c7379e1f56dbdeac + +commit 8331cb9daafd23391de4379e9977ff159bb8242e +Author: djm@openbsd.org +Date: Sat Mar 28 05:10:25 2026 +0000 + + upstream: fix base16 parsing; currently unused. From Renaud Allard + + OpenBSD-Commit-ID: 3f6e5d4c6a2550d5a7e3c33bcd895b7f8e42196b + +commit 21ecb5fd72ee442a8b1eb5011c7f929ba8ce02f9 +Author: djm@openbsd.org +Date: Sat Mar 28 05:07:12 2026 +0000 + + upstream: mention that RevokedKeys is read by the server at each + + authentication time and should only ever be replaced atomically. + + OpenBSD-Commit-ID: eeedf5a10331ac4e39fbd2fc41e4a11c38b2ef9b + +commit c5182e3f06f9f1fd86d62b9dcd0397408dd698da +Author: djm@openbsd.org +Date: Sat Mar 28 05:06:16 2026 +0000 + + upstream: fix potential hang if /etc/moduli doesn't contain the + + requested DH group values; from 77c9ca, ok dtucker@, markus@ + + OpenBSD-Commit-ID: 1bf402cdb8876237c280ac77fbf7fafd2c16c5ae + +commit d3efbba14fda78ed7b15fbc34cf34c1cf27d1716 +Author: Darren Tucker +Date: Thu Mar 19 17:57:26 2026 +1100 + + Add a VM-based test for OpenBSD-current. + +commit 4bb4f1601e0776e71cfca50aae3680eb0771e2d0 +Author: Darren Tucker +Date: Mon Mar 23 17:50:40 2026 +1100 + + Add a Valgrind test of the PAM config. + +commit 12da685dfc98b14dddb5977a1fc52d06474f3308 +Author: Darren Tucker +Date: Thu Mar 19 17:52:54 2026 +1100 + + Upstream tests don't use the config file. + +commit 2ca6eef69d7dbecfd67cede25ea6a9aa1074ba3e +Author: djm@openbsd.org +Date: Mon Mar 23 01:33:46 2026 +0000 + + upstream: clarify that Authorized(Keys|Principals)(File|Command) + + are only consulted for valid users. + + clarify that TOKENS are expanded without sanitisation or escaping + and that it's the user's reponsibility to ensure their usage is + safe. + + prompted by bz3936; feedback/ok deraadt@ + + OpenBSD-Commit-ID: cd58abad1137346ba2dee55fa9ebb975f5fa7a06 + +commit 443616ce9070d370c97271347e91fcfd24b5df84 +Author: djm@openbsd.org +Date: Thu Mar 19 02:36:28 2026 +0000 + + upstream: repair ssh-keysign after pledge changes; spotted/tested + + by naddy@ ok deraadt@ + + OpenBSD-Commit-ID: fccc6c7994c8f45c4417efe490d23154d9caaa6d + +commit 552a5c786b60a9cfe0d2c157dd18f78950529513 +Author: dtucker@openbsd.org +Date: Wed Mar 11 09:10:59 2026 +0000 + + upstream: Check return values of fcntl(... O_CLOEXEC) + + calls by reusing the macro in monitor.c. Flagged by Coverity CID + 901297 in ssh-sk-client.c, a few other instances added for good measure. + begrudging ok deraadt@ + + OpenBSD-Commit-ID: b9de92e17ac0b04348770e5a25cb15a02b416926 + +commit 24168275e6d0b29cf2233c3f2c1d4a4614feb582 +Author: dtucker@openbsd.org +Date: Wed Mar 11 09:04:17 2026 +0000 + + upstream: Fix potential 1-byte array overrun + + in the case where read() returns exactly 100 bytes. Flagged by Coverity + CID 901296, ok djm@ + + OpenBSD-Commit-ID: 66a96b08166e63dcbeed00297c33f09c4f22c1f7 + +commit 70a41262839a2d65ca8ef9e8ea34ad471c52afa1 +Author: djm@openbsd.org +Date: Tue Mar 10 07:27:14 2026 +0000 + + upstream: whitespace + + OpenBSD-Commit-ID: b16d2b4a96406538fa181053926cba44abca7f29 + +commit ef98b6014bc3268e904092894ffcb63022172a97 +Author: deraadt@openbsd.org +Date: Tue Mar 10 06:35:29 2026 +0000 + + upstream: when unveils error our, use correct variable + + OpenBSD-Commit-ID: 6b496c10965e70413a9916a8823839c553c6b2c4 + +commit beba5884dfe8cc30aadef439af5e5d784b5788b1 +Author: deraadt@openbsd.org +Date: Tue Mar 10 03:45:01 2026 +0000 + + upstream: When execve() failure is indicated on the pipe, replicate + + the same error conditions as the previous access() check did ok djm + + OpenBSD-Commit-ID: 875a77dddf0809a3501de2b913cb3bfd4b64f3f7 + +commit 2a9e1aadaa20a05430bddc30853fbd3449083a4d +Author: djm@openbsd.org +Date: Tue Mar 10 03:40:26 2026 +0000 + + upstream: unveil ssh-pkcs11-helper too; fixes breakage spotted by + + anton@ + + If SK/P11/askpass is overridden by environment, only unveil the requested + path and not both the requested one and the default. + + feedback/ok deraadt@ + + OpenBSD-Commit-ID: 84356c6a44f35e66fe73fc1524a7c8e908521eb2 + +commit 46eb7dc5a6f312f99437ebdcf04f0f2c03aa570b +Author: deraadt@openbsd.org +Date: Sat Mar 7 18:35:43 2026 +0000 + + upstream: With it's own daemonization / fd cleaning code, ssh-agent + + opens /dev/null O_RDWR after a pledge without "wpath". This is allowed in + current pledge because "/dev/null" is implicitly allowed to be opened even + with the most restrictive pledges or unveils. This is a design decision in + pledge made at the very beginning, to satisfy libc requirements. We've + finally had enough experience and know how to fix that in the near-future, + but need to review and fix all code which opens these implicit paths. The fix + is to add "wpath", so that "/dev/null" can be opened O_RDWR. But that is + uncomfortable, so we add unveil() allowing "/" with "r", 4 unveil "x" for the + potential askpass and helpers to be execve'd, and "/dev/null" with "wr". As + a result filesystem access is substantially more restricted than before, and + ssh-agent is ready for the future pledge change. ok djm dtucker + + OpenBSD-Commit-ID: f223b11d2db3c0b14e53c1de59966dd5f372a977 + +commit b75bf339eae6115c544bdcefa0d67a6dcc971ec5 +Author: deraadt@openbsd.org +Date: Sat Mar 7 18:27:52 2026 +0000 + + upstream: Stop doing access() before execve(). It is a TOCTOU, but + + also it forces use of unveil "rx" instead of "x". This is done by using a + pipe() through the fork+execve attempt to expose execve failure and create + the same error return as the access() used to do. ok djm dtucker + + OpenBSD-Commit-ID: f9ee96e20352f35dc6f39127e0cc6b804700200a + +commit 73888af650f0ce27cd93797f3e351b2d1b670550 +Author: Damien Miller +Date: Tue Mar 10 14:43:30 2026 +1100 + + stubs for OpenBSD unveil(2) + +commit 4e15f7fc0c0ba897c227350eee1462d635ab32a6 +Author: dtucker@openbsd.org +Date: Fri Mar 6 07:06:45 2026 +0000 + + upstream: Move OpenBSD CVS ID marker to top of file to avoid conflicts + + when syncing changes to portable. + + OpenBSD-Regress-ID: 6b7a9ef354e13e26ed474e98d04ec1d74e56e54e + +commit 2df416dff1a1d5fb31598b7ce8fb5cb6b0f64fd3 +Author: dtucker@openbsd.org +Date: Fri Mar 6 06:57:33 2026 +0000 + + upstream: Replace u_intXX_t types with the equivalent C99 uintXX_t + + types to match similar change to the main ssh code. + + OpenBSD-Regress-ID: a62b6499f784f75a4fcb865aebb83f5936917a91 + +commit e067ccd6b4306ca6422d94ff7ddd231cbddd43cb +Author: djm@openbsd.org +Date: Thu Mar 5 05:44:15 2026 +0000 + + upstream: ssh-agent supports a "query" extension that allows a + + client to request a list of extensions it support. This makes this capability + available to ssh-add via the -Q flag. + + ok markus@ + + OpenBSD-Commit-ID: f211630568ff1a7d6bb4983a94f05ddac1c2d4eb + +commit 4fe278629c3f792628ea71132ba4fcbb9ceaa6b7 +Author: djm@openbsd.org +Date: Thu Mar 5 05:40:35 2026 +0000 + + upstream: With IANA codepoints for draft-ietf-sshm-ssh-agent now + + allocated, it's safe to start using the standard names for requesting agent + forwarding over the @openssh.com extension names we've used to date. + + Support for the standard names is advertised via EXT_INFO. When the + client sees such support it will use the new names preferentially, + but the existing names remain supported unconditionally. + + ok markus@ + + OpenBSD-Commit-ID: 1ab4a0b4de01e81a432875c2b7e5f7357e231af3 + +commit 511f5bc41aeca7f6ee6611e9b24d48e4dd6ae3d5 +Author: djm@openbsd.org +Date: Thu Mar 5 05:35:44 2026 +0000 + + upstream: correctness wrt draft-ietf-sshm-ssh-agent: + + extension requests should indicate failure using + SSH_AGENT_EXTENSION_FAILURE rather than the generic SSH_AGENT_FAILURE + error code. This allows the client to discern between "the request + failed" and "the agent doesn't support this extension". + + ok markus@ + + OpenBSD-Commit-ID: d15d89f210cc973271d68147f09550163df731c9 + +commit 2a387ba37452971747d2f00db7d4c18b4f2c45ed +Author: dtucker@openbsd.org +Date: Tue Mar 3 09:57:25 2026 +0000 + + upstream: Replace all remaining instances of u_intXX_t types with the + + C99 equivalent uintXX_t types. ok djm@ + + OpenBSD-Commit-ID: d9b81151266adb129574ce268af49f14ac23e65b + +commit bb781f02d4efd178e329a62a838962bee16e3e9b +Author: djm@openbsd.org +Date: Mon Mar 2 02:40:15 2026 +0000 + + upstream: Move banner exchange to sshd-auth process + + Previously, exchange of the initial SSH- banners was performed + by the privileged sshd-session monitor. This moves it to the + unprivileged sshd-auth subprocess, removing ~200 LoC from the + monitor's privileged attack surface. + + The monitor gains a new "setcompat" RPC to allow sshd-auth to + inform it of bug compat flags picked up from the client's banner. + + feedback dtucker@, ok markus@ deraadt@ + + OpenBSD-Commit-ID: d767eb1183630d754d521d9f0d84a6c72fbe7fc8 + +commit b50b881b17ab15e34b5e57b159b65f2a02725798 +Author: Darren Tucker +Date: Sun Mar 1 09:46:39 2026 +1100 + + Try -lstdc++ for libcrypto before giving up. + + BoringSSL recently added destructors to libcrypto, which requires + linking against libstdc++, so when checking for a working libcrypto if + at first the link fails, try again with -lstdc++ before giving up. + +commit c26d90e5ad05372b63dbb8727cb6c23a6505a2fb +Author: Darren Tucker +Date: Sun Mar 1 09:41:39 2026 +1100 + + Remove BoringSSL rpath as it's statically linked. + +commit c65f4d2586416274e92720c9e1e745422e182488 +Author: dtucker@openbsd.org +Date: Tue Feb 24 01:50:51 2026 +0000 + + upstream: Use fmprintf instead of logit for challenge-response name and + + info to preserve UTF-8 characters where appropriate. Prompted by github + PR#452, with & ok djm@. + + OpenBSD-Commit-ID: e6361242329ec6925571478f60f4739726aad308 + +commit acf749756872d7555eca48514e5aca6962116fb2 +Author: Darren Tucker +Date: Tue Feb 24 11:28:11 2026 -0500 + + Add AWS-LC and BoringSSL as potential libcryptos. + +commit c25254d1516df5e57affc0e391ed6ead8267b637 +Author: Darren Tucker +Date: Tue Feb 24 11:16:11 2026 -0500 + + Add self-hosted status to main README now it's public. + +commit 5da0ccec2b5806f104913465b62fea475b2e15bb +Author: Darren Tucker +Date: Tue Feb 24 11:10:16 2026 -0500 + + Remove anchor to specific release notes version. + +commit d7a9cd696a316c71e4c16f4158dc516b94abd863 +Author: Darren Tucker +Date: Mon Feb 23 21:34:48 2026 -0500 + + Remove potentially leftover include compat shims. + + If we don't need a specific shim, ensure it does not exist. Prevents + confusion if configurations change or the directory is reused across + different platforms. + +commit c940e709ae2155a4614bc3709e393d88fdddabde +Author: Darren Tucker +Date: Mon Feb 23 20:54:55 2026 -0500 + + Check regress passwd is set before enabling kbdint. + +commit 4ed5f9ecca9ed867c9f1040a3425af35f0703675 +Author: dtucker@openbsd.org +Date: Tue Feb 24 00:39:59 2026 +0000 + + upstream: Remove leftover debugging. + + OpenBSD-Regress-ID: e778d76b21696a14db80f31b9e79601f2d7a9abf + +commit a07a53b00e9aeadb420336783d219be012d88ba1 +Author: Darren Tucker +Date: Mon Feb 23 15:22:10 2026 -0500 + + Activate kbdint test on PAM configs. + +commit 5f98660c51e673f521e0216c7ed20205c4af10ed +Author: Darren Tucker +Date: Wed Feb 18 12:39:31 2026 -0500 + + Install libaudit-dev for --with-audit=linux test. + +commit c9fcea8865b255d4b7566b28dce4af348d2bfbd6 +Author: Darren Tucker +Date: Wed Feb 18 11:22:37 2026 -0500 + + Enable BSM audit test on FreeBSD VMs. + +commit f1a9628cd7e415ce14e157d80c10b61514a22d13 +Author: Darren Tucker +Date: Wed Feb 18 10:59:02 2026 -0500 + + Move BSM audit test to selfhosted runner. + + The vmactions VM on Github does not have the required libraries + installed. + +commit 97e8e66219d036404ae656060f0e0179b61f0614 +Author: Darren Tucker +Date: Wed Feb 18 10:51:09 2026 -0500 + + Increase riscv64 test coverage. + + The machine running the tests has been replaced with a faster one. + +commit e5e18432a27b909aa2194ef0b28a5d49f0e6b3a6 +Author: Darren Tucker +Date: Wed Feb 18 10:49:35 2026 -0500 + + Whitespace fix. + +commit b0463306174941274a1f96eb705618e036832920 +Author: Darren Tucker +Date: Wed Feb 18 09:48:55 2026 -0500 + + Add test coverage for all of the --audit= configs. + +commit 84206bde8adbef2dfe4f5b97dd23399827015333 +Author: djm@openbsd.org +Date: Wed Feb 18 03:04:12 2026 +0000 + + upstream: same treatment for remote/remote copies (i.e. scp -3): + + adjust permissions on destination directory only if we created it or -p was + requested. bz3925 + + OpenBSD-Commit-ID: d977006df7b8330e06ceaa319383b347f1aca3ef + +commit c3631567d9f77c2d073764e4b40f249687f4083e +Author: djm@openbsd.org +Date: Wed Feb 18 02:59:27 2026 +0000 + + upstream: when uploading a directory using sftp/sftp (e.g. during a + + recursive transfer), don't clobber the remote directory permissions unless + either we created the directory during the transfer or the -p flag was set. + bz3925 ok dtucker@ + + OpenBSD-Commit-ID: d66f40d01de05c9ec4029fab5413325301039b3a + +commit 2b0f4a72bd87bef7cc9f0a1889cfc98545cbb158 +Author: djm@openbsd.org +Date: Tue Feb 17 21:45:07 2026 +0000 + + upstream: make IPQoS first-match-wins in sshd_config as it's + + intended to be bz3924 + + OpenBSD-Commit-ID: 42753eb8400ab09713c69ace6fa8bfdde133f942 + +commit 0e35095babe04ba1159e8029133e7f71e53d8fdb +Author: jsg@openbsd.org +Date: Mon Feb 16 23:47:06 2026 +0000 + + upstream: remove duplicate includes; ok dtucker@ + + OpenBSD-Commit-ID: 6b9191bc1a0f4320c926d5ccd9f36b09f0f3bcaf + +commit 9eb778cfde5bca1d84bbad74d8664256301bb13b +Author: Darren Tucker +Date: Mon Feb 16 18:58:04 2026 -0500 + + Restore utf8.h removed earlier as it's needed. + + ... for msetlocale prototype. + +commit 723b76c8a358875cd53376c9a169887ba7a4b088 +Author: Darren Tucker +Date: Mon Feb 16 18:32:41 2026 -0500 + + Removed duplicate includes; spotted by jsg@. + +commit df2b28163ac75e023837de445d6492dc57359105 +Author: Darren Tucker +Date: Sun Feb 15 14:16:56 2026 -0500 + + Remove "draining" of PAM prompts. + + With the previous commit, both prompts and info/error error messages are + returned to keyboard-interactive immedately and none are accumulated, so + there will never be any un-drained prompts. ok djm@ + +commit b9a6dd4d66ee14577494d550b396d0452bf05e1e +Author: Marco Trevisan (Treviño) +Date: Tue Oct 17 04:27:32 2023 +0200 + + auth-pam: Immediately report interactive instructions to clients + + SSH keyboard-interactive authentication method supports instructions but + sshd didn't show them until an user prompt was requested. + + This is quite inconvenient for various PAM modules that need to notify + an user without requiring for their explicit input. + + So, properly implement RFC4256 making instructions to be shown to users + when they are requested from PAM. + + Closes: https://bugzilla.mindrot.org/show_bug.cgi?id=2876 + +commit a1158bba43e00240c00c530596de2d4e1d405b50 +Author: Matthew Heller +Date: Mon Oct 14 09:25:41 2024 -0500 + + fix duplicate PAM msgs, missing loginmsg reset + + without this change in mm_answer_pam_account all messages added in + auth-pam.c sshpam_query(...) case PAM_SUCCESS end up sent here, then are + still sitting in the loginmsg buffer and printed a second time in + session.c do_login(...) + +commit 7a59f55e621c841aab187c96e0f3271c5c799709 +Author: dtucker@openbsd.org +Date: Mon Feb 16 00:45:41 2026 +0000 + + upstream: Reorder headers to match KNF and Portable. + + ID sync only. + + OpenBSD-Commit-ID: b7f9700d07b532eb3720f7bd722b952e31b1752f + +commit c5cee49a0c5721532716365f32977fc02eeea1d5 +Author: dtucker@openbsd.org +Date: Sun Feb 15 22:29:30 2026 +0000 + + upstream: Add basic test for keyboard-interactive auth. + + Not enabled by default since it requires some setup on the host. + + OpenBSD-Regress-ID: aa8a9608a2ea2e5aaa094c5a5cc453e4797cd902 + +commit 07c6413e7bf08b7bfc6fd543eded9da68898e230 +Author: jsg@openbsd.org +Date: Sat Feb 14 00:18:34 2026 +0000 + + upstream: remove unneeded includes; ok dtucker@ + + OpenBSD-Commit-ID: bba6e85492276c30c7a9d27dfd3c4c55fa033335 + +commit d8b806a2e6cd50c729e5d2bad569955a1df33f63 +Author: Darren Tucker +Date: Sun Feb 15 13:31:52 2026 -0500 + + Remove obsolete comment referencing auth-chall.c. + + It was removed in commit 6cb6dcff along with the rest of the SSH1 server + support. + +commit 3e8a45e0eeb5c84f12ac04ea7cc2f831c91c263b +Author: Marco Trevisan (Treviño) +Date: Mon Oct 16 21:15:45 2023 +0200 + + auth-pam: Add an enum to define the PAM done status + + Makes things more readable and easier to extend + +commit 9b0e50b4132679f0c09c0f1272bf1c45959103ea +Author: Marco Trevisan (Treviño) +Date: Tue Oct 17 04:35:17 2023 +0200 + + auth-pam: Add debugging information when we receive PAM messages + +commit c2447697aaecae11d164f1ba30e06d14b5cabcdd +Author: Darren Tucker +Date: Fri Feb 13 15:34:44 2026 -0500 + + Remove DragonFlyBSD workaround for sys/mount.h. + + ... since we're not not including it at all any more. + +commit 8b3a0552054106feb036c632fc844f878568799f +Author: dtucker@openbsd.org +Date: Fri Feb 13 19:06:18 2026 +0000 + + upstream: Replace with + + The former is a portability hassle, but it turns out the only thing we + need from it is PATH_MAX which we can get directly from limits.h. + + OpenBSD-Commit-ID: ccfbbd678bef3a3930ae89da456645c3ee5f83c0 + +commit db475199639667197b12b3aa5205de71ef102e23 +Author: jsg@openbsd.org +Date: Fri Feb 13 01:04:47 2026 +0000 + + upstream: remove unneeded forward struct declaration ok djm@ + + OpenBSD-Commit-ID: a0c97e919667394bef8dbf31df72af3ba07542e9 + +commit ae51e05dbd840ad674fee754f33c0e2fd141074e +Author: djm@openbsd.org +Date: Wed Feb 11 22:58:23 2026 +0000 + + upstream: very basic testing of multiple files in RevokedKeys and + + RevokedHostkeys + + OpenBSD-Regress-ID: 6cee76bcc4bd6840bc8d39dd0d32d724e1427aa7 + +commit 2f51e29b9a0ffd7acb9dc70d90defa466b5695d4 +Author: djm@openbsd.org +Date: Wed Feb 11 22:57:55 2026 +0000 + + upstream: support multiple files in a ssh_config RevokedHostKeys + + directive bz3918; ok dtucker + + OpenBSD-Commit-ID: 0ad2eacf836f912f347846ab84760799033dd348 + +commit 135a62238a479c7369f2b2d5dafb921ddc1c2b74 +Author: djm@openbsd.org +Date: Wed Feb 11 22:57:16 2026 +0000 + + upstream: support multiple files in a sshd_config RevokedKeys + + directive bz3918; ok dtucker + + OpenBSD-Commit-ID: 9fc58c4e676f8e9ed2e3a0da666242a17b8a55b2 + +commit 3160f2a97e875bfa9454f98899cbccad48c96ff4 +Author: dtucker@openbsd.org +Date: Wed Feb 11 17:05:32 2026 +0000 + + upstream: Add includes used in Portable to reduce diffs. + + OpenBSD-Commit-ID: 186c60cf2da0ddb075d5bc4879e87bbd8779b7e4 + +commit 6a756f3f7b9f87f24e948ec1de0266f5c1587811 +Author: dtucker@openbsd.org +Date: Wed Feb 11 17:03:17 2026 +0000 + + upstream: Remove unused sys/queue.h include. + + OpenBSD-Commit-ID: 564f75672e27f1006f280614934eb304abe69167 + +commit c169300df12b9aa7005ff6e61880a7e007e83bc5 +Author: dtucker@openbsd.org +Date: Wed Feb 11 17:01:34 2026 +0000 + + upstream: Reorder includes and defines to match both KNF and + + Portable. + + OpenBSD-Commit-ID: f3f179c095f8e4787ded5f450e2842881f6b8ab2 + +commit 1a4eb511abaf3522b84fa5697524b81b4865279b +Author: Darren Tucker +Date: Wed Feb 11 17:36:42 2026 -0500 + + Factor out RNG reseeding in to a single function. + + sshd and sshd-session both reseed the RNG after a fork. Move the + existing reseed_prngs() function into entropy.c and use for both. + Clean up entropy.h too. ok djm@ + +commit 81746188e9333b166b4c31f9654d8eb249ddd897 +Author: Darren Tucker +Date: Wed Feb 11 16:47:27 2026 -0500 + + Remove do_pam_chauthtok since it's no longer used. + +commit f1b9e0f7f1f1ed5be2bd1c39bda03fc99a1cf5d8 +Author: dtucker@openbsd.org +Date: Wed Feb 11 16:57:38 2026 +0000 + + upstream: Pass actual size of the buffer to hostname() instead of a + + define that's probably the same. ok millert@ djm@ + + OpenBSD-Commit-ID: 7c97b22439100b4193404ccfa1e5f539c5a8d039 + +commit 4ef24496b7c4c918d4d3a049f83739fbe2e36e9f +Author: dtucker@openbsd.org +Date: Mon Feb 9 22:15:45 2026 +0000 + + upstream: De-underscore __inline__ to match -portable + + (and every other use of it in ssh). ID sync only. + + OpenBSD-Commit-ID: 83c913d5e2345635bc5434167ed67cec5409d494 + +commit c8972792e5ce599e584bbe1aa084cc4056f1afe5 +Author: dtucker@openbsd.org +Date: Mon Feb 9 22:12:48 2026 +0000 + + upstream: Remove references to skey auth which is long gone. + + ID sync only. + + OpenBSD-Commit-ID: 0c2340566c399f7f74fe4c5366394974cd6fd122 + +commit db779679839d2798de7cda196a3fe750a12845e8 +Author: dtucker@openbsd.org +Date: Mon Feb 9 22:11:39 2026 +0000 + + upstream: Remove unused OpenSSL includes, + + that are no longer used, even when building with OPENSSL=yes. + + OpenBSD-Commit-ID: e97e3e551ade9aee994b80a1d5851be6f32288e3 + +commit 8ec21f6274108e93601173ec4e6f7528b90b0003 +Author: dtucker@openbsd.org +Date: Mon Feb 9 22:09:48 2026 +0000 + + upstream: Use https for URLs. + + ID sync only. + + OpenBSD-Commit-ID: 85b2919e95e6d2bfdeddf5e3b0709fb5b6b4c438 + +commit c3eaa953ae78e581d7ba2327beea35206a14bc1e +Author: dtucker@openbsd.org +Date: Mon Feb 9 21:38:14 2026 +0000 + + upstream: Remove unused OpenSSL includes, + + which are no longer used even when building with OPENSSL=yes. + + OpenBSD-Commit-ID: 31adb21bf3f8f5c13cde59229f1b85c20f19a858 + +commit 280cf58afe71bf34141e732d30676367f0150bbe +Author: dtucker@openbsd.org +Date: Mon Feb 9 21:23:35 2026 +0000 + + upstream: Remove now-unused SKEYQUERY enums from monitor_reqtype. + + ID sync only. + + OpenBSD-Commit-ID: dab93b58e69c754887507e5557a81a0b5b84d734 + +commit bb2703365ede3b4e13fdfa1c250ac88408e75f38 +Author: dtucker@openbsd.org +Date: Mon Feb 9 21:21:39 2026 +0000 + + upstream: Remove now-unused openssl includes since sshd.c no longer + + needs them, even when built with OpenSSL. + + OpenBSD-Commit-ID: ceaa0394db1520e92d75c37eea58130d44ba93c9 + +commit 8a5d591c9f42933c49ece95e49c116d684d6cca0 +Author: Darren Tucker +Date: Wed Feb 11 11:38:58 2026 -0500 + + Don't create sys/mount.h shim except on DragonFly. + + Fixes build on Mac OS X. + +commit 957cb0fbe87b6ab76045e8dc99426db6afb54057 +Author: Darren Tucker +Date: Tue Feb 10 08:55:53 2026 +1100 + + Minor resync with upstream + + Reorder definitions add whitespace to eliminate diffs vs upstream. + +commit 4922635d3e66f9107c5b68a0a3fa57ddf0d820ae +Author: Darren Tucker +Date: Tue Feb 10 07:22:30 2026 +1100 + + Factor out COMPATINCLUDES into its own variable. + +commit 3e9c4ed3b0e5d3890fcd2cbc9c3b595f17ea1946 +Author: Darren Tucker +Date: Tue Feb 10 05:34:46 2026 +1100 + + Provide compat shims for sys/{mount.h,statvfs.h). + + In addition to shimming on platforms that don't have them, we also need to + shim sys/mount.h on DragonFlyBSD since it uses its native STAILQ_ENTRYs + which our compat queues.h does not have, which causes sftp-server.o to + not build. This is a little icky, but it limits the blast radius to + just one source file on only DragonFly. ok djm@ + +commit eeb671fa2f0fd7dda4c6b726098fe28016dc185b +Author: Darren Tucker +Date: Tue Feb 10 03:39:45 2026 +1100 + + Shim and . + + This significantly reduces the diff vs upstream making future syncs + less painful. ok djm@ + +commit 47828dbd95c095d0cad327e12bb6859a510833c8 +Author: dtucker@openbsd.org +Date: Sun Feb 8 19:54:31 2026 +0000 + + upstream: Reorder headers according to KNF, + + and pull in a few we don't have from Portable. + + OpenBSD-Commit-ID: d83f6c75da7bfb16bbff40fd2133d6eba4aba272 + +commit c73b8b09bf43be3dfe14bc0da349b352b280a74a +Author: dtucker@openbsd.org +Date: Sun Feb 8 17:51:43 2026 +0000 + + upstream: Include sys/socket.h to match -portable, + + eliminating one diff. + + OpenBSD-Commit-ID: 7670fdf35b0c7aee41cd0d6ded86b4792e261f36 + +commit 9385d72dd36ba6050b5f7728c14e3edc8329fe95 +Author: dtucker@openbsd.org +Date: Sun Feb 8 17:50:49 2026 +0000 + + upstream: Reorder headers as per KNF. + + OpenBSD-Commit-ID: 3e29fabe20422454fd5d77f85c853e1e557f2181 + +commit 62439369181b9b1dabf1ec3c2de6a7fbfcfb45eb +Author: Darren Tucker +Date: Mon Feb 9 06:56:35 2026 +1100 + + Remove openindiana VM test. + + When it works it's by far the slowest (>1h to install packages) and the + package installation is flaky. We can bring it back if their infra ever + improves. + +commit 43d0bf02d84a20a3f7c9992dabf8c109d9c25bed +Author: Darren Tucker +Date: Mon Feb 9 06:42:27 2026 +1100 + + Sync header order with upstream and KNF. + +commit a3742cc38a6aa48a653a1a6300bc825f083955af +Author: Darren Tucker +Date: Mon Feb 9 06:41:07 2026 +1100 + + Sync whitespace with upstream. + +commit b62198a19a53227ca166c62825ac72a7696c42ed +Author: Darren Tucker +Date: Mon Feb 9 05:02:36 2026 +1100 + + Sync header order with upstream. + +commit 98fdb05f0c0d7a89a066225a94eafd7fce10163d +Author: Darren Tucker +Date: Mon Feb 9 04:09:26 2026 +1100 + + Remove generic check for getpagesize. + + We have a more specific check later. + +commit 249476f45dba9a92056bd2935aae7429f0f3b17c +Author: Darren Tucker +Date: Mon Feb 9 03:47:25 2026 +1100 + + Test KERBEROS5=yes builds on OpenBSD. + +commit 6adb65508efc2def558f50a56c5eada09ca500c9 +Author: dtucker@openbsd.org +Date: Sun Feb 8 15:28:01 2026 +0000 + + upstream: Make ssh optionally build with Kerberos 5 against the + + Heimdal port. This updates the Makefiles and repairs some bitrot in headers, + resyncing them against Portable. To do this, "pkg_add heimdal" then "make + KERBEROS5=yes". ok djm@ + + (ID sync only) + + OpenBSD-Commit-ID: 31f95c9ba58aa7ba89264f1d80c79106042b1095 + +commit d6c672a8c16c8962e6b3022e279441fa6630cb86 +Author: dtucker@openbsd.org +Date: Sun Feb 8 03:30:15 2026 +0000 + + upstream: Remove sys/poll.h since we also have poll.h. + + Also removes one line of diff vs portable. + (ID sync only). + + OpenBSD-Commit-ID: 461bd0cd35bfad82bd06892ccb0ff0fac15d1d27 + +commit 8605ed26334b9ae704b8abe51940b61bdfe1e974 +Author: dtucker@openbsd.org +Date: Sun Feb 8 00:16:34 2026 +0000 + + upstream: Move setting of user, service and style earlier since + + -portable needs to use these when setting up PAM. Removes two diffs vs + portable. + + OpenBSD-Commit-ID: 8db130d42a3581b7a1eaed65917673d4474fc4fe + +commit ecaaa4f9e44764e55c152a84af3d7efb63c50ce7 +Author: Darren Tucker +Date: Sun Feb 8 11:30:21 2026 +1100 + + Move USE_SYSTEM_GLOB into a glob.h compat shim. + + This moves the logic for selecting whether or not we can use the system + glob into configure, and if either don't have glob or can't use it, we + create the shim. Removes several diffs vs upstream. + +commit 2a1a257612b7c6bcacd934149146a3da7411c485 +Author: dtucker@openbsd.org +Date: Sat Feb 7 18:04:53 2026 +0000 + + upstream: misc.h is needed for ForwardOptions in servconf.h. + + OpenBSD-Commit-ID: b241d81c499e273fc2d81c82d5b7c7b280827416 + +commit ad632364fb06f3bd1e9177e587d0040cf7958676 +Author: Jonas 'Sortie' Termansen +Date: Sat Nov 2 22:30:07 2024 +0100 + + Remove unused includes. + + netinet/in_systm.h is no longer in upstream and anything that actually + needs it will get it from includes.h. + +commit 9ebce88be9d88605e02551fe7f65ef6a16f72667 +Author: dtucker@openbsd.org +Date: Sat Feb 7 17:10:34 2026 +0000 + + upstream: Also check for EWOULDBLOCK on system error. This is the + + same as EAGAIN on OpenBSD so is a no-op but removes a diff making portable + syncs easier. (ID sync only). + + OpenBSD-Commit-ID: 68a5dcc5e2a506208c40396c6366f67bbf3b1dbe + +commit ccc1faf67df795d5cd757df754703823d0874028 +Author: dtucker@openbsd.org +Date: Sat Feb 7 17:04:22 2026 +0000 + + upstream: Move ssherr.h to where portable needs it. + + (ID sync only) + + OpenBSD-Commit-ID: 0488ce85f24864186678dcac7c9973ca44bd2cd5 + +commit 6decbb90413c67c10ac2fd5b17a9c161196641ea +Author: Darren Tucker +Date: Sun Feb 8 04:30:40 2026 +1100 + + Move paths.h and poll.h includes to resync with upstream. + +commit 4fe79e3deb5457af588ab67ee5db642afedd935f +Author: Darren Tucker +Date: Sun Feb 8 04:28:28 2026 +1100 + + Move poll.h include to resync with upstream. + +commit 9e585f11bb71115fb0376b2b6118892ab600aa4f +Author: Darren Tucker +Date: Sun Feb 8 04:25:42 2026 +1100 + + Resync minor format diffs with upstream. + +commit 3fd88caa36a94d85ae66bff297142606d08decde +Author: Darren Tucker +Date: Sun Feb 8 03:56:15 2026 +1100 + + Resync headers with upstream. + +commit 77e41d0c1c8801c553b43eef5974268425395667 +Author: Darren Tucker +Date: Sun Feb 8 03:52:31 2026 +1100 + + Resync with upstream (unused header and whitespace). + +commit a393759f9693a08a7fba18d4824b74f2dda1fe3d +Author: Artem Savkov +Date: Tue Nov 18 16:26:11 2025 +0100 + + Fix ut_type for btmp records + + According to man utmp ut_type is supposed to be only switched from + LOGIN_PROCESS to USER_PROCESS after succesfull authentication and this + is how sshd behaved before 671c44078. + + Fixes: 671c44078 ("use construct_utmp to construct btmp records") + Signed-off-by: Artem Savkov + +commit 15fe1ceb29760d72398c6ac7df5a403416cba207 +Author: djm@openbsd.org +Date: Sat Feb 7 02:02:00 2026 +0000 + + upstream: bit of webauthn support missed in previous commit + + OpenBSD-Commit-ID: 9768454543ded01b7c61567fc5b3e78664346be2 + +commit 670f7d210ceae59db73b16b67e52d8fd8def3012 +Author: dtucker@openbsd.org +Date: Fri Feb 6 23:39:14 2026 +0000 + + upstream: Adjust Makefiles to include just-added + + ssherr_libcrypto where necessary. + + OpenBSD-Regress-ID: 53d179a2db3ab931f2aa0e5447cf20cb9787a8bb + +commit 9c4949c11d8da1a5422e2174afb1a4f5b3dc8914 +Author: dtucker@openbsd.org +Date: Fri Feb 6 23:31:29 2026 +0000 + + upstream: Fetch the error reason from libcrypto + + if available, append it to the corresponding ssh error message and + optionall print the libcrypto full error stack (at debug1). with & + ok tb@ djm@ millert@ schwarze@ + + Note that the quality of errors obtainable from libcrypto is somewhat + variable, so these may be any of: useful, misleading, incomplete + or missing entirely. As a result we reserve the right to change + what is returned or even stop returning it if it does more harm than + good. + + OpenBSD-Commit-ID: 1ad599ac3eeddbe254fec6b9c1cf658fa70d572e + +commit 5b12d836e7c42c146ac1a69a9600db05282dbbb8 +Author: THE-Spellchecker +Date: Sat Jan 3 22:11:39 2026 -0600 + + Typographical Fixes + +commit 11600929832e04aa6ad20a57af7187c3feb973d4 +Author: dtucker@openbsd.org +Date: Fri Feb 6 22:59:18 2026 +0000 + + upstream: Typo fixes, mostly in comments. + + From THE-Spellchecker via github PR#620. + + OpenBSD-Commit-ID: 64929fafa3caae5a162f23257917ecf33f8a3764 + +commit b83c0bb5109eb245dd4f06e4af4a960f96a0c193 +Author: Darren Tucker +Date: Sat Feb 7 06:58:59 2026 +1100 + + Enable gss-auth tests on Kerberos test configs. + +commit d84dbccee4371ce395d28543f146e7b62d8c0d36 +Author: Pavol Žáčik +Date: Thu Jan 29 11:01:19 2026 +0100 + + Add a GSSAPI authentication test + +commit 86e0f4aa2c72d5e96618f0c7214109f5a46ca70d +Author: Darren Tucker +Date: Thu Jan 1 21:41:10 2026 +1100 + + Split sudo out to its own install line. + +commit dfbb8526b5006cfe368193fb15e16f58cce6e1d1 +Author: Darren Tucker +Date: Wed Dec 31 16:35:29 2025 +1100 + + Remove obsolete comments. + +commit f0b7ecf7f5976c11f8c89ee9b0ca19383b573764 +Author: Darren Tucker +Date: Wed Dec 31 16:26:23 2025 +1100 + + Run tests on older OmniOS version too. + +commit 01bddc0663e5239df9342fcf7b373e5f58ff1b49 +Author: Darren Tucker +Date: Wed Dec 31 16:25:16 2025 +1100 + + Add OpenIndiana VM test target. + +commit 91c4d422cc0af2ae592f5e6c0cc505a5d8d7a6d2 +Author: djm@openbsd.org +Date: Fri Feb 6 01:24:36 2026 +0000 + + upstream: remove vestige of when we supported running without privsep + + OpenBSD-Commit-ID: 5342c24d2330ef5ce357c294056f72b8123122c0 + +commit 6463960c58cd0adcb26bfbddceb9d4efcfbd9dd0 +Author: djm@openbsd.org +Date: Thu Feb 5 22:05:49 2026 +0000 + + upstream: Implement missing pieces of FIDO/webauthn signature support, + + mostly related to certificate handling and enable acceptance of this + signature format by default. bz3748 GHPR624 GHPR625 + + Feedback tb / James Zhang; ok tb + + OpenBSD-Commit-ID: ce3327b508086b24a3f7a6507aa5c49d8e9505e6 + +commit 832a77000abe61f61bddb9e595f45c7131c0269d +Author: djm@openbsd.org +Date: Tue Jan 27 06:48:29 2026 +0000 + + upstream: Implement "query" extension from + + draft-ietf-sshm-ssh-agent + + feedback jsg@, tb@; ok tb@ + + OpenBSD-Commit-ID: adb2b79473ff86ba781ed5ab2735c1437b590f07 + +commit 409dc952ab88b5232e809e34fd55662c6f75ad81 +Author: millert@openbsd.org +Date: Thu Jan 22 15:30:07 2026 +0000 + + upstream: Make it clear that DenyUsers/DenyGroups overrides + + AllowUsers/AllowGroups. Previously we specified the order in which the + directives are processed but it was ambiguous as to what happened if both + matched. OK djm@ + + OpenBSD-Commit-ID: 6ae0ab52ff796b78486b92a45cd7ec9310e20f4e + +commit d7950aca8eacae8b889d92c669e913111af75984 +Author: djm@openbsd.org +Date: Wed Jan 21 23:58:20 2026 +0000 + + upstream: In ssh(1), don't try to match certificates held in an + + agent to private keys. + + This matching is done to support certificates that were + loaded without their private key material, but is unnecessary for + agent-hosted certificate which always have private key material + loaded in the agent. Worse, this matching would mess up the + request sent to the agent in such a way as to break usage of these + keys when the key usage was restricted in the agent. + + Patch from Thibault Cools via bz3752, ok dtucker@ + + OpenBSD-Commit-ID: ebfe37817dad4841c53339930565242ec683d726 + +commit b0d0b71651b5a19d0dbd27b623ebb4fc43145560 +Author: sthen@openbsd.org +Date: Wed Jan 21 15:44:51 2026 +0000 + + upstream: If editline has been switched to vi mode (i.e. via "bind + + -v" in .editrc), setup a keybinding so that command mode can be entered. Diff + originally from Walter Alejandro Iglesias with tweaks. Feedback from Crystal + Kolipe. ok djm + + OpenBSD-Commit-ID: 5786e17ccd83573e2d86418023f9bc768223336a + +commit 1cc936b2fabffeac7fff14ca1070d7d7a317ab7b +Author: dtucker@openbsd.org +Date: Tue Jan 20 22:56:11 2026 +0000 + + upstream: Fill entropy in a single operation instead of hundreds. + + The sntrup761 code we use from SUPERCOP fills entropy arrays 4 bytes at + a time. On some platforms each of these operations has a significant + overhead, so instead fill it in a single operation and as a precaution + zero that array after it's used. + + Analysis and code change is from Mike Frysinger via Github PR#621 with + feedback from djm@ and sed-ification from me. ok djm@ beck@. + + This change was submitted by Mike to SUPERCOP upstream so hopefully + future versions will already have it. + + OpenBSD-Commit-ID: 0e85c82f79b1b396facac59e05b288c08048f15c + +commit a6f8f793d427a831be1b350741faa4f34066d55f +Author: djm@openbsd.org +Date: Sun Jan 4 09:52:58 2026 +0000 + + upstream: rewrite SOCKS4/4A/5 parsing code to use sshbuf functions + + instead of manual pointer fiddling. Should make the code safer and easier to + read. feedback/ok markus@ + + OpenBSD-Commit-ID: 5ebd841fbd78d8395774f002a19c1ddcf91ad047 + +commit ea367b4bbc3fd49f84683763723425adfdce35c0 +Author: djm@openbsd.org +Date: Tue Dec 30 04:28:42 2025 +0000 + + upstream: test the right thing, doofus + + OpenBSD-Commit-ID: 31b2ec6e0b3dbd08c60ba2d969dd687cd80c25fd + +commit 5f2bc9cb8625d1fd582e0e4b562200f9856f1f7d +Author: djm@openbsd.org +Date: Tue Dec 30 04:23:53 2025 +0000 + + upstream: avoid possible NULL deref if + + ssh_packet_check_rekey_blocklimit() called before the encrypted transport is + brought up. + + OpenBSD-Commit-ID: fb998ccbe59865e33a8ab6a6577f254d39bdc72f + +commit b9c318777eb40db66fb92df87666c3642467d0e7 +Author: djm@openbsd.org +Date: Tue Dec 30 00:12:58 2025 +0000 + + upstream: unit tests for sshbuf_consume_upto_child() + + OpenBSD-Regress-ID: 13cbd0370ebca7c61c35346b3e0356517719a447 + +commit dd49a87bf4e4a219978bf20f03e2a72041f57b2f +Author: djm@openbsd.org +Date: Tue Dec 30 00:35:37 2025 +0000 + + upstream: Remove bug compatibility for implementations that don't + + support rekeying. AFAIK this is only an ancient Sun SSH version. + + If such an implementation tries to interoperate with OpenSSH, it + will eventually fail when the transport needs rekeying. + + This is probably long enough to use it to download a modern SSH + implementation that lacks this problem :) + + ok markus@ deraadt@ + + OpenBSD-Commit-ID: 228a502fee808cf8b7caee23169eb6a1ab1c331a + +commit ca313fef2deed90668fe0706da8529310092d1dd +Author: djm@openbsd.org +Date: Tue Dec 30 00:22:58 2025 +0000 + + upstream: Enforce maximum packet/block limit during + + pre-authentication phase + + OpenSSH doesn't support rekeying before authentication completes to + minimise pre-auth attack surface. + + Given LoginGraceTime, MaxAuthTries and strict KEX, it would be + difficult to send enough data or packets before authentication + completes to reach a point where rekeying is required, but we'd + prefer it to be completely impossible. + + So this applies the default volume/packet rekeying limits to the + pre-auth phase. If these limits are exceeded the connection will + simply be closed. + + ok dtucker markus + + OpenBSD-Commit-ID: 70415098db739058006e4ebd1630b6bae8cc8bf6 + +commit 55b6b1697433eca98052f5c45281133ca793a9c8 +Author: djm@openbsd.org +Date: Mon Dec 29 23:52:09 2025 +0000 + + upstream: Add sshbuf_consume_upto_child(), to similify particular + + parsing patterns using parent/child buffer; ok markus@ + + OpenBSD-Commit-ID: c11ed27907751f2a16c1283313e77f88617e4852 + +commit 6eafc52a4185ba6d765047146cd645152baaeb58 +Author: Ludovic Rousseau +Date: Sat Dec 27 10:07:22 2025 +0100 + + Update ssh-agent.1 + + Add a missing "/" in the default allowed providers list. + +commit 09daf2ac5f248dc5d60a6f3a703b479d67da14b4 +Author: djm@openbsd.org +Date: Mon Dec 22 03:36:43 2025 +0000 + + upstream: correctly quote wildcard host certificate principal name, + + lest it expand to an unrelated filename in the working directory + + OpenBSD-Regress-ID: 8a9eb716d3ea7986d26c1a931758b996aa93c58e + +commit dfd710e4e2928201743e32027e2d6cf0e2eafc61 +Author: djm@openbsd.org +Date: Mon Dec 22 03:12:05 2025 +0000 + + upstream: return 0 in void function; spotted by clang -Wextra + + OpenBSD-Commit-ID: fe7461c93dfaef98a007a246af837a8275a1e539 + +commit ecdf9b9f8e89aae65d4a12fe5a25c560eea08393 +Author: djm@openbsd.org +Date: Mon Dec 22 01:50:46 2025 +0000 + + upstream: regression tests for certificates with empty principals + + sections (which are now unconditionally refused) and for certificates with + wildcard principals (which should only be accepted in host certs) + + OpenBSD-Regress-ID: fdca88845a68424060547b4f9f32f90a7cf82e73 + +commit adca2f439827eb829652805f36e288b5b260ce1b +Author: djm@openbsd.org +Date: Mon Dec 22 01:31:07 2025 +0000 + + upstream: don't try to test webauthn signatures. Nothing in OpenSSH + + generates these (yet) + + OpenBSD-Regress-ID: 48d59b7c4768c2a22ce3d8cf3b455e6ada9fc7b0 + +commit 5166b6cbf2b6103117a79f90a68068e89e02bf66 +Author: djm@openbsd.org +Date: Mon Dec 22 01:49:03 2025 +0000 + + upstream: When certificate support was added to OpenSSH, + + certificates were originally specified to represent any principal if the + principals list was empty. + + This was, in retrospect, a mistake as it created a fail-open + situation if a CA could be convinced to accidentally sign a + certificate with no principals. This actually happened in a 3rd- + party CA product (CVE-2024-7594). + + Somewhat fortunately, the main pathway for using certificates in + sshd (TrustedUserCAKeys) never supported empty-principals + certificates, so the blast radius of such mistakes was + substantially reduced. + + This change removes this footcannon and requires all certificates + include principals sections. It also fixes interpretation of + wildcard principals, and properly enables them for host + certificates only. + + This is a behaviour change that will permanently break uses of + certificates with empty principals sections. + + ok markus@ + + OpenBSD-Commit-ID: 0a901f03c567c100724a492cf91e02939904712e + +commit aaac8c61c18124eb5fb8a2cff1e85dea2db6c147 +Author: djm@openbsd.org +Date: Mon Dec 22 01:20:39 2025 +0000 + + upstream: Don't misuse the sftp limits extension's open-handles + + field. This value is supposed to be the number of handles a server will allow + to be opened and not a number of outstanding read/write requests that can be + sent during an upload/download. + + ok markus@ + + OpenBSD-Commit-ID: 14ebb6690acbd488e748ce8ce3302bd7e1e8a5b0 + +commit daf6bdd34b59f640d2af0fd230da69f1cbad33b4 +Author: djm@openbsd.org +Date: Mon Dec 22 01:17:31 2025 +0000 + + upstream: add a "ssh -O channels user@host" multiplexing command to + + get a running mux process to show information about what channels are + currently open; ok dtucker@ markus@ + + OpenBSD-Commit-ID: 80bb3953b306a50839f9a4bc5679faebc32e5bb8 + +commit b652322cdc5e94f059b37a8fb87e44ccb1cdff33 +Author: djm@openbsd.org +Date: Fri Dec 19 01:27:19 2025 +0000 + + upstream: typo in comment + + OpenBSD-Commit-ID: f72306b86953e74f358096db141b4f9c00d33ed7 + +commit 0b98be75dbb2ccb1c3146429c0077416c113b57d +Author: djm@openbsd.org +Date: Fri Dec 19 01:26:39 2025 +0000 + + upstream: correctly check subsystem command is not the empty string + + (was repeatedly checking the subsystem name) spotted by Coverity (CID 898836) + + OpenBSD-Commit-ID: dabea2b499de8280f76f7291dd52086df6831cb0 + +commit 345892ba2e8efea4be03675c866395bee251c117 +Author: djm@openbsd.org +Date: Fri Dec 19 00:57:42 2025 +0000 + + upstream: regression test for bz3906: sshd crashing at connection + + time if the config lacks a subsystem directive but one is defined in a match + block. + + OpenBSD-Regress-ID: 5290553665307ccddaec2499ec1eb196bb2efc84 + +commit 81e5bb8d93f2d8361bd7f4b034044ad8ee4ded0e +Author: djm@openbsd.org +Date: Fri Dec 19 00:48:47 2025 +0000 + + upstream: check that invalid subsystem directives inside Match + + blocks are noticed at startup; bz#3906 + + OpenBSD-Regress-ID: b9171bde4cc24757a826b3da0e9eadc33995a453 + +commit 831e6db69ff8625b6e81c2809aa082abbab6c0b1 +Author: djm@openbsd.org +Date: Fri Dec 19 00:56:34 2025 +0000 + + upstream: don't crash at connection time if the main sshd_config + + lacks any subsystem directive but one is defined in a Match block + + bz#3906; ok dtucker + + OpenBSD-Commit-ID: 2eb9024726d6f10eaa41958faeca9c9ba5ca7d8a + +commit 4e0f2dee54d210dc44f72f73e703c6dc5348a406 +Author: djm@openbsd.org +Date: Fri Dec 19 00:48:04 2025 +0000 + + upstream: detect invalid sshd_config Subsystem directives inside + + Match blocks at startup rather than failing later at runtime; + + noticed via bz#3906; ok dtucker + + OpenBSD-Commit-ID: e6035ff0baa375de6c9f22c883ed530a8649dfed + +commit 4c9de155ce1d35c9e3c05223cc093580f9efff9a +Author: jsg@openbsd.org +Date: Thu Dec 18 23:54:10 2025 +0000 + + upstream: new sentence, new line + + OpenBSD-Commit-ID: 23974d7c98b2ba4fea7f5143676c34e04ffd4128 + +commit 3ab346aa6d9030379df3ec1ed0b0ce608f952c5f +Author: jsg@openbsd.org +Date: Thu Dec 18 23:51:56 2025 +0000 + + upstream: fix markup, .CM -> .Cm + + OpenBSD-Commit-ID: 4db8cb254792df8a4dce11825852e089ae3d053a + +commit f878d7ccc25b02a39e6766f5dd405d5de6fb106c +Author: dtucker@openbsd.org +Date: Tue Dec 16 08:36:43 2025 +0000 + + upstream: Plug leak in ssh_digest_memory on error path. + + Bonehead mistake spotted by otto@, ok djm@ + + OpenBSD-Commit-ID: 4ad67ac402e0b4c013f4f4e386d22b88969a5dd7 + +commit 49480f1934f8cf994afa646d4bcbd22ac08bb6af +Author: dtucker@openbsd.org +Date: Tue Dec 16 08:32:50 2025 +0000 + + upstream: Add 'invaliduser' penalty to PerSourcePenalties, which is + + applied to login attempts for usernames that do not match real accounts. + Defaults to 5s to match 'authfail' but allows administrators to block such + sources for longer if desired. with & ok djm@ + + OpenBSD-Commit-ID: bb62797bcf2adceb96f608ce86d0bb042aff5834 + +commit 94bf1154b4132727114f222a587daeac101f1f5b +Author: djm@openbsd.org +Date: Mon Dec 8 03:55:22 2025 +0000 + + upstream: add a GssDelegateCreds option for the server, controlling + + whether it accepts delgated credentials offered by the client. This option + mirrors GssDelegateCreds in ssh_config. + + From Dmitry Belyavskiy via GHPR614; ok dtucker@ + + OpenBSD-Commit-ID: ac419354edb26cef9ad15692e0bed17a03997786 + +commit 24f32f7755801b16368375b8e27fb1a48d250fc5 +Author: djm@openbsd.org +Date: Mon Dec 8 00:45:00 2025 +0000 + + upstream: errant line + + OpenBSD-Commit-ID: 8542d59f5ba48a67c3ebd5de17f9fa408ec54ca5 + +commit a1e37f0998ed5027f6c8dd30befb379ea2cac95b +Author: djm@openbsd.org +Date: Mon Dec 8 00:44:16 2025 +0000 + + upstream: There is a warning next to the authorized_keys command="" + + flag that forcing a command doesn't automatically disable forwarding. Add one + next to the sshd_config(5) ForceCommand directive too. + + feedback deraadt@ + + OpenBSD-Commit-ID: bfe38b4d3cfbadbb8bafe38bc256f5a17a0ee75c + +commit 70ad2e9a2b3aa6f856200464078c2750bfba0e3d +Author: djm@openbsd.org +Date: Mon Dec 8 00:41:46 2025 +0000 + + upstream: increment correct variable when counting group + + memberships. Reported by Kevin Day via bz3903 + + OpenBSD-Commit-ID: 772b9aafd5165a7c407f08cb95f8b94cc5a4c1c0 + +commit d05b704086d53c02f4ad7de921435f7e7e3ad60a +Author: Darren Tucker +Date: Sun Dec 7 20:10:42 2025 +1100 + + Add OpenBSD 7.8 VM test target. + +commit f086fafa0486012df6ba095664be75ecbf68e8e1 +Author: Darren Tucker +Date: Sun Dec 7 13:43:02 2025 +1100 + + Remove generated compat includes during distclean. + +commit 185459dd87c4f7580a2591fbbbb1d800ec249b78 +Author: Darren Tucker +Date: Sun Dec 7 14:17:20 2025 +1100 + + Define IPTOS_DSCP_VA if not already defined. + +commit f701869185915b9a324dcc23c12d0035251ef93f +Author: phessler@openbsd.org +Date: Fri Dec 5 17:48:47 2025 +0000 + + upstream: allow network programs select DSCP_VA for network ToS + + OK stsp@ + + OpenBSD-Commit-ID: 8019fd6e8c522b4b5f291a2c0e3bf2437cc70dc1 + +commit f62868e03e51785c521c4d20d60662c0bbdd695e +Author: dtucker@openbsd.org +Date: Sun Dec 7 02:59:53 2025 +0000 + + upstream: Avoid "if ! thing || ! otherthing; then" constructs since + + they seem to cause portability problems. + + OpenBSD-Regress-ID: ff001be683de43bf396cd5f9f6a54e0c7a99c3cf + +commit 45aca67d79c194660342a64a9175d814d4e8ba56 +Author: dtucker@openbsd.org +Date: Sun Dec 7 02:49:41 2025 +0000 + + upstream: spaces->tab + + OpenBSD-Regress-ID: c78eb430da0ec2c4b6919ff4d27ef8e565ef52ff + +commit ab164f671609a3a25cd0efcd967aff29144081bb +Author: dtucker@openbsd.org +Date: Sat Dec 6 07:10:24 2025 +0000 + + upstream: Append a newline, otherwise some sed's won't output anything. + + OpenBSD-Regress-ID: 507cb8c36bb7fc338f60a55bf7040f479536b3f7 + +commit c99a30d30a5d2af6fec30b9b0d85aa9b252760c9 +Author: dtucker@openbsd.org +Date: Sat Dec 6 03:23:27 2025 +0000 + + upstream: Don't check compressions stats when ssh does not support + + compression. + + OpenBSD-Regress-ID: 026db51b2654a949e9a10b908443dab83b64c74a + +commit 5f5d1af478d4b9daf61fab1e4298973980d4c348 +Author: djm@openbsd.org +Date: Fri Dec 5 11:13:35 2025 +0000 + + upstream: ASSERT_DOUBLE_* test helpers + + OpenBSD-Regress-ID: cdb5c4e95c0f00efb773ddba4056a49e33702cf9 + +commit 70a01a7e66075047329e3aeccc942678f512ebdd +Author: Darren Tucker +Date: Fri Dec 5 20:02:39 2025 +1100 + + Set SSH_REGRESS_TMP after making tmpdir. + + Put both of these later in the script so the cvsids don't cause + conflicts on every synced patch. + +commit 89a67a04e581423cdc443f2597cb1e2c7d8cc50f +Author: dtucker@openbsd.org +Date: Fri Dec 5 08:09:34 2025 +0000 + + upstream: Shell compatibility fix. + + OpenBSD-Regress-ID: bceaeb267d49c13e4a797c42e93b8f0cdb14dbd7 + +commit f4e79a4ba91cf0fd7397846424d1b261f3648708 +Author: djm@openbsd.org +Date: Fri Dec 5 07:43:24 2025 +0000 + + upstream: unit tests for convtime_double() + + OpenBSD-Regress-ID: d3ba7b894019b4128845d638c78fca37b3b6eecf + +commit c48de35bea389308428cb47b5ee55b1b1fb4567c +Author: djm@openbsd.org +Date: Fri Dec 5 07:49:45 2025 +0000 + + upstream: convert PerSourcePenalties to using floating point time, + + allowing penalties to be less than a second. This is useful if you need to + penalise things you expect to occur at >=1 QPS. + + feedback dtucker / deraadt; ok deraadt@ + + OpenBSD-Commit-ID: 89198be755722131b45a52d22d548e4c602201f0 + +commit f45cd249e45a15c84bf1316ac719039d04a74e84 +Author: djm@openbsd.org +Date: Fri Dec 5 07:43:12 2025 +0000 + + upstream: Add convtime_double() that converts a string interval, + + such as "3w2d4h5m10.5s", into a floating point number of seconds. + + Reimplement the existing convtime() function using convtime_double() + (it just drops the fractional seconds) + + lots of feedback deraadt@ / dtucker@; ok deraadt@ + + OpenBSD-Commit-ID: 053cdd0c72325a20efc6613caa847473fb89e36f + +commit b7dc1d95ee838c86a93df59663dad32e9b555520 +Author: dtucker@openbsd.org +Date: Fri Dec 5 06:55:22 2025 +0000 + + upstream: Add test for ssh -Oconninfo mux command. + + OpenBSD-Regress-ID: e939edc41caad8b6ad00ff294f33b61ed32a1edd + +commit eb97fc2b5e7c85a37fdb3f8a6ee1d665ef086c3f +Author: dtucker@openbsd.org +Date: Fri Dec 5 06:16:27 2025 +0000 + + upstream: Add an ssh -Oconninfo command + + that shows connection information, similar to the ~I escapechar. + This is the first use of the mux extension mechanism, so it should be + both forward and backward compatible: a new client talking to an old + server will not allow the "conninfo" request to be sent, but everything + else should work seamlessly. feedback and ok djm@ + + OpenBSD-Commit-ID: 50f047a85da277360558cabdfed59cb66f754341 + +commit 66622394fd3a51e9a6c99c39a068f8ba709542fa +Author: djm@openbsd.org +Date: Wed Dec 3 06:29:50 2025 +0000 + + upstream: correctly quote filenames in verbose output for local->local + + copies; from Colin Watson via bz3900; ok dtucker@ + + OpenBSD-Commit-ID: 5c09b030e2024651ebc8c1f9af6a8a2d37912150 + +commit 8fce5520a1c9c2cf3fc6c6974dd158f4b3ce9c4e +Author: dtucker@openbsd.org +Date: Sat Nov 29 06:49:56 2025 +0000 + + upstream: Add local hostname and pid to ~I escape connection info, + + only display peer information for TCP connections including source address + and port This provides enough information to uniquely identify a connection + on the host or network. + + OpenBSD-Commit-ID: aa18a4af2de41c298d1195d2566808585f8ce964 + +commit 2e8b5de4a79fb393482465531be1e347b81699f3 +Author: dtucker@openbsd.org +Date: Sat Nov 29 05:00:50 2025 +0000 + + upstream: Add compression stats to ~I connection info escape + + option. + + OpenBSD-Commit-ID: 83424b71fc226ea6b3dc8dda39f993475fdbd775 + +commit 52037ed910a9dcb669b9c9f612ccac711ac586f2 +Author: dtucker@openbsd.org +Date: Thu Nov 27 02:18:48 2025 +0000 + + upstream: Add Escape option ~I that shows information about the current + + SSH connection. ok djm@, "I like/want" sthen@ florian@ + + OpenBSD-Commit-ID: 0483fc0188ec899077e4bc8e1e353f7dfa9f5c1d + +commit 0fb1f3c9955d78fb0959842202b9ecfc36e37486 +Author: djm@openbsd.org +Date: Tue Nov 25 01:14:33 2025 +0000 + + upstream: move mention of default MaxStartups (which uses the + + form. + + GHPR568 from Santiago Vila + + OpenBSD-Commit-ID: 7e68771f3cad61ec67303607afb3b85639288b29 + +commit 2d0d26602f739b4a3ddde6c4dbc8f3ddab38ac0d +Author: djm@openbsd.org +Date: Tue Nov 25 01:08:35 2025 +0000 + + upstream: Support writing ED25519 keys in PKCS8 format. GHPR570 from + + Josh Brobst + + OpenBSD-Commit-ID: 4f36019a38074b2929335fbe9cb8d9801e3177af + +commit c23122c5ea7348b7b6daa2982e53c201a5354007 +Author: djm@openbsd.org +Date: Tue Nov 25 00:57:04 2025 +0000 + + upstream: avoid leak of fingerprint on error path; from Lidong Yan via + + GHPR611 + + OpenBSD-Commit-ID: 253f6f7d729d8636da23ac9925b60b494e85a810 + +commit 6157e1c41071fb0f5621868c38861934284268b1 +Author: djm@openbsd.org +Date: Tue Nov 25 00:52:00 2025 +0000 + + upstream: don't set the PerSourceNetBlockSize IPv6 mask if sscanf + + didn't decode it. From Mingjie Shen via GHPR598 + + OpenBSD-Commit-ID: c722014e735cbd87adb2fa968ce4c47b43cf98b0 + +commit 1fdc3c61194819c16063dc430eeb84b81bf42dcf +Author: djm@openbsd.org +Date: Mon Nov 24 23:56:58 2025 +0000 + + upstream: give ssh-agent more time to start in tests; requested in + + GHPR602 + + OpenBSD-Regress-ID: 7d771db2c1d4a422e83c3f632ba1e96f72a262b8 + +commit 5e7c3f33b2693b668ecfbac84b85f2c0c84410c2 +Author: djm@openbsd.org +Date: Mon Nov 24 23:54:15 2025 +0000 + + upstream: When testing PKCS11, explicitly allow the module path in + + ssh-agent. + + Allows testing of PKCS11 modules outside system directories. + + From Morgan Jones via GHPR602 + + OpenBSD-Regress-ID: 548d6e0362a8d9f7d1cc01444b697a00811ff488 + +commit 69965aefe3355488e0462291be13a233b8405091 +Author: djm@openbsd.org +Date: Mon Nov 24 23:43:10 2025 +0000 + + upstream: When loading FIDO2 resident keys, set the comment to the + + FIDO application string. This matches the behaviour of ssh-keygen -K + + From Arian van Putten via GHPR608 + + OpenBSD-Commit-ID: 3fda54b44ed6a8a6f94cd3e39e69c1e672095712 + +commit 2238c48dc90dc56af1d86b298d2cb25fa0c7ef14 +Author: tb@openbsd.org +Date: Sun Nov 23 07:04:18 2025 +0000 + + upstream: pkcs11_fetch_ecdsa_pubkey: use ASN1_STRING accessors + + In anticipation of davidben and beck making ASN1_STRING opaque in + OpenSSL 4 with the aim of enabling surgery to make the X509 data + structure less bad [1], we need to use dumb accessors to avoid build + breakage. Fortunately only in one spot. + + This is OpenSSL 1.1 API and available in all members of the fork family. + + ok beck djm + + [1]: https://github.com/openssl/openssl/issues/29117 + + OpenBSD-Commit-ID: 0bcaf691d20624ef43f3515c983cd5aa69547d4f + +commit 643222df689c95efff9e9506b76de458f69dd9c7 +Author: Darren Tucker +Date: Fri Nov 21 14:28:20 2025 +1100 + + Update OSSFuzz link to current bug tracker. + +commit 2efdfbb4d78b9bbb73f55af150e8f985d4fe4c0f +Author: Darren Tucker +Date: Fri Nov 21 14:21:07 2025 +1100 + + Add VM CI and CIFuzz status badges. + +commit 71e8779113965d60d91ba2d15cdeeb43ecf230a7 +Author: djm@openbsd.org +Date: Fri Nov 21 01:29:27 2025 +0000 + + upstream: unit tests for sshbuf_get_nulterminated_string() + + OpenBSD-Regress-ID: cb0af1e4d6dcc94e263942bc4dcf5f4466d1f086 + +commit dec6334aaf6f542f34a0aca27dc2f535e9161a67 +Author: djm@openbsd.org +Date: Fri Nov 21 01:29:06 2025 +0000 + + upstream: add a sshbuf_get_nulterminated_string() function to pull a + + \0- terminated string from a sshbuf. Intended to be used to improve parsing + of SOCKS headers for dynamic forwarding. + + ok deraadt; feedback Tim van der Molen + + OpenBSD-Commit-ID: cf93d6db4730f7518d5269c279e16b172b484b36 + +commit a8718c3fc52511e5237f1cbe10c210948c5616ea +Author: dtucker@openbsd.org +Date: Thu Nov 20 05:07:57 2025 +0000 + + upstream: Free opts in FAIL_TEST. It should always be NULL anyway so + + this is a no-op, but it should placate Coverity CID 405064. + + OpenBSD-Regress-ID: 06789754de0741f26432c668fad8b9881c14c153 + +commit d68d528fefeca1e331696296ef5db7c4db246f9a +Author: dtucker@openbsd.org +Date: Thu Nov 20 05:10:56 2025 +0000 + + upstream: Plug leaks while parsing Match blocks. Coverity CID + + 469304, ok djm@ + + OpenBSD-Commit-ID: f9b79b86879a953ad034e6b92a398265b251bea7 + +commit e3f1fbb427df898d70083b42caab72baaa715400 +Author: dtucker@openbsd.org +Date: Thu Nov 20 05:10:11 2025 +0000 + + upstream: Plug leaks while parsing Match blocks. Coverity CID + + 515634, ok miod@ djm@ + + OpenBSD-Commit-ID: c7932eddecd47e5122e945246a40c56ffa42a546 + +commit ccad76e9e1e4f06889ee023893cea98bc165858b +Author: Darren Tucker +Date: Tue Nov 18 20:14:44 2025 +1100 + + Pull in rev 1.17 for spelling fix. + + Prompted by github PR#609 from Edge-Seven. + +commit 58533bbdf7aa0548de8e2abd3cb2de0593fa9fdc +Author: jca@openbsd.org +Date: Mon Nov 17 12:59:29 2025 +0000 + + upstream: Export XDG_RUNTIME_DIR to child ssh sessions + + Currently setusercontext(LOGIN_SETALL) does create the directory in + /tmp/run/user, since LOGIN_SETXDGENV is part of LOGIN_SETALL, but the + env variable wasn't exported. + + ok djm@ + + OpenBSD-Commit-ID: 02b8433f72759b3a07b55cbc5a7cdb84391b0017 + +commit e4cc5ab0efd85f01c0e1ae46825ffc0c7a8f44ce +Author: djm@openbsd.org +Date: Mon Nov 17 05:24:42 2025 +0000 + + upstream: don't strnvis() log messages that are going to be logged + + by sshd-auth via its parent sshd-session process, as the parent will also run + them though strnvis(). + + Prevents double-escaping of non-printing characters in some log + messages. bz3896 ok dtucker@ + + OpenBSD-Commit-ID: d78faad96a98af5269d66ddceee553cf7d396dfe + +commit bad220decb95d3b5cc6e30f843c4fc9d9b0b7a67 +Author: Darren Tucker +Date: Mon Nov 17 21:36:45 2025 +1100 + + Remove obsolete CVSID. + +commit 2fe6e406b496b54351dab923f9be95579d39d071 +Author: dtucker@openbsd.org +Date: Mon Nov 17 09:59:13 2025 +0000 + + upstream: Ensure both sides of the test are non-NULL instead of just + + either. Coverity CID 443285. + + OpenBSD-Regress-ID: aa90e57b1bc8efce9e50734a07a8ffec0680059a + +commit e2b93e16232834c61c9dcff5b20e4c55a26b324d +Author: Darren Tucker +Date: Thu Nov 13 23:30:48 2025 +1100 + + Move libcrypto init check into entropy.c. + + This prevents link errors with the openbsd-compat tests when the linker + tries to bring in all the logging bits. + +commit ec41739bd68d639b0847b366697706e7dab3498d +Author: Icenowy Zheng +Date: Fri Nov 7 14:27:35 2025 +0800 + + seccomp sandbox: allow uname(3) + + The uname(3) syscall is utilized by zlib-ng on RISC-V to decide whether + the kernel handles VILL bit of V extension properly (by checking the + kernel version against 6.5). + + Allow it in the seccomp sandbox. + + Signed-off-by: Icenowy Zheng + +commit 90501bc30ca94fa5443e2b7e2072d5d454587ef8 +Author: Darren Tucker +Date: Thu Nov 13 22:04:19 2025 +1100 + + Remove remaining OpenSSL_add_all_algorithms() calls. + + We already have OPENSSL_init_crypto() in the compat layer (now with a + check of its return code, prompted by tb@). Prompted by github PR#606 + from Dimitri John Ledkov. ok beck@ + +commit d9955e4571ec356ba4f2e99d01f7fa88f6e20a63 +Author: dtucker@openbsd.org +Date: Thu Nov 13 10:35:14 2025 +0000 + + upstream: Remove calls to OpenSSL_add_all_algorithms() + + and ERR_load_crypto_strings(). These are no-ops in LibreSSL, and in + Portable have been mostly replaced by a call to OPENSSL_init_crypto() + in the compat layer. ok tb@ + + OpenBSD-Commit-ID: 4c3e0af10fe276766054eda34428a37a5606d3ea + +commit 6aba7008e6451ae3f9298214b13b8eded5fd9ff0 +Author: djm@openbsd.org +Date: Thu Nov 13 05:13:06 2025 +0000 + + upstream: sync support for systems that lack __builtin_popcount() from + + portable + + unused on OpenBSD (nothing sets MISSING_BUILTIN_POPCOUNT), but it + makes syncing much easier. + + OpenBSD-Commit-ID: 496446300d82615b24f83eca886b8fabdbee445b + +commit 84347d67ad2d5ee0db43f32bca91bacccecdb647 +Author: djm@openbsd.org +Date: Thu Nov 13 04:56:23 2025 +0000 + + upstream: update our ML-KEM implementation to upstream libcrux + + v0.0.4 + + tested/ok tb@ + + OpenBSD-Commit-ID: 525a62549efbf53492adcb2c57e4872cdbaeed62 + +commit c09eeba78ad622b988ab7f8d96e75b7edd434598 +Author: tb@openbsd.org +Date: Fri Nov 7 06:29:45 2025 +0000 + + upstream: sshkey_ec_validate_public: zap trailing blank I missed on + + review + + OpenBSD-Commit-ID: b296bd6056f33fd567ca0d5e9123dac1ec00f037 + +commit 7cb3ea4dcc7d73b2fad6782a119901cfa2b022aa +Author: Darren Tucker +Date: Thu Nov 13 10:23:45 2025 +1100 + + Simplify git command to avoid yaml syntax error. + +commit 08786bbe7eebff316efb0b4ccb882f93f33a16b8 +Author: Darren Tucker +Date: Thu Nov 13 09:53:17 2025 +1100 + + Don't use OpenSSL's ed25519 if built without EC. + + Explicitly check for OPENSSL_NO_EC, since otherwise the test will link + but then fail at runtime. + +commit d12813314452173b1709f7fdbae74add84c0056f +Author: Damien Miller +Date: Fri Nov 7 15:49:55 2025 +1100 + + octal-escape the colon character + + Apparently these are YAML magic when followed by whitespace + +commit 5a104d81a2a916a6b9a42e28a7fa11bb781dfdf4 +Author: Damien Miller +Date: Fri Nov 7 15:44:18 2025 +1100 + + try single quotes instead of escaped quotes + +commit 48d8293956b9801b870a56782e19f29793ca04ba +Author: Damien Miller +Date: Fri Nov 7 15:42:57 2025 +1100 + + escape quotes in yaml + +commit 1f1d63e16b5ce67f6f2f1170ec7221f1e6bff530 +Author: djm@openbsd.org +Date: Fri Nov 7 04:33:52 2025 +0000 + + upstream: Escape SSH_AUTH_SOCK paths that are sent to the shell as + + setenv commands. + + Unbreaks ssh-agent for home directory paths that contain whitespace. + + Based on fix from Beat Bolli via bz3884; feedback/ok dtucker@ + + OpenBSD-Commit-ID: aaf06594e299940df8b4c4b9f0a1d14bef427e02 + +commit 5794f2a186ee8ea7db0002bf7470b817572aaef0 +Author: djm@openbsd.org +Date: Thu Nov 6 17:24:28 2025 +0000 + + upstream: sk-dummy.so needs sshlog() stub after ed25519-openssl.c + + change + + OpenBSD-Regress-ID: 50b7f49021b8085728d0544275e141fb1bf4a2b5 + +commit a1c526f29b47147046f77a0f74097008256396f6 +Author: djm@openbsd.org +Date: Thu Nov 6 01:33:26 2025 +0000 + + upstream: unit test for stringlist_append() and stringlist_free() + + OpenBSD-Regress-ID: a3a4dae538c831b3810f69abc34ad8504dc3c460 + +commit 9d8c686981834bc1dde09f5067ff925d8fc158f5 +Author: djm@openbsd.org +Date: Thu Nov 6 01:33:03 2025 +0000 + + upstream: link against ed25519-openssl.c instead of ed25519.c + + OpenBSD-Regress-ID: f789d46e99d2598929e3c2d00b45c47cc3102501 + +commit e57ef43c3ecb69aa237e2d88b793f18ee8a25817 +Author: anton@openbsd.org +Date: Sat Nov 1 05:39:25 2025 +0000 + + upstream: Cope with recent changes and don't link hash.c. + + OpenBSD-Regress-ID: 577ef2f36ee592528448e8c0f33499e2e3512054 + +commit 9bea081888fa659b964e6bfa41caca2b5def98c2 +Author: djm@openbsd.org +Date: Fri Nov 7 04:11:59 2025 +0000 + + upstream: Remove some unnecessary checks in + + sshkey_ec_validate_public() + MIME-Version: 1.0 + Content-Type: text/plain; charset=UTF-8 + Content-Transfer-Encoding: 8bit + + Checking nQ == infinity is not needed for cofactor 1 curves. + Checking x and y coordinates against order is not needed either. + + patch from Szilárd Pfeiffer, with further refinement by tb@ + ok tb@ + + OpenBSD-Commit-ID: ef985e2be7c64e215d064757d3fc65eb181e8ede + +commit 1399419f0b2d024bde968ffe769a3808611917e4 +Author: djm@openbsd.org +Date: Thu Nov 6 01:31:11 2025 +0000 + + upstream: move stringlist_append() and stringlist_free() to misc.c + + OpenBSD-Commit-ID: 7d047bbff6964b9abbc04e9b3e2e1b4cc1db0aea + +commit f2ff1d9c1687be313dd491fcd136c682ef51bea8 +Author: djm@openbsd.org +Date: Fri Oct 31 01:50:43 2025 +0000 + + upstream: cleanup file descriptors across PKCS#11 client/helper + + execution; ok markus + + OpenBSD-Commit-ID: 993628a5b361e30aa48bbb4c07667a280f3f23ab + +commit 7e5d404cf73b6762715eec69b67cce2c4801f9e9 +Author: Darren Tucker +Date: Sat Nov 1 08:34:15 2025 +1100 + + Support using git for OpenBSD src tree tests. + +commit d87e7f0bed66fc9f76fe4a2f43390fdc9a664132 +Author: Darren Tucker +Date: Sat Nov 1 08:33:07 2025 +1100 + + Add OpenBSD 7.8 test target. + +commit 2425d7faf4154b32b5f836596023cf2432b81eaf +Author: Damien Miller +Date: Fri Oct 31 13:47:49 2025 +1100 + + check PAM user against previous user, not pw_name + + Avoids early fatal() if the user doesn't exist. + + Reported by Viswesh Narayanan; ok dtucker@ + +commit 7e2f89b0fb72141abbce098e2682ba8e090cabfc +Author: Damien Miller +Date: Fri Oct 31 12:19:47 2025 +1100 + + skip pkcs11 tests when built --without-openssl + +commit 590a260f0bedc895688bb38b1cf6f0f72d8013e3 +Author: Damien Miller +Date: Fri Oct 31 12:19:34 2025 +1100 + + add sshlog() replacement to sk-dummy.so + +commit 57e347bae04cf214795fdeae3579991f0cc2e090 +Author: Damien Miller +Date: Fri Oct 31 11:16:29 2025 +1100 + + rename openbsd-compat sha2.h -> bsd-sha2.h + + avoids confusion with system header when included from files under + openbsd-compat/ + +commit a5f638585152863dc64ee9436a08e1d84735d740 +Author: Damien Miller +Date: Fri Oct 31 11:07:17 2025 +1100 + + fix linking for sk-dummy.so, used in tests + +commit c2a178959b03472c1b1677fea4bb263ed9fee2bd +Author: djm@openbsd.org +Date: Thu Oct 30 23:55:09 2025 +0000 + + upstream: don't link hash.c + + OpenBSD-Regress-ID: a145f09c1efb1fcd3924544463f1f94f5d4805c0 + +commit 249224a0d43fdd2a536d7476c2bb15f4006dbbdd +Author: miod@openbsd.org +Date: Thu Oct 23 19:06:10 2025 +0000 + + upstream: Prepare for gcc 3 leaving the building, COMPILER_VERSION + + can no longer get set to "gcc3". + + OpenBSD-Regress-ID: 02351ea947975b80be60b9a8c6e4dbb57789e890 + +commit 9dcd640d44b8270c75783ef662c340187250d6e4 +Author: dtucker@openbsd.org +Date: Thu Oct 23 06:15:26 2025 +0000 + + upstream: Check tmux version and skip if too old. ok djm@ + + OpenBSD-Regress-ID: fb62024eb753c61b4d78402ec8378af839fad26c + +commit 94a78254a1c953c2a55eb54f65a5d99873b54bdf +Author: djm@openbsd.org +Date: Thu Oct 30 23:19:33 2025 +0000 + + upstream: move crypto_hash_sha512() to be inline in crypto_api.h, saves + + about 0.5kb per binary and makes life easier for portable; with/ok dtucker@ + + OpenBSD-Commit-ID: 672d7390f78bb6581c12661d7f5adc8a9c6be564 + +commit 266647c5f2075d397bd5ed5316450183eda73388 +Author: djm@openbsd.org +Date: Thu Oct 30 20:49:10 2025 +0000 + + upstream: support ed25519 signatures via libcrypto. Mostly by Jeremy + + Allison Feedback tb@, ok tb@ markus@ + + OpenBSD-Commit-ID: e8edf8adffd5975d05769dde897df882d7933526 + +commit 4f3e65bda22b65dc5fff82df1e97af07456fed42 +Author: djm@openbsd.org +Date: Thu Oct 30 03:19:54 2025 +0000 + + upstream: Activate UnusedConnectionTimeout only after last channel + + has closed. Previously UnusedConnectionTimeout could fire early after a + ChannelTimeout. + + This was not a problem for the OpenSSH client because it terminates + once all channels have closed but could cause problems for other + clients (e.g. API clients) that do things differently. + + bz3827; ok dtucker + + OpenBSD-Commit-ID: ff2e4607cbd4e600de3c8a5ece3b0e4bb641ed8f + +commit e7f5928ef1c8e8c725bdca9cdd6b80e77fe774ac +Author: miod@openbsd.org +Date: Thu Oct 23 19:06:10 2025 +0000 + + upstream: Prepare for gcc 3 leaving the building, COMPILER_VERSION + + can no longer get set to "gcc3". + + OpenBSD-Commit-ID: 98eefed432ff8253b307002e20d28da14b93e7e3 + +commit 0ffb76c6590800958777cd0f7b1aaae19c74fa3f +Author: djm@openbsd.org +Date: Wed Oct 22 06:22:58 2025 +0000 + + upstream: more explicit synchronisation around killing tmux sessions + + between runs. + + OpenBSD-Regress-ID: 1735f5cb13ad281e869ab998c7d49b692ee3ed47 + +commit ffd086b69886e8cfeb74f9b2bcb18764bf7d9a52 +Author: djm@openbsd.org +Date: Wed Oct 22 05:22:31 2025 +0000 + + upstream: remove debugging junk + + OpenBSD-Regress-ID: 3247e0ac98ae4cfe4eede871ef424d166e29e828 + +commit 52712d5f11172ca98ffb0b2ac93007f74cb67134 +Author: djm@openbsd.org +Date: Tue Oct 21 23:30:01 2025 +0000 + + upstream: just skip the test if $PATH or $HOME has whitespace in it + + OpenBSD-Regress-ID: ccf75a29d1a300a35f63be0e4f11ad5276756275 + +commit a8eac05a85e31b11513a6a8dc5d662b14cbc2f4b +Author: djm@openbsd.org +Date: Tue Oct 21 22:13:27 2025 +0000 + + upstream: quote paths; avoids test failure when run from a path with a + + space in it + + OpenBSD-Regress-ID: e4b7bffc289f10d47c50c02dd70b0323078a83b4 + +commit 425e5b6bd765efbfc7691f43bfc08c86dc8a615e +Author: djm@openbsd.org +Date: Tue Oct 21 08:35:22 2025 +0000 + + upstream: fix test for executability of tmux + + OpenBSD-Regress-ID: a18119876ecfd95edb78225b086ac668eb0977ab + +commit d1d8144ea682adae5c3bb2994322fa524584ce8b +Author: djm@openbsd.org +Date: Tue Oct 21 08:34:52 2025 +0000 + + upstream: add some more synchronisation to avoid a race between + + command entry and ^C that showed up on the portable regress tests. + + OpenBSD-Regress-ID: 5527e74aed1b008aa7e5223ca5a84aedecd973d4 + +commit 8704c141bf6ded67ab466f5e987c49329ebbd968 +Author: dtucker@openbsd.org +Date: Tue Oct 21 07:18:27 2025 +0000 + + upstream: Always create logfiles. Should prevent "can't operate on + + symlink" warnings during test runs. + + OpenBSD-Regress-ID: 65cf5ce3c8b87b5609f1f3ea142b4f381128dc33 + +commit dc9af8fb0436013afb544248e0afc2fd02a1a8fa +Author: Mike Frysinger +Date: Sun Oct 19 09:33:23 2025 -0400 + + bsd-openpty: include stdio.h for snprintf + +commit afe83537e0c0c159c7c3b6ef859424f6da18169c +Author: Damien Miller +Date: Tue Oct 21 09:14:35 2025 +1100 + + include tmux in CI package list + +commit a750ec60782d21db69383344dda478342d40ffa1 +Author: Darren Tucker +Date: Mon Oct 20 18:31:08 2025 +1100 + + Detect tmux at configure time and pass to tests. + + ok djm@ + +commit 75faa8a167b5cd4453937387b15216aa3cbc52ce +Author: Darren Tucker +Date: Mon Oct 20 18:29:24 2025 +1100 + + Update LibreSSL versions and add 4.2.0. + +commit 74369b2b7c366887211ef5c092b0aaa60f31ef11 +Author: djm@openbsd.org +Date: Mon Oct 20 00:45:10 2025 +0000 + + upstream: regression test for "interactive" ssh with a PTY attached, + + using tmux + + would have likely caught the ControlPersist regression in 10.1. + + feedback nicm@ + + OpenBSD-Regress-ID: d4d709c08657769cb5691893cc98f34b6f537e76 + +commit a204650386124df8035b8c8613dccbe9b3158cdf +Author: Darren Tucker +Date: Fri Oct 17 16:26:22 2025 +1100 + + Retire macos-13 runners, add Intel-specific ones. + +commit a6503f1e22aa34ac08d5b4d2b6730954ffd30116 +Author: Darren Tucker +Date: Fri Oct 17 16:23:43 2025 +1100 + + If we have nfds_t, check if it's int or long. + + Should fix build on very old Mac OS X, eg 10.3. Spotted and patch tested + by Sevan Janiyan. + +commit ce49aceba9f4b5f34a1041145782914aa35ca880 +Author: Damien Miller +Date: Thu Oct 16 11:15:16 2025 +1100 + + link ssh against ssh-pkcs11.o + + Should fix PIN entry for direct use of PKCS11Provider in ssh(1) + bz3879 + +commit 946574b97ceae126e0f0af2db43abb454937defe +Author: djm@openbsd.org +Date: Thu Oct 16 00:01:54 2025 +0000 + + upstream: regress test for PKCS#11 directly in ssh (not via ssh-agent) + + would have caught bz3879 + + OpenBSD-Regress-ID: ceafb1e9a6c07185cc0cb0589f3170489a516123 + +commit e3fdb82fb02723dbe139f9d4be274d7fddfb7983 +Author: djm@openbsd.org +Date: Thu Oct 16 00:00:36 2025 +0000 + + upstream: missed a case in previous + + OpenBSD-Commit-ID: 271c5602b5e719ee3def19dbd9a33328b4fa7edc + +commit d926a84d17fb28bc94219e68575cb4847af02e9a +Author: djm@openbsd.org +Date: Wed Oct 15 23:55:01 2025 +0000 + + upstream: don't try to pledge() the client if a PKCS11Provider is + + in use + + OpenBSD-Commit-ID: 445b2bf4b1e36e515f4d888f35244fd2dcfbb566 + +commit 9c8572a357c071923569a62bd9cfb68b1f788e09 +Author: djm@openbsd.org +Date: Wed Oct 15 23:54:20 2025 +0000 + + upstream: mention this is for both ssh-pkcs11.c and + + ssh-pkcs11-client.c + + OpenBSD-Commit-ID: 26eff4b9a328fa056e98b997cb57254639e48fda + +commit a4e404a64b117a15453075ee26eb061d416e58cd +Author: Arnout Engelen +Date: Sat Jun 21 09:47:28 2025 +0200 + + mdoc2man: process `Dl` macros + + `Dl` marks a single line as 'literal'. Since we don't output single + lines differently in literal vs regular mode (we only insert line + breaks for multi-line blocks in literal mode), we can just skip it. + +commit 45e2d8861bb724cfced1bf0693a6418a0cba6ab2 +Author: Arnout Engelen +Date: Fri Jun 20 21:36:44 2025 +0200 + + mdoc2man: support `Ns` inside `Ic` + + When encountering an `Ns` mdoc macro ('no space') inside an `Ic` block + ('command'), such as for 'lines=number' in ssh-keygen.1, `mdoc2man` + just output the macro instead of processing it. + + This adds processing for `Ns` when seen inside an `Ic` block. + +commit 2b1761dea36c120417d8b73db8310dc09a781e6f +Author: Mike Frysinger +Date: Mon Oct 13 11:29:36 2025 -0400 + + gitignore: ignore all *~ files + + This is a common backup style. + +commit 3ccdd9841f48e7d660f8b60c996965e9dde0a3a9 +Author: Mike Frysinger +Date: Mon Oct 13 12:49:24 2025 -0400 + + bsd-misc: include sys/ioctl.h + + This file uses ioctl() to implement some fallback functions, but + doesn't include sys/ioctl.h for it. + +commit 3adc47e161901001816045c032fa61e94b0c9426 +Author: Damien Miller +Date: Tue Oct 14 14:52:50 2025 +1100 + + don't leak PAM handle on repeat invocations + + Reported by Casper Dik via bz3882; ok dtucker@ + +commit a6ee0eb8cd951d0a00b2f06687c77f8f573b5985 +Author: Darren Tucker +Date: Mon Oct 13 19:02:45 2025 +1100 + + Switch OpenBSD VMs to use doas instead of sudo. + + OpenBSD 7.3 packages have been removed from the mirrors so we can't + install sudo for it any more, so switch to the native doas utility. + +commit da2f945f62e5a462381103803ee72e924bd1f137 +Author: Damien Miller +Date: Mon Oct 13 14:33:04 2025 +1100 + + check whether diff accepts -N + +commit cd8c96f283dbad90991edc09ade962bcfd96adc9 +Author: djm@openbsd.org +Date: Mon Oct 13 00:56:15 2025 +0000 + + upstream: test remote/remote recursive transfers where the source + + path ends in ".." + + OpenBSD-Regress-ID: 2f42078cfcee986d08b5d135968b8de6186c0003 + +commit be0777ae3ef6d9deacb0e3c494674c84feac34bd +Author: djm@openbsd.org +Date: Mon Oct 13 00:55:45 2025 +0000 + + upstream: test recursive transfers, including cases where the + + source path ends in ".." + + OpenBSD-Regress-ID: a38e3dbc86f6b7a95605784dcc601f17ede9c3f0 + +commit 36a98fccaacbbf07eaf67855a8057cba724c5e91 +Author: djm@openbsd.org +Date: Mon Oct 13 00:55:09 2025 +0000 + + upstream: test implicit destination path selection when source path + + ends with ".." + + OpenBSD-Regress-ID: 42a88e7cdceee8a83879f5730199084ee4a95902 + +commit 4f14ca8633a2c8c0a1a19165663421f0ab32f6ab +Author: djm@openbsd.org +Date: Mon Oct 13 00:54:29 2025 +0000 + + upstream: similar to scp, fix implicit destination path selection + + when source path ends with ".."; ok deraadt@ + + OpenBSD-Commit-ID: 9b8d2a662d96b241293a88b3ea21f2419bfc4812 + +commit 6432b9f6a216d0f5fb43df500e9bc30bebb3f58b +Author: djm@openbsd.org +Date: Mon Oct 13 00:53:51 2025 +0000 + + upstream: when using the SFTP protocol for transfers, fix implicit + + destination path selection when source path ends with ".."; ok deraadt@ + bz3871 + + OpenBSD-Commit-ID: d75b3b006386c5302ed4f67c4add18464ab36a0b + +commit 30c20c901d8f665fb28edd006f6f8c1e46413051 +Author: dtucker@openbsd.org +Date: Sat Oct 11 23:39:14 2025 +0000 + + upstream: Import regenerate moduli. + + OpenBSD-Commit-ID: 8512e01cf917dca6455be561d66db8eeb49f3f0b + +commit b6fd0e6d085ef519982c968b57fbaa9e509e1a3a +Author: Damien Miller +Date: Fri Oct 10 15:23:59 2025 +1100 + + depend + +commit d6212b0b89241e96d2fea9619b2d66ea668bceaa +Author: djm@openbsd.org +Date: Fri Oct 10 00:31:53 2025 +0000 + + upstream: clean up more thoroughly between tests + + OpenBSD-Regress-ID: c8394eae7547374a8fc43d03d865539e2917ea50 + +commit 9525aa3ecc6b27643fb83d8be4d61e831e357134 +Author: djm@openbsd.org +Date: Thu Oct 9 23:58:27 2025 +0000 + + upstream: simplify + + OpenBSD-Regress-ID: 8e91a2a5c1eb50128de3be72118b544d73a86673 + +commit e7b4b3f153713c15e3888aa50df039b2445492dd +Author: djm@openbsd.org +Date: Thu Oct 9 23:26:47 2025 +0000 + + upstream: don't abuse SSHKEY_FLAG_EXT to signal that a key is in + + the agent, as that triggers special handling on sshkey_free() + + OpenBSD-Commit-ID: 2ae2247babd2db167a30cf7a4f7eae4f26c000a8 + +commit 59a336cfd1283f512f067e01bc91bda5af253f80 +Author: djm@openbsd.org +Date: Thu Oct 9 23:25:23 2025 +0000 + + upstream: downgrade a useless error() -> debug() + + OpenBSD-Commit-ID: 5b0c9bcddb324f8bed2c8e8ffe9c92d263adc2d9 + +commit 649c9994e7d1995a03d8621f1412cfee90a430af +Author: djm@openbsd.org +Date: Thu Oct 9 03:23:33 2025 +0000 + + upstream: silence "mm_log_handler: write: Broken pipe" logspam + + OpenBSD-Commit-ID: bcf7c6ea509e755bd5a7cd567ff7cad725111a14 + +commit fb0bf236b0237aa83a0c5b666af7bdc0423ac457 +Author: Darren Tucker +Date: Thu Oct 9 17:57:17 2025 +1100 + + Add tracking for 10.2 branch. + +commit 081b8dbbe90d81a43b5e0f1995fe59a0e319aa15 +Author: Damien Miller +Date: Thu Oct 9 13:12:15 2025 +1100 + + complete PKCS#11 stubs and move to ssh-pkcs11.c + + Should unbreak --disable-pkcs11 builds + +commit ac4457787900c99ada9cc3768249291b002fa16e +Author: Damien Miller +Date: Thu Oct 9 13:10:27 2025 +1100 + + some fixes to p11_setup + + 1. Use the ssh-keygen under test and not the one in $PATH + 2. Include a test PKCS#11 operation to ensure that the P11 stack is + working correctly. + + Previously, it was possible for p11_setup to return success on + configurations with PKCS#11 support disabled. + +commit 3470f465c6f5c7c371e73927ebb403dd7ba05893 +Author: Damien Miller +Date: Thu Oct 9 10:07:40 2025 +1100 + + link ssh-keygen directly against ssh-pkcs11.c + + Matches what OpenBSD does and fixes ssh-keygen regression in + certifying keys using a CA key hosted via ssh-agent (bz3877) + +commit 0f3b8fd68a29766697d7a709bae8b0a61da6cff2 +Author: djm@openbsd.org +Date: Wed Oct 8 21:48:40 2025 +0000 + + upstream: When tab-completing a filename, ensure that the completed + + string does not end up mid-way through a multibyte character, as this will + cause a fatal() later on. + + based on GHPR#587 from @TaoistBrickscarrier; feedback tb@ kevlo@ + ok dtucker@ + + OpenBSD-Commit-ID: efb977164b4e20d61204a66201a7592ba8291362 + +commit 0118c30acaff308deb089fc25fe98ef59a149ca5 +Author: djm@openbsd.org +Date: Wed Oct 8 21:02:16 2025 +0000 + + upstream: fix crash at exit (visible via ssh-keygen -D) when + + multiple keys loaded. ok markus deraadt dtucker + + OpenBSD-Commit-ID: baa9763ec69d162108dafd962792ec5610ff45c9 + +commit 64ea9e95256203f30f98a6896f4721fd223106aa +Author: djm@openbsd.org +Date: Wed Oct 8 00:32:52 2025 +0000 + + upstream: openssh-10.2 + + The only change since 10.1 is the channels.c fix + + OpenBSD-Commit-ID: 5eebeb0db14c694efd4ee96b5f16112e3e5d5ba9 + +commit bcf7c05a473f92a35f4f3b561fd7a1e339e0a30f +Author: Darren Tucker +Date: Wed Oct 8 11:26:52 2025 +1100 + + Fix header name and move return outside of ifdef. + + Fixes from Mike Frysinger via Github PR#597. + +commit b937061fe4922caced7b91442b3233c0bd763492 +Author: Darren Tucker +Date: Tue Oct 7 21:10:33 2025 +1100 + + Check HAVE_MMAP too now that configure sets it. + +commit 8d57083c062f03098c9f767ec8d6278dc549a2f6 +Author: Darren Tucker +Date: Tue Oct 7 21:07:05 2025 +1100 + + Use calloc for sshkeys if mmap is not supported. + + Based on Github PR#597 from Mike Frysinger, any bugs added by me. + +commit c97b931bffa481c72ff4bfddd9d59a2110899289 +Author: Darren Tucker +Date: Tue Oct 7 20:25:07 2025 +1100 + + Add fcntl.h to includes. + + From FreeBSD via bz#3874: "This was previously included due to nested + includes in Heimdal's headers. Without this, the build fails with an + error due to redefining AT_FDCWD." + +commit 8aa13832315e52c4404c993a59c6139b44ac6114 +Author: Daan De Meyer +Date: Mon Mar 20 20:22:14 2023 +0100 + + Only set PAM_RHOST if the remote host is not "UNKNOWN" + + When using sshd's -i option with stdio that is not a AF_INET/AF_INET6 + socket, auth_get_canonical_hostname() returns "UNKNOWN" which is then + set as the value of PAM_RHOST, causing pam to try to do a reverse DNS + query of "UNKNOWN", which times out multiple times, causing a + substantial slowdown when logging in. + + To fix this, let's only set PAM_RHOST if the hostname is not "UNKNOWN". + +commit 0bd6649ea80ead0cd6404dbc25b64937421b556e +Author: Darren Tucker +Date: Tue Oct 7 20:10:56 2025 +1100 + + Don't copy native host keys for hostbased test. + + Some github runners (notably macos-14) seem to have host keys where + public and private do not match, so generate our own keys for testing + purposes. + +commit 33b63718d40ccc555b8c7a24331a3790b2efc6c5 +Author: Darren Tucker +Date: Tue Oct 7 20:10:07 2025 +1100 + + Add 10.1 branch to ci-status page. + +commit 52411f15353257e9ec883fc044b7a56b6fca242d +Author: Darren Tucker +Date: Tue Oct 7 20:04:40 2025 +1100 + + Add clock_gettime compat shim. + + This fixes the build on macOS prior to 10.12 Sierra, since it does not + have it. Found and tested by Sevan Janiyan. + +commit beae06f56e0d0a66ca535896149d5fb0b2e8a1b4 +Author: djm@openbsd.org +Date: Tue Oct 7 08:02:32 2025 +0000 + + upstream: don't reuse c->isatty for signalling that the remote channel + + has a tty attached as this causes side effects, e.g. in channel_handle_rfd(). + bz3872 + + ok markus@ + + OpenBSD-Commit-ID: 4cd8a9f641498ca6089442e59bad0fd3dcbe85f8 + +commit 476bab6259d5a6ea0402ec79bc47ed61e2c15e86 +Author: Damien Miller +Date: Mon Oct 6 12:52:25 2025 +1100 + + depend + +commit af956575eba6bf6b6d6bc817e1aa6ed73a365984 +Author: Damien Miller +Date: Mon Oct 6 12:51:13 2025 +1100 + + update versions + +commit 2fd0945913a30fbbe7c02503347961df03f28e66 +Author: Damien Miller +Date: Mon Oct 6 12:48:16 2025 +1100 + + sync ssh-copy-id to upstream version 527be673f4d + +commit 981bb32bc6062fa5d6f11de7ffb732967463bf57 +Author: djm@openbsd.org +Date: Mon Oct 6 01:45:22 2025 +0000 + + upstream: openssh-10.1 + + OpenBSD-Commit-ID: 2a232c2d2fc05a23519f69bc29e6d8c076b97d97 + +commit b9a640a1a0dccfb56be684cc7ade402f57cf7ebd +Author: dtucker@openbsd.org +Date: Fri Oct 3 01:03:45 2025 +0000 + + upstream: If write() returned short, the subsequent write would restart + + from the beginning of the buffer not the end of what was written. Fix, since + we want modpipe to corrupt data for testing purposes deliberately not + accidentally. ok djm@ + + OpenBSD-Regress-ID: 50ca74d287445c58944f070bb92dc13b1d054b43 + +commit a0e5446ac85aca5a3ef9844eeedf787300fdb8b3 +Author: naddy@openbsd.org +Date: Sat Oct 4 21:41:35 2025 +0000 + + upstream: typos: a ssh* -> an ssh* + + ok dtucker@ + + OpenBSD-Commit-ID: a70fd2e1b23089260e8f5a7921b0debc06b011cb + +commit ade92f53c3bd4ad7dcd95334a194add57ec9ff71 +Author: djm@openbsd.org +Date: Fri Oct 3 00:09:26 2025 +0000 + + upstream: stray newline + + OpenBSD-Commit-ID: b47ed4fa93b781c7ec8ae2936526a290f4e17e1f + +commit a9cbe10da2be5be76755af0cea029db0f9c1f263 +Author: djm@openbsd.org +Date: Fri Oct 3 00:08:02 2025 +0000 + + upstream: include openssl/bn.h explicitly in files where we use BN_* + + makes things simpler for portable; from Mike Frysinger + + OpenBSD-Commit-ID: 717e93403fd1108e175afd7451b5a4ab46a598fe + +commit 3957cc2914cdc88932c972413853f8b68c1ffba5 +Author: dtucker@openbsd.org +Date: Thu Oct 2 08:38:43 2025 +0000 + + upstream: Relax array check slightly. Prevents compiler warnings + + in -portable when there are no kbdint devices present. ok djm@ + + OpenBSD-Commit-ID: c1c050cecd642d6073c792201908fd225191df93 + +commit 6a239b057be2897d7a597daaf5394f2e7312dc65 +Author: djm@openbsd.org +Date: Thu Oct 2 04:23:11 2025 +0000 + + upstream: backout r1.243 (fix for fatal during tab-completion with + + some multibyte sequences) as it breaks the common case for tab completion. + + Will deal with it properly after release. + + OpenBSD-Commit-ID: 196d00f5ff19579214de45357f16a1fb2d624be1 + +commit b9f6a84ea383d811216de38219472214963c10b2 +Author: Darren Tucker +Date: Thu Oct 2 10:48:04 2025 +1000 + + Pass COMPATINCLUDES down to openbsd-compat too. + + Fixes build on Solaris, AIX and probably others. + +commit 047e0221eaf9815775e8ea78c6d6add5ab0f68c7 +Author: Darren Tucker +Date: Wed Oct 1 14:34:02 2025 +1000 + + Pass new "compat includes" path via AC_SUBST. + + This fixes the build when the directory path containing a space. + Found by Sevan Janiyan, tested by Job Snijders. This doesn't fix + "make tests", however that is a different, pre-existing problem + that needs to be addressed separately. + +commit 5c50ddbe4deac83995edc1d014e9ba0d5efa18a6 +Author: Darren Tucker +Date: Wed Oct 1 13:37:35 2025 +1000 + + Remove compat "include" dir during distclean. + +commit aceabd62ce5833716dd2e99d4be4fcb603d263cc +Author: dtucker@openbsd.org +Date: Wed Oct 1 00:33:37 2025 +0000 + + upstream: Set keys to NULL after freeing in tests where the + + variables will be used again. Should prevent Coverity "potential use after + free" warnings. + + OpenBSD-Regress-ID: 24d141657d25977e41dfb0c58e9b74ab093972bf + +commit eb30a0d1493a97b5c14728846576dc6af5d442da +Author: dtucker@openbsd.org +Date: Wed Oct 1 00:30:19 2025 +0000 + + upstream: Get rid of utf8 droppings in commment since it confuses + + older shells. From Sevan Janiyan via openssh-unix-dev. + + OpenBSD-Regress-ID: 67c11a5cff6ef23538c77e9b29d538e175e6cfe3 + +commit d478e250230e917eeb5032238df0b9af357404ee +Author: Darren Tucker +Date: Wed Oct 1 12:17:54 2025 +1000 + + Update OpenSSL & LibreSSL versions we test against. + +commit 2c504a74ed81d13c8198a89ed1040d0fc5f73129 +Author: djm@openbsd.org +Date: Tue Sep 30 00:10:42 2025 +0000 + + upstream: during sftp uploads, avoid a condition where a failed write + + could be ignored if a subsequent write succeeded. + + This is unlikely but technically possible because sftp servers are + allowed to reorder requests. + + Reported by Graziano Stefani, ok tb@ + + OpenBSD-Commit-ID: 03904bce2c7f787223d01d7e1179fde15753eca3 + +commit 1f7556753869654ba5e2bf61e384c5da2db5ca6a +Author: djm@openbsd.org +Date: Tue Sep 30 00:06:06 2025 +0000 + + upstream: avoid a fatal() when sftp tab-completes filenames that + + share common utf-8 characters that don't encode to a complete codepoint + + from menthu.zhou via GHPR#587; ok dtucker@ + + OpenBSD-Commit-ID: e07e4d8a8cac032ab536570b8214e6ef6839b585 + +commit 42b14ff1e06fd683c7d15a6b2816c16108873a5a +Author: djm@openbsd.org +Date: Tue Sep 30 00:03:09 2025 +0000 + + upstream: fix memory leak in mux_client_request_stdio_fwd GHPR#575 + + by Boris Tonofa; ok dtucker + + OpenBSD-Commit-ID: 410cdd05242304bd0196b9172ce5fcaf89d2d8ce + +commit e5055ef26abcffd3f99669e411ea6b35ca166111 +Author: Allison Karlitskaya +Date: Wed Sep 3 20:07:55 2025 +0200 + + Don't log audit messages with UNKNOWN hostname + + The `host` parameter to audit_log_acct_message() is documented as + follows: + + host - The hostname if known. If not available pass a NULL. + + but we pass the string "UNKNOWN" in case we don't know the hostname. + Make sure we pass NULL instead. + + This avoids having the audit system attempt to perform a DNS lookup on + the hostname "UNKNOWN", which tends to result in long delays when + attempting to login. + +commit d343df4019b4369ce7f87e9bf6bbc80b81cd263d +Author: zhangjun +Date: Fri Aug 22 16:49:07 2025 +0800 + + ensure struct passwd fields are non-NULL in pwcopy + + Android libc can return NULL pw_gecos, for example. + +commit 893a579e4b37e6bd89d206dc8e7ac2a906ccf114 +Author: dtucker@openbsd.org +Date: Mon Sep 29 21:37:52 2025 +0000 + + upstream: Add explicit check for array overflow. + + The array is bounded by a NULL sentinel which already prevents this, + however since we check the bit vector for overflow Coverity assumes that + check is for the devices array and flags it as a potential overflow. + Adding this additional check on the array placates CID 896018. ok djm@ + deraadt@ + + OpenBSD-Commit-ID: e92fff41341b38e4206a70655cc9acaaa032ebee + +commit 90f49a185ac1a786d9f7e9a710b369afb3692a65 +Author: dtucker@openbsd.org +Date: Mon Sep 29 21:30:15 2025 +0000 + + upstream: Move ifdef to start of file. Removes diff vs portable. + + OpenBSD-Commit-ID: 55058ac3d477e4c696575039f5b275522b99ffea + +commit 2f71b44d48dc8da7fb743d6ffe609aea5a645edb +Author: dtucker@openbsd.org +Date: Mon Sep 29 21:29:22 2025 +0000 + + upstream: Include misc.h. Removes diff vs portable. + + OpenBSD-Commit-ID: 8aa48451fe5c37f04a339450c4ed9cfb8f4c288f + +commit dfb991bdd826517bbce1cf62ce07bcb3e48a2f27 +Author: dtucker@openbsd.org +Date: Mon Sep 29 21:28:33 2025 +0000 + + upstream: Sort headers as per KNF. Removes diff vs portable. + + OpenBSD-Commit-ID: 55f5b9eaeb826a25cfb506a78136094275a71bcb + +commit c82f4dd6b723a8365b4c538d7c99fe8e46985ed0 +Author: dtucker@openbsd.org +Date: Mon Sep 29 07:40:55 2025 +0000 + + upstream: Null out keys after freeing in tests in the case where we + + potentially reuse the variable. Fixes Coverity CID 405057. + + OpenBSD-Regress-ID: c52e86502b33bfa6e448448a74a0217dd519dd58 + +commit fda31e1e5179b4e70c27094ebb303ee47c11a5a7 +Author: djm@openbsd.org +Date: Mon Sep 29 03:17:54 2025 +0000 + + upstream: avoid spurious error message when loading certificates + + only bz3869 + + OpenBSD-Commit-ID: e7848fec50d15cc142fed946aa8f79abef3c5be7 + +commit bcd88ded2fff97652d4236405a3354ca66f90f7e +Author: djm@openbsd.org +Date: Mon Sep 29 02:32:15 2025 +0000 + + upstream: kbd-interactive device names should be matched against + + the full device name, not a prefix. Doesn't matter in practice as there is + only one kbd-int device supported (PAM xor BSD auth), and an attacker would + still need to successfully authenticate against an incorrectly-selected + device. + + reported by ashamedbit, NobleMathews; ok deraadt@ + + OpenBSD-Commit-ID: cf75d4f99405fbb41354c4ae724a3b39a3b58f82 + +commit b1c4bf5c2f1c2b30698dbaadc5d823862213f1fc +Author: jsg@openbsd.org +Date: Thu Sep 25 12:52:21 2025 +0000 + + upstream: avoid use-after-free in update_krl_from_file() found with + + clang scan-build, ok dtucker@ + + OpenBSD-Commit-ID: 8ec86eca573740c94d5bc7e252959174555f4eb8 + +commit b06a150bc903a0cf898406384d5a34059d0f2d8f +Author: Darren Tucker +Date: Sat Sep 27 20:20:34 2025 +1000 + + Stop testing OpenBSD ubsan until fixed upstream. + +commit 97b32fa2af25c16aec4de85c5cbb63fd038b4dfa +Author: dtucker@openbsd.org +Date: Fri Sep 26 04:40:45 2025 +0000 + + upstream: Use $OBJ for temp file in maxstartups idempotence test. + + Fixes test in -portable when run out-of-tree. + + OpenBSD-Regress-ID: 8578be08238af4abe2dc91af1c199f7f71f1a7a2 + +commit b4ceca952b85752958d849508294afdc56dfcb9f +Author: Darren Tucker +Date: Fri Sep 26 22:28:13 2025 +1000 + + Shorten workflow names to fit in a single line. + +commit 9824ec515ed6256c1a98d66049471053f965b75e +Author: Darren Tucker +Date: Fri Sep 26 22:26:33 2025 +1000 + + Update link to oss-fuzz bug tracker. + + Remove 9.8 branch. + +commit 37d996bd0537837f15fc540d5aebb1ef2faf2268 +Author: dtucker@openbsd.org +Date: Thu Sep 25 22:17:29 2025 +0000 + + upstream: Check return codes of sshbuf functions. + + Fixes Coverity CIDs 405059 and 405061. + + OpenBSD-Regress-ID: defa55d32892172251bbd5efd15731ce55888247 + +commit 6c3c9f03c3c2cc4e40decbb49b8486abfb9e57df +Author: Darren Tucker +Date: Fri Sep 26 08:23:21 2025 +1000 + + Replace hand-rolled modulo with arc4random_uniform. + + Fixes potential modulo-by-zero UB flagged by Coverity CID 405068 + +commit e914e61eb88e22e5b725c399698256c54589ca32 +Author: Darren Tucker +Date: Thu Sep 25 17:50:07 2025 +1000 + + Remove status bits from OpenSSL >=3 version check. + + OpenSSL traditionally did not guarantee ABI compatibility across release + (and development) versions. Because of this, OpenSSH checked the lower 4 + "status" bits returned by OpenSSL_version_num(), which were originally + set to 0 for development versions and 0xf for release versions and, if + they did not match, would report the discrepancy and exit. + + OpenSSL (unintentionally) changed these bits in the 3.0.0 and subsequent + 3.x releases, setting them to zero in the release versions (which happened + to also match the documentation), then changed them back in the 3.5.3 + release. If OpenSSL was upgraded to (or from) this version without + recompiling OpenSSH, it would cause OpenSSH flag it as potentially + incompatible and refuse to use it. Ultimately OpenSSL rolled this + back, but the check now has no value so is being removed for OpenSSL + versions >=3. + + bz#3865 and https://github.com/openssl/openssl/issues/28575, ok djm@ + +commit 35f3e2a41c2afe7a68a8a4efb3eb385e7f8d247d +Author: Darren Tucker +Date: Thu Sep 25 18:06:55 2025 +1000 + + Update pledge() interface to match current OpenBSD. + + ok djm@ + +commit 7ce3823547578a3b083085744c1fea39237197a2 +Author: Darren Tucker +Date: Tue Sep 23 22:12:19 2025 +1000 + + Merge all putty tests into a single test. + + The lets us reuse the built OpenSSH binaries and replaces 12*4min of + tests with a single 14min one. + +commit 1362f6c0f4ca3306a201a6572bb9ec0d47d8edb3 +Author: Darren Tucker +Date: Thu Sep 25 18:20:53 2025 +1000 + + Add #ifdefs in pwfree to match those in pwcopy. + + Fixes build on many platforms. + +commit 8235dc3d82c0ac347a3600df0907c6573720fbaa +Author: djm@openbsd.org +Date: Thu Sep 25 07:05:11 2025 +0000 + + upstream: fix some one-off leaks in ssh.c; ok dtucker@ + + OpenBSD-Commit-ID: bf3c27ffe4b3cccb6553b554ec4c04929065a2bc + +commit 846987d1233f24bbe87ebed347e328f45525388a +Author: djm@openbsd.org +Date: Thu Sep 25 07:04:38 2025 +0000 + + upstream: fix some one-off leaks in ssh-keygen; ok dtucker@ + + OpenBSD-Commit-ID: 32f51289c93246474659aa49067926fcab9e02e8 + +commit a1a7df8b3694fdd7b55ad6bb8fa7b3d5d7f5b89a +Author: djm@openbsd.org +Date: Thu Sep 25 07:00:43 2025 +0000 + + upstream: fix some leaks in ssh-add; feedback/ok dtucker@ + + OpenBSD-Commit-ID: 441302917de31a128c1d6d63acccc67042fcf349 + +commit a8a2702bcd9e81a086e6d2c278f1b62f9d8bf3a1 +Author: djm@openbsd.org +Date: Thu Sep 25 06:57:54 2025 +0000 + + upstream: fix some leaks; feedback/ok dtucker@ + + OpenBSD-Commit-ID: 05bdbc2e494b87a4a79e509020bd8249c86a4ff0 + +commit a071af0682d686de85cf471f5e04deaee4d90adb +Author: djm@openbsd.org +Date: Thu Sep 25 06:45:50 2025 +0000 + + upstream: wait for the unprivileged sshd-auth process to exit + + before closing the fd it uses to report log messages + + This avoids a race where the child process notices the + fd was closed before exiting and spams the logs. + + ok dtucker@ + + OpenBSD-Commit-ID: 7cddaa41be3b955e6bed570900db7ab8817b1e76 + +commit 4fddebe7f524b3403c876c3b399d5ce7ce3390a6 +Author: djm@openbsd.org +Date: Thu Sep 25 06:33:19 2025 +0000 + + upstream: add some functions to free various structs, including + + channels data and packet state; ok dtucker@ tb@ + + OpenBSD-Commit-ID: a8b3705309d632cdae370d4147a03e703087b0d1 + +commit d0c1e73d408a24b2db18c0aa1a0108bea0f24210 +Author: djm@openbsd.org +Date: Thu Sep 25 06:31:42 2025 +0000 + + upstream: fix leaks of config objects in + + mm_decode_activate_server_options ok dtucker@ tb@ + + OpenBSD-Commit-ID: 211f4d7d02e847bd1bcb460f6beb11658809a742 + +commit b62aa85dcbc8f03bf91d26d14fbf8fd5e172d882 +Author: djm@openbsd.org +Date: Thu Sep 25 06:25:38 2025 +0000 + + upstream: clarify intent and avoid (harmess, defined behaviour) + + unsigned underflow. ok tb@ + + OpenBSD-Commit-ID: b73bf5f1f381c3e4561a6cc706fb1cd77c939cd8 + +commit 6f28a935cc7d073e6647643e81d98b5831df204f +Author: jsg@openbsd.org +Date: Thu Sep 25 06:23:19 2025 +0000 + + upstream: consistently use NULL for null pointer constants found + + with sparse, ok djm@ + + OpenBSD-Commit-ID: 1067504b63732d809d0d57ad4bc626818d112772 + +commit 0af7e5b690e2cfe8824f04f154b0e543509dbefd +Author: jsg@openbsd.org +Date: Thu Sep 25 02:15:39 2025 +0000 + + upstream: remove unneeded externs ok djm@ + + OpenBSD-Commit-ID: fe553193e910a122505142a4e1db7358cc1ae653 + +commit ae62a16118bb96a8e449ef25f5e55ef86a52cefb +Author: jsg@openbsd.org +Date: Thu Sep 25 02:12:16 2025 +0000 + + upstream: remove prototype for removed ssh_packet_set_tos() ok + + djm@ + + OpenBSD-Commit-ID: 396f82995074ef4d7b9ce44168266ef4640d9985 + +commit d8588478850463f8945aa18d0358b2b227f8b57a +Author: jsg@openbsd.org +Date: Wed Sep 24 00:51:28 2025 +0000 + + upstream: spelling; ok dtucker@ + + OpenBSD-Commit-ID: 93870117b0153859dd8baa80b97e44d4558c786b + +commit eff358890a7cab1e7c2fec62e5b9914d2c1c8703 +Author: Darren Tucker +Date: Tue Sep 23 16:51:34 2025 +1000 + + Merge VM tests into a single workflow file. + + Should make it easier to manage, although it may cause a few extra runs. + +commit d00015d21190517a1f505eb8120f716b1c2e4055 +Author: Darren Tucker +Date: Tue Sep 23 16:38:45 2025 +1000 + + Test openssl-3.6 branch not beta1. + +commit 31fce4fc5aaf79b9a4bccf09467e86c56b482bde +Author: Darren Tucker +Date: Tue Sep 23 15:51:14 2025 +1000 + + Test openssl-3.6.0-beta1. + +commit b94e7251a17a497669e825cb70ac79c96bdc3472 +Author: Darren Tucker +Date: Tue Sep 23 11:32:57 2025 +1000 + + Specify rpath when building OpenSSL. + +commit 83853aa5e35f3da0690bccd2983764d4e749a670 +Author: Darren Tucker +Date: Mon Sep 22 15:26:17 2025 +1000 + + Factor out OpenSSL install and test more versions. + + Move OpenSSL installation into its own script with a "-a" option to + install the "next" version to test for ABI compatibility. + +commit 2c1d38f7ffc8b8ec244bfe17ec8a85b3d737dcab +Author: Darren Tucker +Date: Mon Sep 22 16:55:49 2025 +1000 + + Exclude generated openbsd-compat/include directory. + +commit 67b3ed101a18348b564507f55e3ed4b7e0d23ff9 +Author: Darren Tucker +Date: Sat Sep 20 15:07:36 2025 +1000 + + Add OpenSSL 3.x ABI cross-compatibility test. + +commit c682c9f45a10ee0dc37fd716cfccd42271f92ddc +Author: Darren Tucker +Date: Sat Sep 20 15:05:19 2025 +1000 + + Add tests for OpenSSL 3.4 and 3.5 versions. + +commit 1659d0ac095608b809fd3173d2c48b7b39d40b02 +Author: Darren Tucker +Date: Sat Sep 20 15:53:04 2025 +1000 + + Build OpenSSL with -j4 to speed it up. + +commit ca9ac1109e2c875ea33da6818c1841aa2181e962 +Author: Darren Tucker +Date: Sat Sep 20 15:16:30 2025 +1000 + + Rerun tests if run_tests.sh changes. + +commit bc328144f149af07139a0f2c1329018cd85b86b7 +Author: djm@openbsd.org +Date: Fri Sep 19 01:32:45 2025 +0000 + + upstream: log at level INFO when PerSourcePenalties actually blocks + + access to a source address range. Previously this was logged at level + VERBOSE, which hid enforcement actions under default config settings. + + ok dtucker, markus + + OpenBSD-Commit-ID: ea2b0d7c2253ff5205719d74b526cf2870df894d + +commit 80993390bed15bbd1c348f3352e55d0db01ca0fd +Author: Darren Tucker +Date: Wed Sep 17 17:41:41 2025 +1000 + + Whitespace. + +commit fc704057ce6b75637645a4b9c917565b3563e21b +Author: Darren Tucker +Date: Wed Sep 17 17:33:25 2025 +1000 + + Move Gihub VMs to their own status line. + +commit 2202e5f9008003044cac01ed70d83deec42ad4e0 +Author: Darren Tucker +Date: Tue Sep 16 23:00:14 2025 +1000 + + Use relative URLs for status + +commit 7c32e09ea3e5c7e1fa0b7e2d4ddc83f8beadafed +Author: Darren Tucker +Date: Mon Sep 15 17:21:15 2025 +1000 + + Add VM test targets via vmaction on Github. + +commit a4aa090a3d40dddb07d5ebebc501f6457541a501 +Author: djm@openbsd.org +Date: Mon Sep 15 03:00:22 2025 +0000 + + upstream: memory leaks in unit tests + + OpenBSD-Regress-ID: af11ac7b8034b99ca324af4dae1ef5cd7700b273 + +commit 6f5942454ad6756355f3b4983ab882cf15e44440 +Author: djm@openbsd.org +Date: Mon Sep 15 05:17:37 2025 +0000 + + upstream: fix leaks of struct sftp_conn in scp; ok dtucker@ + + OpenBSD-Commit-ID: 76bea50b5b87b750c3771bf80feb6067d994a9d2 + +commit 52f38c76fcb38dfe619d8caa3bb4bb782c785026 +Author: djm@openbsd.org +Date: Mon Sep 15 04:52:41 2025 +0000 + + upstream: leak of principals file lines; ok dtucker@ + + OpenBSD-Commit-ID: 918bf1b70e5a969059300f3c23d45911690d9015 + +commit b9464cee0fd084d89d91696a17b3621b4cf512bf +Author: djm@openbsd.org +Date: Mon Sep 15 04:52:12 2025 +0000 + + upstream: leak of authentication options at exit; ok dtucker@ + + OpenBSD-Commit-ID: ba559799c2ff9b10afc3abefb1797c0843a6ff24 + +commit 0bb37080c86674de7cdfb56c80add3cd316c68a8 +Author: djm@openbsd.org +Date: Mon Sep 15 04:51:35 2025 +0000 + + upstream: memleak of keys not used for authentication; ok + + dtucker@ + + OpenBSD-Commit-ID: ddfda79d243150fbd382d8f2cd75a90a072b3669 + +commit ee99f6e93e0ee90eedbd27ffb9b7f9fef7b98010 +Author: djm@openbsd.org +Date: Mon Sep 15 04:50:42 2025 +0000 + + upstream: memleak of certificate path; ok dtucker@ + + OpenBSD-Commit-ID: 90dc5390f2756ba339e2e6df54d4b8651d64c1e7 + +commit 42fc6b6f9fbf58293b070f4de377c7695c275a8a +Author: djm@openbsd.org +Date: Mon Sep 15 04:49:41 2025 +0000 + + upstream: memleak of hostkey when downgrading host cert->key; ok + + dtucker + + OpenBSD-Commit-ID: f6f1f38a8ec144fb615434f6877066cf4610b826 + +commit bc60bd55cbc1f8139c840668733b51475cbefd93 +Author: djm@openbsd.org +Date: Mon Sep 15 04:49:00 2025 +0000 + + upstream: memleak of editline history; ok dtucker@ + + OpenBSD-Commit-ID: a244c54eb074cf7fbe28f7ac4f03ace270f7a999 + +commit ee77ab9b2ca2d70daf8d4352f5daffa8036ece64 +Author: djm@openbsd.org +Date: Mon Sep 15 04:48:29 2025 +0000 + + upstream: memleak of rfwd callback context; ok dtucker@ + + OpenBSD-Commit-ID: 70b2aafeaace90703dd16a44a2a0b723d9155f33 + +commit 0088b3f0ab2c615ae95b9f374963abaa0ab837ec +Author: djm@openbsd.org +Date: Mon Sep 15 04:47:49 2025 +0000 + + upstream: memleaks of request packet and hostkeys blob; ok + + dtucker@ + + OpenBSD-Commit-ID: 313b13a8e36b4ca8e064ee56792e67e0670a386a + +commit d68451a25808c4eee74b898873cd4761f73651ed +Author: djm@openbsd.org +Date: Mon Sep 15 04:41:20 2025 +0000 + + upstream: memleak of KRL revoked certs struct; ok dtucker + + OpenBSD-Commit-ID: f319868e0b2de49c41c735e75b87c403f009f5f9 + +commit 67940cc2f329427d3acb64d4893faf4527e58d5c +Author: djm@openbsd.org +Date: Mon Sep 15 04:40:34 2025 +0000 + + upstream: memleak of kex->server_sig_algs; ok dtucker@ + + OpenBSD-Commit-ID: 41a3f64edd2c9b8addb2e445514ae25c24819e2c + +commit fae8e41741d23298c94a1ea3ef8704a1cc186cb5 +Author: djm@openbsd.org +Date: Mon Sep 15 04:39:58 2025 +0000 + + upstream: fix memleak of channel forwarding permissions; ok + + dtucker@ + + OpenBSD-Commit-ID: 069745547109bc8fcc09fab5b19c53599cae99fd + +commit 03872018c14ed943bc01a4e88be59195a742f106 +Author: djm@openbsd.org +Date: Mon Sep 15 04:39:15 2025 +0000 + + upstream: when merging auth options into the active set, don't + + leak the old struct sshauthopt; ok dtucker@ + + OpenBSD-Commit-ID: c6bfd7bc2932e37f811b3c53272c3b919d33e75b + +commit efed5da4ced88170cf474246eff771dd16c7092f +Author: djm@openbsd.org +Date: Mon Sep 15 04:38:00 2025 +0000 + + upstream: fix memleak when applying certificate options; ok + + dtucker + + OpenBSD-Commit-ID: 36c219dcc05f4df82a0f9c500bdf5dbfea925289 + +commit edc601707b583a2c900e49621e048c26574edd3a +Author: djm@openbsd.org +Date: Thu Sep 11 07:23:32 2025 +0000 + + upstream: disable ssh-add autoexpiry of certificates when testing + + expired certificates + + OpenBSD-Regress-ID: 64aadd23d37fd0b3a06498151f2cf83be7ac342c + +commit c60153e4878f3a6700af69adbdd1863003e78abf +Author: djm@openbsd.org +Date: Thu Sep 11 07:22:37 2025 +0000 + + upstream: correct getopt() string + + OpenBSD-Commit-ID: 05ef9581a3dab32ec93aa5b9c3349ed1e7da9ec8 + +commit 7a4738af45201c115a9e20f830f30ed38ce6be76 +Author: djm@openbsd.org +Date: Thu Sep 11 03:29:58 2025 +0000 + + upstream: need time.h for time(3) + + OpenBSD-Commit-ID: 530964039cccab679432b6c5b28d2b0aa9760b00 + +commit 0c719c6aabc061f02a907fc96c390d0449b49f26 +Author: djm@openbsd.org +Date: Thu Sep 11 02:54:42 2025 +0000 + + upstream: When adding certificates to an agent, set the expiry to + + the certificate expiry time plus a short (5 min) grace period. + + This will cause the agent to automtically remove certificates shortly + after they expire. + + A new ssh-add -N option disables this behaviour. + + Feedback/ok deraadt@ + + OpenBSD-Commit-ID: 92fed1bba1025069ad45deebb534be7530e181df + +commit e9dcccc3541b0ae1c43581ed26215d5cc82e4be0 +Author: jsg@openbsd.org +Date: Mon Sep 8 00:31:54 2025 +0000 + + upstream: remove unused 0-sized files; ok deraadt@ + + OpenBSD-Commit-ID: 7e8178786157e863f6ff63c5d55200d7b6b04f9e + +commit d16b1b484a024ee6b35094e7d9d55bf96b96253b +Author: dtucker@openbsd.org +Date: Fri Sep 5 10:34:35 2025 +0000 + + upstream: Tabs->spaces. Removes diff vs portable. + + OpenBSD-Commit-ID: 06598021a9f08188dab29ac956b2baa002a0ff85 + +commit 3d8ae7f235b96da604b08c44ae83420e367eeab4 +Author: Tim Rice +Date: Mon Sep 8 12:53:10 2025 -0700 + + modified: regress/rekey.sh + Fix for when building out of tree. + +commit 54abadd3f286efea0dbbdbfea8011d5e1e30c074 +Author: Darren Tucker +Date: Sun Sep 7 13:35:22 2025 +1000 + + Accept OpenSSL 4.0.0-dev versions. + + They seem to work, at least for now. + +commit 67a8bf4e4057597170bfa923fe2ce5bf90c43974 +Author: Maxim Khon +Date: Mon Aug 18 12:05:42 2025 +0000 + + Use SSH_TUN_COMPAT_AF on FreeBSD. + + Otherwise tun forwarding from other OSes fails as soon as the first IPv6 + message is sent by the other side (which is usually a Router Solicitation + ICMPv6 message which is sent as soon as the interface is up): all other + OS'es use SSH_TUN_COMPAT_AF or SSH_TUN_PREPEND_AF which effectively uses + OpenBSD AF_INET/AF_INET6 values. + +commit 3ca274e44cb2c2351376fc14e4c3e92ba4a8f87b +Author: Darren Tucker +Date: Fri Sep 5 21:32:30 2025 +1000 + + Check for nlist function. + + Check for nlist function presence before attenmpting to use it instead + of relying on the presence of the nlist.h header. Mac OS X, in particular + has the header, but only has the function in the 32bit libraries. + +commit ee32a36c62424f13907023595bfa8b23a528ced1 +Author: dtucker@openbsd.org +Date: Fri Sep 5 10:23:55 2025 +0000 + + upstream: Order includes as per KNF and add time.h. Removes diff + + vs portable. + + OpenBSD-Commit-ID: 38043f0bfa17c48ef6d1a744c2834b4405bc9311 + +commit 0ac179c9540e2b05b4c1194db69ce01306c253d3 +Author: dtucker@openbsd.org +Date: Fri Sep 5 10:17:21 2025 +0000 + + upstream: Order headers as per KNF. Removes diff vs portable. + + OpenBSD-Commit-ID: 4df519fd9fa13ce9653adf7a3d1076e20591d886 + +commit e80322284f3ee70b6b760a9f83179470d675e5ba +Author: dtucker@openbsd.org +Date: Fri Sep 5 10:01:35 2025 +0000 + + upstream: Order headers as per KNF. + + OpenBSD-Commit-ID: 7156b69b0364c68e181e0f6fa17c0f05c72e8670 + +commit bb8ac0515e68cab63db2d026eb60127185a3d2b8 +Author: Darren Tucker +Date: Fri Sep 5 20:39:16 2025 +1000 + + Resync header order with upstream. + +commit 024b694249482698b0c73d24da0eaec696fca8c8 +Author: Darren Tucker +Date: Fri Sep 5 20:37:04 2025 +1000 + + Resync header order with upstream. + +commit aed6a958bc108faab64bc2855d6ed93894cfc6ff +Author: Darren Tucker +Date: Fri Sep 5 20:30:20 2025 +1000 + + Sync includes with upstream. + +commit 22cfd2dd32f34f0cea218dd651f3aa9544b6e3b5 +Author: Darren Tucker +Date: Fri Sep 5 20:26:14 2025 +1000 + + Move ssh-pkcs11.h include to match upstream. + +commit b34c16bc4cac2962cc6a7517efbc4fed2c8a2d9a +Author: Darren Tucker +Date: Fri Sep 5 20:20:27 2025 +1000 + + Reorder includes to match upstream. + +commit 441a8fa9a0178704bce497bff92ca43fcf04bf7a +Author: dtucker@openbsd.org +Date: Fri Sep 5 09:58:08 2025 +0000 + + upstream: Order headers as per KNF. Removes diff vs portable. + + OpenBSD-Commit-ID: db72be57429418f6a4319bbe34c98fc103e11ce0 + +commit 19d6a7afb256c4afc571dbf56a013ef91cd9596f +Author: dtucker@openbsd.org +Date: Fri Sep 5 09:49:26 2025 +0000 + + upstream: Order headers as per KNF. Also removes diff vs + + -portable. + + OpenBSD-Commit-ID: 2061307dc938712e524bc9da48a52f545e43670e + +commit 932e9f200bd48b7568eb21ec456c67ec92d517e2 +Author: dtucker@openbsd.org +Date: Fri Sep 5 09:31:31 2025 +0000 + + upstream: Remove unused rmd160.h header. ripemd160 support was + + removed in 2017. + + OpenBSD-Commit-ID: 937fca21498b921adf6e04bac120f4a2e7975b3c + +commit f93de828b9b0f29bff51d38ea92d0759595ec30b +Author: Darren Tucker +Date: Fri Sep 5 20:07:16 2025 +1000 + + Create replacement nlist.h if needed. + + Remove #ifdef HAVE_NLIST_H wrapper. ok djm@ + +commit 6aac2beaa53467e83f6a137376b6dcf423ab6f6c +Author: Darren Tucker +Date: Fri Sep 5 19:55:20 2025 +1000 + + Create replacement endian.h if needed. + + Remove #ifdef HAVE_ENDIAN_H wrapper. ok djm@ + +commit a60721c894f0a2ce973876d0f55617e187e6fab1 +Author: Darren Tucker +Date: Fri Sep 5 19:52:48 2025 +1000 + + Add /* WITH_OPENSSL */ comments. + + Removes diffs vs upstream. + +commit c729a833298d9d55ffb22771cf1400dfdc640164 +Author: Darren Tucker +Date: Fri Sep 5 19:22:37 2025 +1000 + + Move sys/time.h include to match upstream. + +commit caa973dd06a7be43c29353b256c9a473f5ad9882 +Author: Darren Tucker +Date: Fri Sep 5 19:13:52 2025 +1000 + + Create replacement netgroup.h if needed. + + Remove #ifdef HAVE_NETGROUP_H wrapper. ok djm@ + +commit 7d30526b7df14d960a5de63d6af823ffdab86518 +Author: Darren Tucker +Date: Fri Sep 5 18:24:59 2025 +1000 + + Remove stray #endif left from previous. + +commit 4911f2600fdbb1959311bb1886bfe51f7dd4a74e +Author: Darren Tucker +Date: Fri Sep 5 18:08:51 2025 +1000 + + Create replacement libgen.h if needed. + + Remove #ifdef HAVE_LIBGEN_H wrapper. ok djm@ + +commit 65dcdb56f5daee519ec824ae17e64412d2492f90 +Author: Darren Tucker +Date: Fri Sep 5 18:05:15 2025 +1000 + + Create replacement sys/un.h if needed. + + Remove #ifdef HAVE_SYS_UN_H wrapper. ok djm@ + +commit 60334af5a908ac3b263d2ec696f9977e20b739cb +Author: Darren Tucker +Date: Fri Sep 5 18:03:55 2025 +1000 + + Reformat replacement header check one per line. + +commit cd9ba068e36b0f37374d2eba2d19dacc7ea9a167 +Author: Darren Tucker +Date: Fri Sep 5 17:55:33 2025 +1000 + + Create replacement time.h if needed. + + Remove #ifdef HAVE_TIME_H wrapper. ok djm@ + +commit ea586edbcbec7089f768ed682a79a399eaa1e5b1 +Author: Darren Tucker +Date: Fri Sep 5 17:50:18 2025 +1000 + + Create replacement sys/stat.h if needed. + + Remove #ifdef HAVE_SYS_STAT_H wrapper. ok djm@ + +commit 59b80707c6cf45230597a800e7d2ce6b00ce35b5 +Author: Darren Tucker +Date: Fri Sep 5 17:44:07 2025 +1000 + + Create replacement sys/time.h if needed. + + Remove #ifdef HAVE_SYS_TIME_H wrapper. ok djm@ + +commit 82fed5110fe09e9af258a8f5a2f92ffb397fff5b +Author: Darren Tucker +Date: Fri Sep 5 17:31:15 2025 +1000 + + Create replacement ifaddrs.h if needed. + + Remove #ifdef HAVE_IFADDRS_H wrapper. ok djm@ + +commit 53887d8ebc583b51e996cb2bdeb11e054d36343b +Author: Darren Tucker +Date: Fri Sep 5 17:27:43 2025 +1000 + + Create replacement util.h if needed. + + Remove #ifdef HAVE_UTIL_H wrapper. ok djm@ + +commit 5f09983d1e724097bd577097fb0f2c00c2436f21 +Author: Darren Tucker +Date: Fri Sep 5 17:24:50 2025 +1000 + + Create replacement paths.h if needed. + + Remove #ifdef HAVE_PATHS_H wrapper. ok djm@ + +commit d45b17dc5a0598dda2b11dc89598203408d2d59c +Author: Darren Tucker +Date: Fri Sep 5 17:17:52 2025 +1000 + + Create replacement poll.h if needed. + + Remove #ifdef HAVE_POLL_H wrapper. ok djm@ + +commit 9b2c5a2db0650e394597839ef00d797f57568937 +Author: Darren Tucker +Date: Fri Sep 5 17:06:14 2025 +1000 + + Fill in missing system header files. + + Create replacement header files inside openbsd-compat for common headers + that are missing on a given platform. Usually these are just empty, + but in some cases they'll include the equivalent file. This avoids + having to wrap those includes in '#ifdef HAVE_FOO_H' and reduces the + diff vs OpenBSD. + + If we create any such headers, add the path to includes. + + Initially just stdint.h, more to follow. + + ok djm@ + +commit f64701ca25795548a61614d0b13391d6dfa7f38c +Author: djm@openbsd.org +Date: Thu Sep 4 03:04:44 2025 +0000 + + upstream: repair test after changes to percent expansion of usernames + + on the commandline. + + Test more cases that should/shouldn't expand and lightly test + username validity checks. + + OpenBSD-Regress-ID: ad4c12c70bdf1f959abfebd1637ecff1b49a484c + +commit 45698669d49949868b1f3d13dfda1b7cb70060ad +Author: djm@openbsd.org +Date: Thu Sep 4 00:37:10 2025 +0000 + + upstream: unit tests for sshbuf_equals and sshbuf_dtourlb64; ok + + deraadt@ + + OpenBSD-Regress-ID: bab54e2d4caa813036a63ee67e92c93e6712a5b9 + +commit 4be445116f1b56f14254b98d8b132bb25777e160 +Author: djm@openbsd.org +Date: Thu Sep 4 00:34:17 2025 +0000 + + upstream: unit tests for a bunch of misc.c functions; ok deraadt@ + + OpenBSD-Regress-ID: 886cf142605405e777ee77a96b48694dc2e9235d + +commit e3699ff47df336f57da2e78188d0057f8368af56 +Author: djm@openbsd.org +Date: Thu Sep 4 00:32:31 2025 +0000 + + upstream: fix sshbuf_dtourlb64() to not choke on empty buffers; + + previously it incorrectly returned an error in this situation; ok deraadt + + OpenBSD-Commit-ID: e62773d6e8cb95a19aab54f0af0edbcd47b345c0 + +commit 8e85ad33cfcc71e03594e53f2e19d8ce2e27dcc6 +Author: djm@openbsd.org +Date: Thu Sep 4 00:31:49 2025 +0000 + + upstream: fix rtrim() function to not attempt to delete whitespace + + inside a string, just at the end. ok deraadt@ + + OpenBSD-Commit-ID: d44deaa43580cd88de978dd5509b14e905b67b84 + +commit 43b3bff47bb029f2299bacb6a36057981b39fdb0 +Author: djm@openbsd.org +Date: Thu Sep 4 00:30:06 2025 +0000 + + upstream: don't allow \0 characters in url-encoded strings. + + Suggested by David Leadbeater, ok deraadt@ + + OpenBSD-Commit-ID: c92196cef0f970ceabc1e8007a80b01e9b7cd49c + +commit 35d5917652106aede47621bb3f64044604164043 +Author: djm@openbsd.org +Date: Thu Sep 4 00:29:09 2025 +0000 + + upstream: Improve rules for %-expansion of username. + + Usernames passed on the commandline will no longer be subject to + % expansion. Some tools invoke ssh with connection information + (i.e. usernames and host names) supplied from untrusted sources. + These may contain % expansion sequences which could yield + unexpected results. + + Since openssh-9.6, all usernames have been subject to validity + checking. This change tightens the validity checks by refusing + usernames that include control characters (again, these can cause + surprises when supplied adversarially). + + This change also relaxes the validity checks in one small way: + usernames supplied via the configuration file as literals (i.e. + include no % expansion characters) are not subject to these + validity checks. This allows usernames that contain arbitrary + characters to be used, but only via configuration files. This + is done on the basis that ssh's configuration is trusted. + + Pointed out by David Leadbeater, ok deraadt@ + + OpenBSD-Commit-ID: e2f0c871fbe664aba30607321575e7c7fc798362 + +commit f38a552dc71f20df2544338099e3fe2563f1a9ca +Author: Damien Miller +Date: Wed Sep 3 09:42:39 2025 +1000 + + missing header + +commit cc4eb3d6943cb57e08ab3abbcf92644deb429e46 +Author: djm@openbsd.org +Date: Tue Sep 2 11:08:34 2025 +0000 + + upstream: simplify algorithm list functions using xextendf(); ok + + dtucker@ + + OpenBSD-Commit-ID: ffc5f8d0c25b95705a8a66c8b634f98d23bd92dc + +commit 8866d24cdd1d6e73bb3220b753f94e255c49ff96 +Author: djm@openbsd.org +Date: Tue Sep 2 11:04:58 2025 +0000 + + upstream: unit test for xextendf() + + OpenBSD-Regress-ID: ddb3b4db1a52dda23696b967470882fe2b9c3af7 + +commit 2f369d3fd0ff3715c2b32dff5cb35c0330272445 +Author: djm@openbsd.org +Date: Tue Sep 2 09:41:23 2025 +0000 + + upstream: fix comment on sshbuf_froms() - it *returns* an error + + code, the allocated buffer is passed via argument + + OpenBSD-Commit-ID: b2b0a76df71328f39c3e2ad941a4d87085d8335d + +commit 6fd93060bb2ec35a7f0bf96d1a74104bab49e017 +Author: djm@openbsd.org +Date: Tue Sep 2 09:40:19 2025 +0000 + + upstream: GssStrictAcceptor was missing from sshd -T output; fix + + OpenBSD-Commit-ID: 6014049ccfedc48a208e37d5488ade6bdc2d1c44 + +commit d94a9a8c54e9036961c1100c6f445c50ab9b6b40 +Author: Damien Miller +Date: Tue Sep 2 19:38:39 2025 +1000 + + portable-specific comment grammer/spelling fixes + +commit a0b095fa03d3c08d723a803ce25540fddd955c53 +Author: djm@openbsd.org +Date: Tue Sep 2 09:34:48 2025 +0000 + + upstream: grammar and typos in comments + + OpenBSD-Commit-ID: de954daffcd0147ce142d55e8a374810cd19d7ed + +commit 23a2bb750547a9a5251cbc44c5ceb1d05303befe +Author: Damien Miller +Date: Tue Sep 2 19:30:07 2025 +1000 + + replace remaining manual logging of __func__ + + Use the appropriate log macro that prepends the function name + (e.g. logit_f/debug2_f/etc). + +commit a9b0b69f15e63bc4e8c8b38e24ee85ea076a7e11 +Author: djm@openbsd.org +Date: Tue Sep 2 09:26:21 2025 +0000 + + upstream: replace remaining cases where we manually included __func__ + + in a debug or error log with the respective *_f log variant + + OpenBSD-Commit-ID: 46a280d78bcc0bc98f28e65a30b613366600328f + +commit 19f7cb39eecb4b8f768f37e8294dc3a9142e022b +Author: djm@openbsd.org +Date: Mon Sep 1 23:55:29 2025 +0000 + + upstream: test MaxStatups idempotency; ok dtucker@ + + OpenBSD-Regress-ID: b5d713c2709000fa5e41d82c0cf8627e13cb43f9 + +commit c357c4a1e626feba9a968b5f0cb832b989b2d433 +Author: djm@openbsd.org +Date: Thu Aug 21 05:55:30 2025 +0000 + + upstream: benchmark more diffie-hellman-group* KEXs + + use current KEX names, i.e. remove the "@openssh.com" where the KEX + has been standardised + + OpenBSD-Regress-ID: a67e9da4efd9a971d39cb2481093f836046f9b7f + +commit 9313233a735733821dfd170b70782fb7da492962 +Author: djm@openbsd.org +Date: Tue Sep 2 01:03:43 2025 +0000 + + upstream: fix previous + + OpenBSD-Commit-ID: 09d95dfb5e064a1d0e74afba8d77474cc1d110a4 + +commit 683d0abe596b069a896f1688f86256f1beeb0cdc +Author: djm@openbsd.org +Date: Mon Sep 1 23:53:16 2025 +0000 + + upstream: Make MaxStartups and PerSourceNetBlockSize first-match-wins + + as advertised. bz3859 reported by jan.v.hofmann; ok dtucker + + OpenBSD-Commit-ID: 08f7786f1b3b4a05a106cdbd2dc5f1f2d8299447 + +commit a9a3f025d76f06a6601e6e8d52b468ec467865d9 +Author: djm@openbsd.org +Date: Fri Aug 29 03:50:38 2025 +0000 + + upstream: remove experimental support for XMSS keys; + + ok deraadt markus + + OpenBSD-Commit-ID: 38eaf4df6189acad9e46eddf7cf32d7f6d07df35 + +commit 908e9d55139bed19ed87d6fec749974eb42702c6 +Author: caspar@openbsd.org +Date: Mon Aug 18 18:39:33 2025 +0000 + + upstream: ssh_config.5: say "post-quantum" instead of "post quantum + + safe", and rephrase the sentence to make it easier to read. + + Input djm@, input and OK deraadt@, OK dtucker@ + + OpenBSD-Commit-ID: c3ee4d1cafdcfc20cc0d2f086021efce4b19c075 + +commit ceca966bde4ab38b2434876416da12fe16747459 +Author: job@openbsd.org +Date: Mon Aug 18 09:16:36 2025 +0000 + + upstream: Delete unused accessor function + + OK dtucker@ + + OpenBSD-Commit-ID: 93b59ac088fb254e1189729ece5bb9656d6e810b + +commit 3ef1a87d0a29eac94f32371af628e81eb2e2d817 +Author: Damien Miller +Date: Mon Aug 18 17:00:26 2025 +1000 + + Fix pledge(2) special casing + + Unbreaks non-OpenBSD platforms + +commit 5e9ca80fe65e407428dc46ed45804724d08b91b7 +Author: Damien Miller +Date: Mon Aug 18 16:47:23 2025 +1000 + + Match version instead of groups in connect-bigconf + + The connect-bigconf makes a giant config file to test config passing + between the sshd subprocesses. Previously it used a bunch of "Match + group" lines to construct a large file. However checking group + membership can be expensive (e.g. if a large groups database is + present or if group lookup is remote via NSS). This could be slow + enough to exceed LoginGraceTime. + + This switches it to "Match version" which is just a string compare + and does just as well for making a giant nonsense config file. + +commit 6c84609e5f9ddd49e250d5cf190b2820dbeca178 +Author: Damien Miller +Date: Mon Aug 18 16:47:00 2025 +1000 + + depend + +commit 9184fa363687fcb5dac056b093fb3b8e9d327242 +Author: Damien Miller +Date: Mon Aug 18 16:45:15 2025 +1000 + + check for setsockopt IP_TOS in OpenBSD pledge + + OpenBSD has recently relaxed the pledge(2) sandbox to allow some + setsockopt options to be changed without the "inet" promise. + + This adds compatibility for OpenBSD that predates this relaxation. + +commit ae44cd74f3a4ac711152f50b2712803ccf785593 +Author: djm@openbsd.org +Date: Mon Aug 18 04:50:35 2025 +0000 + + upstream: cast + + OpenBSD-Commit-ID: d69bd2328513c2dcd99f4f346b77e2bd90cf1964 + +commit c2c8bae39380392449ac3297061cbfc486126ad5 +Author: djm@openbsd.org +Date: Mon Aug 18 04:38:21 2025 +0000 + + upstream: missing set_log_handler() call in ssh-auth.c, exposed after + + last commit + + OpenBSD-Commit-ID: 09f5c3cf33c18b8ad321edbf96c30ae3deada2b0 + +commit 056022261e6cf7eb65bbacac72afe5f4d5945f2c +Author: Damien Miller +Date: Mon Aug 18 14:22:32 2025 +1000 + + depend + +commit b7ee13fbbb4ebafcf71f29685f053ecb97d1bcef +Author: Damien Miller +Date: Mon Aug 18 14:22:18 2025 +1000 + + wrap SIGINFO in ifdef + +commit 289239046b2c4b0076c14394ae9703a879e78706 +Author: djm@openbsd.org +Date: Mon Aug 18 03:43:01 2025 +0000 + + upstream: Make ssh(1) and sshd(8) set IP QoS (aka IP_TOS, IPV6_TCLASS) + + continually at runtime based on what sessions/channels are open. + + Previously, ssh(1) and sshd(8) would pick a QoS value when they + were started and use it for the whole connection. This could + produce suboptimal choices for the QoS value, e.g. for multiplexed + sessions that started interactive but picked up a sftp client, + or sessions that moved large amounts of data via port forwarding. + + Now the QoS value will change to the non-interactive IPQoS whenever + a "non-interactive" channel is open; basically any channel that lacks + a tty other than agent forwarding. + + This is important now that the default interactive IPQoS is EF + (Expedited Forwarding), as many networks are configured to allow + only relatively small amounts of traffic of this class and they will + aggressively deprioritise the entire connection if this is exceeded. + + NB. because ssh(1) and sshd(8) now change IP_TOS/IPV6_TCLASS + continually via setsockopt(), this commit requires a recent pledge(2) + change that landed recently in the OpenBSD kernel. Please ensure + you have updated to a kernel from within the last two weeks before + updating OpenSSH. + + with job@ deraadt@ + + OpenBSD-Commit-ID: 325fc41717eecdf5e4b534bfa8d66817425b840f + +commit dc5147028ff19213a32281dad07bba02e58da3fa +Author: djm@openbsd.org +Date: Mon Aug 18 03:29:11 2025 +0000 + + upstream: SIGINFO handler for sshd(8) to dump active + + channels/sessions ok deraadt@ + + OpenBSD-Commit-ID: 9955cb6d157c6d7aa23a819e8ef61b1edabc8b7d + +commit f807a598c96be683d97810481e954ec9db6b0027 +Author: djm@openbsd.org +Date: Mon Aug 18 03:28:36 2025 +0000 + + upstream: SIGINFO handler for ssh(1) to dump active + + channels/sessions ok deraadt@ + + OpenBSD-Commit-ID: 12f88a5044bca40ef5f41ff61b1755d0e25df901 + +commit 9b61679d73a8a001c25ab308db8a3162456010cf +Author: djm@openbsd.org +Date: Mon Aug 18 03:28:02 2025 +0000 + + upstream: add channel_report_open() to report (to logs) open + + channels; ok deraadt@ (as part of bigger diff) + + OpenBSD-Commit-ID: 7f691e25366c5621d7ed6f7f9018d868f7511c0d + +commit 80b5ffd22abd4093201939e31d1ea6dc8cc7913a +Author: djm@openbsd.org +Date: Mon Aug 18 01:59:53 2025 +0000 + + upstream: make -E a no-op in sshd-auth. Redirecting logging to a + + file doesn't work in this program as logging already goes via the parent + sshd-session process. ok dtucker@ + + OpenBSD-Commit-ID: 73325b9e69364117c18305f896c620a3abcf4f87 + +commit 3a039108bd25ff10047d7fa64750ed7df10c717c +Author: Damien Miller +Date: Mon Aug 18 13:46:37 2025 +1000 + + allow some socket syscalls in seccomp sandbox + + Allow getsockname(2), getpeername(2) and getsockopt(2). + + Also allow setsockopt(2) but only IP_TOS and IPV6_TCLASS. + + Note that systems that use the older socketcall(2) mux syscall will + not have IP_TOS and IPV6_TCLASS allowlisted. On these platforms, + these calls will be soft-blocked (i.e. will fail rather than + terminate the whole process with a sandbox violation). + + Needed for upcoming IPQoS change; ok dtucker@ + +commit a00f5b02e171bc6d6fb130050afb7a08f5ece1d8 +Author: Damien Miller +Date: Mon Aug 18 13:44:53 2025 +1000 + + handle futex_time64 properly in seccomp sandbox + + Previously we only allowed __NR_futex, but some 32-bit systems + apparently support __NR_futex_time64. We had support for this + in the sandbox, but because of a macro error only __NR_futex was + allowlisted. + + ok dtucker@ + +commit 32deb00b38b4ee2b3302f261ea1e68c04e020a08 +Author: dtucker@openbsd.org +Date: Thu Aug 14 10:03:44 2025 +0000 + + upstream: Cast serial no for %lld to prevent compiler warnings on some + + platforms. + + OpenBSD-Commit-ID: afadd741622f16c6733d461c0d6053ed52868a57 + +commit 883886c959ecab152650e231335857eb3193c662 +Author: dtucker@openbsd.org +Date: Thu Aug 14 09:44:39 2025 +0000 + + upstream: Cast serial no for %lld to prevent compiler warnings on some + + platforms. + + OpenBSD-Commit-ID: 46c6063284d318f7e4dc922479a3e394c94b0588 + +commit fde5a4d2cd01bea700439fa6d5bbad88e65c99bd +Author: dtucker@openbsd.org +Date: Thu Aug 14 09:26:53 2025 +0000 + + upstream: Cast serial no for %lld to prevent compiler warnings on some + + platforms. + + OpenBSD-Commit-ID: 15644234b58abc9c6da2994f0422a5aa344a9e89 + +commit ab5074dfb614e3801fecbd376d8ed4cea613c629 +Author: sthen@openbsd.org +Date: Tue Aug 12 11:09:48 2025 +0000 + + upstream: fix typo, ok markus dtucker + + OpenBSD-Commit-ID: 8f223da7633752162c64a659c6cf55202703d870 + +commit 8b6c1f402feb9eb6438003a312d7ffe8d5669896 +Author: deraadt@openbsd.org +Date: Mon Aug 11 14:37:43 2025 +0000 + + upstream: Handle localtime_r() failure by return "UNKNOWN-TIME" + + which is only used in user-visible contexts. freebsd 288773 shows their + localtime_r() has failed at least once for unknown reason. discussed with djm + + OpenBSD-Commit-ID: 68f4c92d46b2578d4594b0ed940958d597fd61ac + +commit 0e1b8aa27f7c86d412c9e54ad9e2cae30d9ddab4 +Author: djm@openbsd.org +Date: Mon Aug 11 10:55:38 2025 +0000 + + upstream: ssh(1): add a warning when the connection negotiates a + + non-post quantum safe key agreement algorithm. + + Controlled via a new WarnWeakCrypto ssh_config option, defaulting + to on. This option might grow additional weak crypto warnings in + the future. + + More details at https://openssh.com/pq.html + + mostly by deraadt@ feedback dtucker@ ok deraadt@ + + OpenBSD-Commit-ID: 974ff243a1eccceac6a1a9d8fab3bcc89d74a2a4 + +commit 2ebc6384258b58ace0ad2adb2593744f62749235 +Author: djm@openbsd.org +Date: Wed Aug 6 23:44:09 2025 +0000 + + upstream: all state related to the ssh connection should live in + + struct ssh or struct packet_state; one static int escaped this rule, so move + it to struct packet_state now. + + ok millert tb + + OpenBSD-Commit-ID: bd6737168bf61a836ffbdc99ee4803468db90a53 + +commit 60b909fb110f77c1ffd15cceb5d09b8e3f79b27e +Author: dtucker@openbsd.org +Date: Wed Aug 6 11:22:53 2025 +0000 + + upstream: Improve sentence. ok djm@ + + OpenBSD-Commit-ID: 9c481ddd6bad110af7e530ba90db41f6d5fe2273 + +commit 9ffa98111dbe53bf86d07da8e01ded8c5c25456b +Author: djm@openbsd.org +Date: Wed Aug 6 04:53:04 2025 +0000 + + upstream: when refusing a certificate for user authentication, log + + enough information to identify the certificate in addition to the reason why + it was being denied. Makes debugging certificate authz problems a bit easier. + + ok dlg@ + + OpenBSD-Commit-ID: 4c4621b2e70412754b3fe7540af8f4bf02b722b1 + +commit 2a31009c36eb2da412c2784fe131fcb6ba800978 +Author: job@openbsd.org +Date: Tue Aug 5 09:08:16 2025 +0000 + + upstream: Use the operating system default DSCP marking for + + non-interactive traffic + + It seems the CS1 traffic class mark is considered ambiguous and therefore + somewhat unhelpful (see RFC 8622 for more considerations). But, the new + 'LE' scavenger class (also proposed in RFC 8622) offers high probability + of excessive delays & high packet loss, which would be inappropriate + for use with, for example, X11 forwardings. In fact, it is not known to + SSH what's appropriate because SSH is not aware of the content of what + passing through session forwardings. Therefore, no marking is appropriate. + Non-interactive traffic simply is best effort. + + OK djm@ deraadt@ + + OpenBSD-Commit-ID: db1da1a432ecd53fc28feb84287aedb6bec80b01 + +commit 6ebd472c391a73574abe02771712d407c48e130d +Author: djm@openbsd.org +Date: Tue Aug 5 04:00:15 2025 +0000 + + upstream: a bunch of the protocol extensions we support now have RFCs + + and I-Ds that are more complete and detailed than what we have in the + PROTOCOL.* files. Refer to these when possible instead of documenting them + here. + + OpenBSD-Commit-ID: 4fa5b0fcf5d5f24093d33d9e82c7ca4850d50d70 + +commit ec3465f59c651405e395092f3ad606f8992328d8 +Author: job@openbsd.org +Date: Thu Jul 31 11:23:39 2025 +0000 + + upstream: Deprecate support for IPv4 type-of-service (TOS) IPQoS + + keywords + + Type of Service (ToS) was deprecated in the late nineties and replaced + with the Differentiated Services architecture. Diffserv has significant + advantages for operators because this mechanism offers more granularity. + + OpenSSH switched its default IPQoS from ToS to DSCP values in 2018. + + IPQoS configurations with 'lowdelay', 'reliability', or 'throughput' will be + ignored and instead the system default QoS settings apply. Additionally, a + debug message is logged about the deprecation with a suggestion to use DSCP. + + with/OK deraadt@ sthen@ djm@ + + OpenBSD-Commit-ID: 40c8c0c5cb20151a348728703536af2ec1c754ba + +commit 65909fa114e7dd7511800db2b7bacb8774afe887 +Author: job@openbsd.org +Date: Thu Jul 31 09:38:41 2025 +0000 + + upstream: Set default IPQoS for interactive sessions to Expedited + + Forwarding (EF) + + Marking interactive session data with DSCP value EF (RFC3246, RFC3247) + helps inform the network on relative priority compared to other traffic. + This is especially useful for differentiated treatment over wireless media. + + Following the reconciled IETF Diffserv to IEEE 802.11 mappings (RFC 8325), + traffic marked with DSCP value EF maps to User Priority 6 in QoS Control, + in turn mapping to the high priority WMM AC_VO access category. + + OK djm@ + + OpenBSD-Commit-ID: aadda7b9da794d70d7c6b381a861a0610afce1b3 + +commit d1c6c67a50fc957010fa027c6ab970424e9b9142 +Author: Darren Tucker +Date: Sat Aug 2 14:49:00 2025 +1000 + + Disable security key tests for bigendian interop + +commit e85248df3f1073343da87a6b00512e6a1e4a863d +Author: Darren Tucker +Date: Sat Aug 2 12:51:42 2025 +1000 + + Comment out atime restore test. + + This works on filesystems mounted 'noatime', but on others the stat() + resets atime causing the test to fail. + +commit b1c4cedbee107dc611ce091f27ea9f1de28ee378 +Author: Darren Tucker +Date: Fri Aug 1 19:29:00 2025 +1000 + + Replace fbsd64ppc VM with physical host. + + Run 64bit bigendian interop test on NetBSD arm64be instead. + +commit 284abbed9a8d815b1ec5e96aff885d77e26537e7 +Author: dtucker@openbsd.org +Date: Wed Jul 30 10:17:13 2025 +0000 + + upstream: Plug leak in case where sigp is passed as NULL. Coverity CID + + 483725, ok djm@ + + OpenBSD-Commit-ID: 47cf7b399c84e102b670b9f97ab6926c9a7256b5 + +commit dc630e6d81be8aa495254839731e4f3521cf9e31 +Author: djm@openbsd.org +Date: Wed Jul 30 04:27:42 2025 +0000 + + upstream: unbreak WITH_OPENSSL=no builds, also allowing ed25519 + + keys to be used via PKCS#11 when OpenSSH is built without libcrypto. + + OpenBSD-Commit-ID: ecf26fdf7591bf2c98bac5136fbc36e0b59c3fc2 + +commit a5bec2cdfc4f38ddb6211809851aae29ba99a35a +Author: djm@openbsd.org +Date: Wed Jul 30 04:19:17 2025 +0000 + + upstream: fix variable name in disabled code + + OpenBSD-Commit-ID: 5612e979575d5da933c8b720d296423fd84392f5 + +commit 5e4bfe6c16924b1c21a733f3e218cfcba98e301e +Author: Damien Miller +Date: Sat Jul 26 19:19:46 2025 +1000 + + more ec/ed25519 fixing + +commit 2603098959eff55cbe188c3dfcbe5302808a80fc +Author: Damien Miller +Date: Sat Jul 26 14:27:53 2025 +1000 + + repair build for libcrypto without ed25519 support + +commit a729163c56ecc002c0cb04db56e7d86ceec2e8b0 +Author: djm@openbsd.org +Date: Sat Jul 26 01:53:31 2025 +0000 + + upstream: regression tests for Ed25519 keys in PKCS#11 tokens + + OpenBSD-Regress-ID: 50067c0716abfea3a526b4a0c8f1fe15e7665c0f + +commit 361ff0ca308ac02449e71689fc5ea72114db43db +Author: djm@openbsd.org +Date: Sat Jul 26 01:51:44 2025 +0000 + + upstream: Support ed25519 keys hosted on PKCS#11 tokens. + + Tested on Yubikeys and against SoftHSM2. + + feedback/ok tb@ + + OpenBSD-Commit-ID: 90ddb6529f2e12e98e8bba21d8592e60579ce2e4 + +commit 2b530cc3005a71c5ba6b712978872fc9c147439c +Author: djm@openbsd.org +Date: Fri Jul 25 13:06:07 2025 +0000 + + upstream: update our PKCS#11 API header to v3.0; + + feedback/ok tb@ + + OpenBSD-Commit-ID: e67fa6a26e515c2b1fb7b0d1519d138aafb3e017 + +commit 550d2a4a66c50f7641563a63b900761d99efb24a +Author: Damien Miller +Date: Fri Jul 25 23:04:33 2025 +1000 + + another attempt at fixing !EC builds + +commit ed1e370d84e9dc39bc31c19cca12222d991fdc6f +Author: dtucker@openbsd.org +Date: Fri Jul 25 11:50:45 2025 +0000 + + upstream: Don't snprintf a NULL since not all platforms support it. + + OpenBSD-Commit-ID: 6e0c268e40047e96fab6bc56dc340580b537183b + +commit eedab8db12d57c4f4583f6b60e48a4ce25b47b9c +Author: Damien Miller +Date: Fri Jul 25 16:21:43 2025 +1000 + + unbreak !EC builds + +commit 203f5ac6cfa0e257db7509d4bb830e8a4bba6211 +Author: djm@openbsd.org +Date: Thu Jul 24 06:04:47 2025 +0000 + + upstream: test code now needs to link ssh-pkcs11-client.c any time + + sshkey.c is included + + OpenBSD-Regress-ID: 9d07188eae9a96801c3150b3433bb220626d4443 + +commit 33b4f05c8ddab24aa6c47afb313b8cbd0d4b77f4 +Author: Damien Miller +Date: Fri Jul 25 12:47:17 2025 +1000 + + update clang-16 -> clang-19 + +commit 03e9e993ef1ef5accc6457152278cab5988f9b3d +Author: Damien Miller +Date: Fri Jul 25 12:46:59 2025 +1000 + + include ssh-pkcs11-client.o as common dep + +commit 2f5269938a8e4769f484c9d45419a86529078ede +Author: Damien Miller +Date: Fri Jul 25 12:46:10 2025 +1000 + + remove vestigial stub + +commit bf33a73c40522ce60961d4fff316a7187fb06ca0 +Author: djm@openbsd.org +Date: Thu Jul 24 23:27:04 2025 +0000 + + upstream: this should include stdlib.h explicitly + + OpenBSD-Commit-ID: 1c0cc5c3838344b33ae4ab7aa62c01530357bf29 + +commit 9f8ccc3b81b53324cc489f3fe00f03c329c0acb2 +Author: djm@openbsd.org +Date: Thu Jul 24 06:59:51 2025 +0000 + + upstream: less stale reference to PKCS#1 1.5 hash OIDs; feedback + + from tb@ + + OpenBSD-Commit-ID: 9fda77978491a130a7b77d87d40c79277b796721 + +commit 1641ab8744f500f55f12155d03f1a3116aaea374 +Author: djm@openbsd.org +Date: Thu Jul 24 06:12:08 2025 +0000 + + upstream: factor out encoding of a raw ed25519 signature into its + + ssh form into a separate function + + OpenBSD-Commit-ID: 3711c6d6b52dde0bd1f17884da5cddb8716f1b64 + +commit a8c0e5c871c0c7ee5ae93e353b1499a53c09c71d +Author: djm@openbsd.org +Date: Thu Jul 24 05:44:55 2025 +0000 + + upstream: Help OpenSSH's PKCS#11 support kick its meth habit. + + The PKCS#11 code in OpenSSH used the libcrypto public key method API + (e.g. the delightfully named RSA_meth_free()) to delegate signing + operations to external keys. This had one advantage - that it was + basically transparent to callers, but also had a big disadvantage - + that we'd manually have to track the method implementations, their + state and their relationships to the underlying PKCS#11 objects. + + This rips this out and replaces it with explicit delegation to + PKCS#11 code for externally hosted keys via the ssh-pkcs11-helper + subprocess. This is very similar to how we handle FIDO keys in + OpenSSH (i.e. via ssh-sk-helper). All we need to track now is a + much simpler mapping of public key -> helper subprocess. + + Kicking our libcrypto meth dependency also makes it much easier + to support Ed25519 keys in PKCS#11, which will happen in a subsequent + commit. + + feedback / ok tb@ + + OpenBSD-Commit-ID: a5a1eaf57971cf15e0cdc5a513e313541c8a35f0 + +commit 259c66aebe4e1f9d60e548f728ff74083bcccddf +Author: Darren Tucker +Date: Thu Jul 24 22:02:49 2025 +1000 + + Remove DEBUG_ACTIONS variable. + + If needed it can be set in github if needed. + +commit 40fb2dc4ece76c8f0c624d90a17bc1bbf47f3729 +Author: djm@openbsd.org +Date: Wed Jul 23 05:07:19 2025 +0000 + + upstream: add a ssh_config RefuseConnection option that, when + + encountered while processing an active section in a configuration file, + terminates ssh(1) with an error message that contains the argument to the + option. + + This may be useful for expressing reminders or warnings in config + files, for example: + + Match host foo + RefuseConnection "foo is deprecated, use splork instead" + + ok djg + + OpenBSD-Commit-ID: 5b0072fcd08ad3932ab21e27bbaa66b008d44237 + +commit defc806574d2256036d69a291caf0f3484844de6 +Author: miod@openbsd.org +Date: Sat Jul 12 05:28:33 2025 +0000 + + upstream: Add missing inter-library dependencies to LDADD and + + DPADD. ok tb@ deraadt@ + + OpenBSD-Commit-ID: a05e13a7e2c0b65bb4b47184fef731243431c6ff + +commit e6805e2a6b33e001e1a7257b85ab779fd592a578 +Author: Jan Tojnar +Date: Thu May 18 16:30:35 2023 +0200 + + Add gnome-ssh-askpass4 for GNOME 40+ + + GTK 3 has been in maintenance mode for a while now, and it is on the road + to being abandoned. As a result, the dialogue looks out of place on modern + systems. + + We could port it to GTK 4 but without the program being registered as an + application (i.e. having a .desktop file), GNOME Shell would ask for + permission to grab input every time. + + Let’s instead use the GNOME Shell’s native prompt through the unstable + Gcr API. + +commit f9dc519259804702cab0fa0ca8b193a360e3ec38 +Author: Damien Miller +Date: Fri Jul 11 17:20:27 2025 -0700 + + let ga_init() fail gracefully if getgrouplist does + + Apparently getgrouplist() can fail on OSX for when passed a non-existent + group name. Other platforms seem to return a group list consisting of + the numeric gid passed to the function. + + This makes ga_init() handle this failure case gracefully, where it will + return success but with an empty group list array. + + bz3848; ok dtucker@ + +commit f01a899b92ab8c5e6ff71214658bd09636c47e87 +Author: djm@openbsd.org +Date: Fri Jul 11 23:26:59 2025 +0000 + + upstream: add a "Match Group NoSuchGroup" to exercise groupaccess.c + + OpenBSD-Regress-ID: 7ff58e6f0eb21eb9064dd0cfa78c3b6f34b5f713 + +commit 1052fa62b35e0bb25b0c1efb9fdd7870e4a68ab6 +Author: Damien Miller +Date: Fri Jul 11 15:36:49 2025 -0700 + + more diagnostics when getgrouplist fails + +commit eddd1d2daa64a6ab1a915ca88436fa41aede44d4 +Author: djm@openbsd.org +Date: Fri Jul 4 09:51:01 2025 +0000 + + upstream: Fix mistracking of MaxStartups process exits in some + + situations. At worst, this can cause all MaxStartups slots to fill and sshd + to refuse new connections. + + Diagnosis by xnor; ok dtucker@ + + OpenBSD-Commit-ID: 10273033055552557196730f898ed6308b36a78d + +commit c971f3d93efe4c00d73b276cdbab66e7c66c9b5c +Author: Darren Tucker +Date: Sat Jul 5 20:50:50 2025 +1000 + + Add include for gssapi definitions. + + Patch from dbelyavs at redhat.com via bz#3846. + +commit 007b69f21cf9e64125b241d4411a5e47f5028aa8 +Author: djm@openbsd.org +Date: Fri Jul 4 07:52:17 2025 +0000 + + upstream: add a regress test for configurations > 256KB + + mostly by Dmitry Belyavskiy + + OpenBSD-Regress-ID: fcedb249e4cf2447e078a839877f99730ee79024 + +commit 0cf38d74463bcf80510e7fd1b3d9328e7d91eb00 +Author: djm@openbsd.org +Date: Fri Jul 4 07:47:35 2025 +0000 + + upstream: the messaging layer between sshd-session and sshd-auth had a + + maximum message size of 256KB. Some people apparently have configurations + larger than this and would hit this limit. + + Worse, there was no good logging that could help diagnose what was + going wrong. + + So this bumps the maximum message size to 4MB and implements an early + check (usable via the sshd -t test mode) that will report it to the + user where it is hopefully more visible. + + bz3808, reported by Dmitry Belyavskiy, ok dtucker@ + + OpenBSD-Commit-ID: 69c303fb68cbd1a4735936835d67a71e7b57f63b + +commit fd10cea0f16e928ae2b52fbeadccd475d0438eb4 +Author: djm@openbsd.org +Date: Fri Jul 4 00:17:55 2025 +0000 + + upstream: mux: fix incorrect return value check in local forward + + cancellation + + channel_cancel_lport_listener() returns 1 on success and 0 on failure. + The previous code incorrectly checked for `== -1`, a value the function + never returns, so failure was not detected and the "port not found" + error message was never shown when cancelling dynamic or local port + forwards. + + From: Boris Tonofa + + OpenBSD-Commit-ID: 3e9d2252a4d0bd318d4f25e2b518afb44acea170 + +commit 29cf521486bf97ab9de5b9b356f812107e0671bc +Author: Damien Miller +Date: Wed Jul 2 13:47:38 2025 +1000 + + wrap some autoconf macros in AC_CACHE_CHECK + + This allows skipping/overriding the OSSH_CHECK_CFLAG_COMPILE and + OSSH_CHECK_CFLAG_LINK macros used to discover supported compiler + or linker flags. E.g. + + $ ./configure ossh_cv_cflag__fzero_call_used_regs_used=no + [...] + checking if cc supports compile flag -ftrapv and linking succeeds... yes + checking if cc supports compile flag -fzero-call-used-regs=used and linking succeeds... (cached) no + checking if cc supports compile flag -ftrivial-auto-var-init=zero... yes + + Patch from Colin Watson, ok dtucker@ + +commit b28e91aff80fd24341de8cb3c34dc454d6b75228 +Author: dtucker@openbsd.org +Date: Sun Jun 29 08:20:21 2025 +0000 + + upstream: Add shebang path to askpass script. Required for exec on + + some platforms (musl, probably others). + + OpenBSD-Regress-ID: 35cdeed12ae701afcb812f800c04d817325cd22a + +commit 83d3ffc0fc0f5e4473ab43f0d42a1cf9497ce0b5 +Author: dtucker@openbsd.org +Date: Sun Jun 29 05:35:00 2025 +0000 + + upstream: Check dropbear server version for required features. + + Dropbear added the '-D' flag in version 2025.87. We need that for the + dropbear-server test, so skip on older versions. + + OpenBSD-Regress-ID: 9db0b84edd54d3c00ab17db1dc6d62af4644c550 + +commit 0b17d564cfae82f2a52e9b4d588657da47ea4e43 +Author: Darren Tucker +Date: Sun Jun 29 14:34:48 2025 +1000 + + Encrypt temporary password we're setting. + + Now that we want to actually use the random password for tests, we need + to correctly encrypt it, instead of just setting it to a random string + that's not the "locked" value. + +commit 700205bd861c25cc7564010cf63d984d8db5098a +Author: Darren Tucker +Date: Sun Jun 29 11:27:17 2025 +1000 + + Fix env again. + +commit 223a1beac7b7be9252f69055781c9c15f4d8a607 +Author: Darren Tucker +Date: Sun Jun 29 11:24:42 2025 +1000 + + Move env again. + +commit d32614b448528ac08a65caac323a34b4f559a204 +Author: Darren Tucker +Date: Sun Jun 29 11:22:00 2025 +1000 + + Move env to where it (hopefully) belongs. + +commit 8a9384de483b8fb69a800e0347273686a5715fc3 +Author: Darren Tucker +Date: Sun Jun 29 11:14:18 2025 +1000 + + Enable password tests on Github ephemeral VMs. + +commit bcfe7340d9b622ecd978c87dbf885c8b5a503ca2 +Author: dtucker@openbsd.org +Date: Sat Jun 28 13:34:08 2025 +0000 + + upstream: Add simple regression test for dropbear as a server. + + OpenBSD-Regress-ID: 7abe1f6607d0cd49839918aade8f135d2462d389 + +commit 838d5ec4b12fb519ed9db76e5beccf11b7ee212f +Author: dtucker@openbsd.org +Date: Tue Jun 24 12:28:23 2025 +0000 + + upstream: Add simple test for password auth. Requires some setup + + so does not run by default. + + OpenBSD-Regress-ID: d5ded47a266b031fc91f99882f07161ab6d1bb70 + +commit 57fb460165ae3b2d591f2468d7fe13cc1abda26d +Author: djm@openbsd.org +Date: Tue Jun 17 01:24:32 2025 +0000 + + upstream: add RCS ID + + OpenBSD-Regress-ID: 6e30094e3bf0a1c65efb75c67a87093304a3e619 + +commit 688fa02728f2efbf18388bc1a8e94e7ba7ee4f11 +Author: djm@openbsd.org +Date: Tue Jun 24 09:22:03 2025 +0000 + + upstream: make "Match !final" not trigger a 2nd pass ssh_config + + parsing pass (unless hostname canonicalisation or a separate "Match final" + does). bz3843 + + ok dtucker@ + + OpenBSD-Commit-ID: ce82b6034828888f0f3f1c812e08f5e87400d802 + +commit 5ba8391d697740a838fd8811434f707f0e079baa +Author: djm@openbsd.org +Date: Thu Jun 19 05:49:05 2025 +0000 + + upstream: better debug diagnostics when loading keys. Will now list + + key fingerprint and algorithm (not just algorithm number) as well as making + it explicit which keys didn't load. + + OpenBSD-Commit-ID: ee3e77a0271ab502e653922c6d161b1e091f8fee + +commit b360f3a675e24b0dbb2ec30d985e3b6756996c0d +Author: djm@openbsd.org +Date: Tue Jun 17 01:20:17 2025 +0000 + + upstream: whitespace + + OpenBSD-Commit-ID: 6e96814bcf70d0edbb0749ec61cc4fd8707f286d + +commit ad38ec5f1b6768944d64ed7709da8706538b5509 +Author: djm@openbsd.org +Date: Tue Jun 17 01:19:27 2025 +0000 + + upstream: fix leak on error path; Coverity CID 481976 + + OpenBSD-Commit-ID: 963dba2c804e2fd8efea2256092899874d0dbc7b + +commit 5f761cdb2331a12318bde24db5ca84ee144a51d1 +Author: Darren Tucker +Date: Tue Jun 17 21:46:37 2025 +1000 + + Update obsd tests to use current images. + +commit 1e8347e3543a415067ccc556aefea97656ecafb7 +Author: Damien Miller +Date: Tue Jun 17 09:48:47 2025 +1000 + + add sshd-auth to RPM spec files + +commit dd800444943bd64913507f6005586136d49f63db +Author: dtucker@openbsd.org +Date: Mon Jun 16 09:09:42 2025 +0000 + + upstream: Limit each moduli size to a max of 100 entries. + + OpenBSD-Commit-ID: 747219d54565030ff7c45298b9f5e971801f6cb2 + +commit 05f7bf46d1e2c101e9cbdd3df2ccee484bed969f +Author: dtucker@openbsd.org +Date: Mon Jun 16 09:07:08 2025 +0000 + + upstream: Now that ssh-keygen defaults to the maximum memory for + + moduli generation we no longer need to run it twice to get enough. Use mkdir + -p instead of a conditional, which allows "make -jN" to work without error. + + OpenBSD-Commit-ID: c2eb57285424f819f9520fa33e0d6d3c4a361a5e + +commit df3f903d616763a105570610a616dacf0f83438e +Author: dtucker@openbsd.org +Date: Mon Jun 16 09:02:19 2025 +0000 + + upstream: Fix overflow check in sshbuf_dup_string. It's already + + constrained by SSHBUF_SIZE_MAX, but still worth fixing the check. Patch from + afonot via github PR#573, with & ok djm@ + + OpenBSD-Commit-ID: 438888498e66472fc6a48133196d6538d27bff18 + +commit 80916d0d3794e2f92dd6998d7c45daba484e4f18 +Author: dtucker@openbsd.org +Date: Mon Jun 16 08:53:04 2025 +0000 + + upstream: Plug mem leak. Patch from afonot via github PR#574, ok djm@ + + OpenBSD-Commit-ID: 65619f14ef206028ce39bc31f704b832a0609688 + +commit bd1bd7e8296aa51a4b3958cef2fbb17894ba94e9 +Author: dtucker@openbsd.org +Date: Mon Jun 16 08:49:27 2025 +0000 + + upstream: Save return value from sshbuf_len instead of calling it + + multiple times. Fixes Coverity CID 470521. + + OpenBSD-Regress-ID: 356b8b43c8a232deaf445c1ff7526577b177a8e9 + +commit 2827b6ac304ded8f99e8fbc12e7299133fadb2c2 +Author: dtucker@openbsd.org +Date: Fri Jun 13 07:35:14 2025 +0000 + + upstream: Plug leak. Coverity CID 405058. + + OpenBSD-Regress-ID: 7fb2fce68d2cb063cdb94d5d66f84fa3a2902792 + +commit 9cdc72b829e9f0e24dedc533cbe87291d8a88c9e +Author: dtucker@openbsd.org +Date: Fri Jun 13 07:23:07 2025 +0000 + + upstream: Remove dead code flagged by Coverity CID 307783. ok djm@ + + OpenBSD-Regress-ID: e579f5ec2fd2eb2fe2bad654d16f2ba655a3e035 + +commit 930a45ee759728c8ba711c45a2a985b8191bd297 +Author: dtucker@openbsd.org +Date: Thu Jun 12 10:09:39 2025 +0000 + + upstream: Set user, host and path to NULL immediately before calling + + parse_user_host_path in tests. This ensures that we don't accidentally use + the previous value if the function under test doesn't set them Also fixes + Coverity CIDs 405056 405065 405066. + + OpenBSD-Regress-ID: 43678ff59001712f32214fe303b1c21c163c2960 + +commit 2314d87f9b8b430532111fd6e5e8df0cf9068c9c +Author: dtucker@openbsd.org +Date: Thu Jun 12 09:26:57 2025 +0000 + + upstream: Plug mem leak on error path here too. + + Coverity CID 307781. + + OpenBSD-Regress-ID: 18e053d9b661fbb4227d3db03172077c1216bb2e + +commit 567ef4e7ddc5c1e7a461560963a1dc759669821d +Author: dtucker@openbsd.org +Date: Thu Jun 12 09:19:43 2025 +0000 + + upstream: Plug mem leak on error path. + + Coverity CID 307776. + + OpenBSD-Regress-ID: c44246690973e1b8643e51079a2faa7ace26490c + +commit 5d415897ac04e237f1fa73b9dcb9ba8fb3ac812b +Author: dtucker@openbsd.org +Date: Wed Jun 11 13:27:11 2025 +0000 + + upstream: Remove dead code ternary. We always report at least + + KB/s, so B/s is never used. Coverity CID 291809, ok djm@ + + OpenBSD-Commit-ID: a67c5bcc9e19c8965bfeace0e337b13660efa058 + +commit 4b3d27032ba88dd089b721f3bbe3e4a8d23b4ae1 +Author: dtucker@openbsd.org +Date: Wed Jun 11 13:24:05 2025 +0000 + + upstream: Improve termination condition of while loop to compare + + size_t's. Assuming read() does what it's supposed to this shouldn't matter, + but should be more robust. Flagged by Coverity CID 470514, ok djm@ + + OpenBSD-Commit-ID: d7b5ad60feb797b3464964b9ea67fd78fb9d6cc6 + +commit 5530e5f83b3cd3425ea3dbab02da15140befdd91 +Author: Darren Tucker +Date: Tue Jun 10 18:40:56 2025 +1000 + + Replace Windows 2019 runners with 2025 ones. + + The windows-2019 runners are being decomissioned. + +commit a22ff3c6f11edd00c19981f9cb85d3b25d305a56 +Author: Darren Tucker +Date: Wed Jun 4 18:33:52 2025 +1000 + + Disable _FORTIFY_SOURCE during snprintf test. + + Prevents mistakenly detecting snprintf as broken on FreeBSD 15 with + _FORTIFY_SOURCE enabled. bz#3809, patch from jlduran at gmail.com + +commit 203bb886797677aa5d61b57be83cfdc1b634bc9c +Author: dtucker@openbsd.org +Date: Mon Jun 2 14:09:34 2025 +0000 + + upstream: Fix x11_channel_used_recently() to return true when channel + + has been used within the last second, instead of more than a second ago. + Should fix ~5s delay on X client startup when ObscureKeystrokeTiming is + enabled. bz#3820, ok (& sigh) djm@ + + OpenBSD-Commit-ID: b741011e81fb3e3d42711d9bd3ed8a959924dee4 + +commit dc6c134b48ba4bcfadedcea17b4eddac329601d9 +Author: dtucker@openbsd.org +Date: Thu May 29 13:27:27 2025 +0000 + + upstream: When there's more than one x11 channel in use, return + + lastused of most recently used x11 channel instead of the last one found. ok + djm@ + + OpenBSD-Commit-ID: 94a72bf988d40a5bae2e38608f4e117f712569fe + +commit 73ef0563a59f90324f8426c017f38e20341b555f +Author: djm@openbsd.org +Date: Sat May 24 11:41:51 2025 +0000 + + upstream: replace xmalloc+memset(0) with xcalloc(); from AZero13 via + + GHPR417 + + OpenBSD-Commit-ID: 921079436a4900325d22bd3b6a90c8d0d54f62f8 + +commit 3a61f5ed66231881bee432c7e7c6add066c086af +Author: djm@openbsd.org +Date: Sat May 24 09:46:16 2025 +0000 + + upstream: fix punctuation around host key fingerprints to make them + + easier to copy and paste. + + Patch from Till Maas via GHPR556; ok dtucker@ + + OpenBSD-Commit-ID: c0100182a30b6925c8cdb2225b18140264594b7b + +commit b12d4ab1e16f57c6c348b483b1dbdd4530aaaddd +Author: dtucker@openbsd.org +Date: Sat May 24 08:13:29 2025 +0000 + + upstream: Replace strncmp + byte count with strprefix in Penalty + + config parsing. ok kn@, djm@ + + OpenBSD-Commit-ID: 34a41bb1b9ba37fb6c7eb29a7ea909547bf02a5a + +commit a356d978e30dd9870c0b3a7d8edca535b0cd2809 +Author: dtucker@openbsd.org +Date: Sat May 24 08:09:32 2025 +0000 + + upstream: Make the display number check relative to + + X11DisplayOffset. + + This will allows people to use X11DisplayOffset to configure much higher + port ranges if they really want, while not changing the default behaviour. + Patch from Roman Gubarev via github PR#559, ok djm@ + + OpenBSD-Commit-ID: e0926af5dc0c11e364452b624c3ad0cda88550b5 + +commit e18983d03ab969e2f12485d5c0ee61e6d745a649 +Author: Darren Tucker +Date: Sat May 24 17:20:57 2025 +1000 + + Remove progressmeter.o from libssh.a. + + It's now explicitly included by the binaries that need it (scp & sftp). + bz#3810, patch from jlduran at gmail.com + +commit f8967045ad9d588bc11426642070bf8549065e62 +Author: dtucker@openbsd.org +Date: Sat May 24 06:50:28 2025 +0000 + + upstream: Null out keys between test runs. + + BENCH_START and BENCH_FINISH are actually a while() loop in disguise, + so if sshkey_generate does not reset the key pointer on failure the test + may incorrectly pass. It also confuses Coverity (CID 551234). + + OpenBSD-Regress-ID: bf4d32079fc6df6dce1f26c2025f4ed492f13936 + +commit a26091ecdb2a3d72b77baf3c253e676a3c835a24 +Author: djm@openbsd.org +Date: Sat May 24 04:41:12 2025 +0000 + + upstream: add some verbosity + + OpenBSD-Regress-ID: 11c86cda4435b5f9ab6172c4742b95899666c977 + +commit 484563ec70e30472ab4484d49bca9a83771d785c +Author: djm@openbsd.org +Date: Sat May 24 04:41:03 2025 +0000 + + upstream: use start_ssh_agent() to ensure we get logging + + add some verbosity + + OpenBSD-Regress-ID: a89bf64696b9fb1b91be318e6b8940c9ab21c616 + +commit e3c58113ebb3397b252ff26e0e94f726b7db7a8a +Author: djm@openbsd.org +Date: Sat May 24 04:40:37 2025 +0000 + + upstream: add a start_ssh_agent() function that sets up an agent + + with logging + + OpenBSD-Regress-ID: 7f9f30f9c64acbd4b418a5e1a19140cc988071a8 + +commit 3de011ef7a761751afe28ac7ef97fe330d784595 +Author: dtucker@openbsd.org +Date: Sat May 24 06:43:37 2025 +0000 + + upstream: Plug leak of startup_pollfd in debug and child paths. + + Coverity CID 405024, ok djm@ + + OpenBSD-Commit-ID: db46047229253e9c4470c8bbf5f82706ac021377 + +commit d0245389bc55f16082cadd0a39dda5af1c415dfa +Author: Darren Tucker +Date: Sat May 24 17:11:38 2025 +1000 + + ssh-keygen changes were fixup'ed into single commit. + +commit 140bae1df2b7246bb43439d039bf994159973585 +Author: Marco Trevisan (Treviño) +Date: Mon Sep 30 13:14:11 2024 +0200 + + auth-pam: Check the user didn't change during PAM transaction + + PAM modules can change the user during their execution, in such case ssh + would still use the user that has been provided giving potentially + access to another user with the credentials of another one. + + So prevent this to happen, by ensuring that the final PAM user is + matching the one that initiated the transaction. + +commit 216824172724a50a4a75439fb2b4b8edccf5b733 +Author: dtucker@openbsd.org +Date: Sat May 24 03:37:40 2025 +0000 + + upstream: Remove ssh-keygen's moduli screen -Omemory option. + + This vaguely made sense 20 years ago, but these days you'd be hard + pressed to *find* a machine small enough to not support the maximum + (127MB), and no one is screening moduli on such machines anyway, + so just use the max. This also fixes Coverity CID 470522 by deleting + code in question. "kill it with fire" djm@. + + OpenBSD-Commit-ID: 39036aa406a99f0a91923aa3a96afff1205558e6 + +commit f5cd14e81fa29b4924959cb2e1f9c206aae2d502 +Author: dtucker@openbsd.org +Date: Sat May 24 02:33:33 2025 +0000 + + upstream: Fix compile error on 32bit platforms. + + Spotted by & ok tb@ + + OpenBSD-Commit-ID: cbcf518247886f3c7518fc54cb3bd911ffc69db7 + +commit eccc15014fe146e8590568e6737a3097bfac3415 +Author: dtucker@openbsd.org +Date: Sat May 24 02:01:28 2025 +0000 + + upstream: Use pointer from strprefix in error message, + + missed in previous. + + OpenBSD-Commit-ID: d2cdec6cf0fcd4b0ee25e4e3fad8bc8cf0ee657d + +commit 91903511d0597c3bea218167f9ca5a176fa0dc20 +Author: dtucker@openbsd.org +Date: Fri May 23 12:52:45 2025 +0000 + + upstream: Replace strncmp and strncasecmp with hand-counting bytes + + with strprefix. nits lucas@, ok lucas@ djm@ + + OpenBSD-Commit-ID: f0888807f151ea2bdaf6fed36303ae81f259d1d4 + +commit 0c64d69e4e24a3ab06f7922ef389e7399c4dfb88 +Author: dtucker@openbsd.org +Date: Fri May 23 11:54:50 2025 +0000 + + upstream: Include stdint.h for UINT32_MAX. + + OpenBSD-Commit-ID: edc29ed67e8bd03bac729d9b4849066d1d3a8cb9 + +commit 3e11478f585408888defa56fa47e8dc6567378d0 +Author: dtucker@openbsd.org +Date: Fri May 23 11:25:35 2025 +0000 + + upstream: Ensure args to nh_update() fit within uint32, which it + + should always anyway. Placates Coverity CID 470520. While there, fix the + upstream URL. ok djm@ + + OpenBSD-Commit-ID: 2478e89fde089a49fa02f9faf6287d35959c9f92 + +commit f097d7bd07da4634c1a723d1dc4fcf56e7d0e147 +Author: dtucker@openbsd.org +Date: Fri May 23 09:26:25 2025 +0000 + + upstream: Don't leak the args list. Coverity CIDs 481569 & 481570, + + ok job@ tb@. + + OpenBSD-Commit-ID: becabcd00513d13d1435b68b7ccffa7151b72393 + +commit a4ea7f6042f25b41061a83445016a1ea4f470f7b +Author: dtucker@openbsd.org +Date: Fri May 23 08:40:13 2025 +0000 + + upstream: Explictly set LC_ALL=C on each sort invocation. + + Remove it from sshd_config (where it could be overridden by shell startup + scripts, eg on macos-15) causing random test failures. with & ok djm@ + + OpenBSD-Regress-ID: ad0a6678964784096e9a9e6d15ead36beed92f18 + +commit 7674c03caed80cb3565d14690c92068a14051967 +Author: Darren Tucker +Date: Fri May 23 16:39:18 2025 +1000 + + Allow setting LTESTS in repo variables. + +commit d8b5bd36078e5b6d78da4633f0cc9b90ffda8b50 +Author: Darren Tucker +Date: Fri May 23 16:26:20 2025 +1000 + + Rename debugging variable RUN_ONLY_TEST. + + to RUN_ONLY_TARGET_CONFIG to make it more obvious what it matches. + +commit a79a2c1190bd3124da21d9e1582dd94877c7f972 +Author: Darren Tucker +Date: Fri May 23 16:11:48 2025 +1000 + + chown regress logs before uploading. + +commit 24889a33071086b6f1f62568b0c2bd0a4955ac49 +Author: dtucker@openbsd.org +Date: Fri May 23 01:14:35 2025 +0000 + + upstream: Import regenerated moduli. + + OpenBSD-Commit-ID: 07e29dc891e29b31e03e2e5493658b4a9ac19431 + +commit 4b8bee62d72ffb3c419c9ead6c9fb1a586283868 +Author: deraadt@openbsd.org +Date: Fri May 23 00:40:45 2025 +0000 + + upstream: use "const char * const" for malloc_options here also + + OpenBSD-Commit-ID: 869715b9c7e1dd5b85efd07814e7e53f0286eea2 + +commit 6629eee21ca9d0a597a04dcac744a1ad882f912e +Author: dtucker@openbsd.org +Date: Thu May 22 12:14:19 2025 +0000 + + upstream: Adjust debug message to prevent (unsigned) integer overflow. + + Fixes Coverity CID 481110, ok djm@ + + OpenBSD-Commit-ID: 26178bf3b812707fb498ea85d076cadd1f2eb686 + +commit 7acb70e05e9977ceca7b33df84ceaea337b1efef +Author: bluhm@openbsd.org +Date: Thu May 22 04:34:18 2025 +0000 + + upstream: Fix OpenBSD RCS ID typos. from Andrius V + + OpenBSD-Regress-ID: 5c03a2ef5323969fc4978f2eec4f1a25c48c572a + +commit 2b2a7a2a0d70023b439080bb2770ff36522dbea8 +Author: Darren Tucker +Date: Thu May 22 22:09:48 2025 +1000 + + Remove debug change accidentally commited. + + Fixes Coverity CID 481160. + +commit 450a8a1df1577ddbe68fe8da1fb8514d3781ef32 +Author: Darren Tucker +Date: Thu May 22 21:16:37 2025 +1000 + + Collect all of regress dir on failure. + + This may allow us to sort through its entrails and determine the cause + of some types of failures. + +commit de25e739781c4c09d20abd410f50f0a6f192dc72 +Author: Damien Miller +Date: Thu May 22 18:42:44 2025 +1000 + + minimal shims for fstatat(2)/unlinkat(2) in agent + + Add some very minimal and task-specific replacements for + fstatat(2) and unlinkat(2) in the ssh-agent socket cleanup + loop, for platforms that lack these functions. ok dtucker@ + +commit 6d192645a613aa814d51050b0458f37265b90d6c +Author: dtucker@openbsd.org +Date: Thu May 22 04:22:03 2025 +0000 + + upstream: Output the current name for PermitRootLogin's + + "prohibit-password" in sshd -T instead of its deprecated alias + "without-password". bz#3788, patch from cjwatson at debian.org. + + OpenBSD-Commit-ID: 2d5df18d5ad33a9b6c7547ec78a8e6ea13813df9 + +commit 1ccf42378df202472e7254f37f7dabb2f5723955 +Author: dtucker@openbsd.org +Date: Thu May 22 03:53:46 2025 +0000 + + upstream: Copy arg to be passed to dirname(). + + POSIX allows dirname() to modify its args and return a pointer into it, + so this prevents an overlapping strlcpy. bz#3819, patch from cjwatson + at debian.org + + OpenBSD-Commit-ID: c32e496e6a1618aba31c8b7a9d4e1376c5ea6aa1 + +commit b5877b7b3e597f47578ade9dbe7e4332f112dfc4 +Author: dtucker@openbsd.org +Date: Thu May 22 03:41:10 2025 +0000 + + upstream: Add $OpenBSD$ marker for easier syncing. + + OpenBSD-Commit-ID: 27ff3e1e2e6610d9981ebe43ae9b783236800035 + +commit 58d094c7cb974d7bd3ba6eb1059b186a2ac3dd55 +Author: djm@openbsd.org +Date: Wed May 21 12:12:20 2025 +0000 + + upstream: Correct FILES section to mention new default path to + + agent sockets. Spotted by / ok jmc@ + + OpenBSD-Commit-ID: 91d736d78d71a4276c9cbb075b1462bbc3df55a6 + +commit d1d5c8b9b8de8283618c18d0dafdec6a209911cc +Author: Darren Tucker +Date: Thu May 22 12:25:35 2025 +1000 + + Fix nc install some more. + +commit 49a2412ad23162e44be9e0b2cb12f6daf6b666d7 +Author: Darren Tucker +Date: Thu May 22 12:21:11 2025 +1000 + + Fix cvs up of nc. + +commit df22801b3f0ae245f825cf9c9dbb4543e41a7c5c +Author: Darren Tucker +Date: Thu May 22 11:34:04 2025 +1000 + + Install nc during upstream test. + + This ensures that the installed nc matches the expectations of the + regress tests. + +commit e391c5289c2b687ff886cf780dc8fcb426e4d5d2 +Author: Darren Tucker +Date: Thu May 22 10:52:31 2025 +1000 + + Remove 9.7 branch from CI status page. + + It's been obsolete long enough that github no longer reports its + status. + +commit b71773c20d566fa5dcaf9edf3139bdcb3f2c4bc2 +Author: Damien Miller +Date: Wed May 21 19:14:47 2025 +1000 + + pull a small netcat SOCKS4A fix from upstream + +commit 0adb2db25eff3fe1c90c55654387ae1e4e18a396 +Author: djm@openbsd.org +Date: Wed May 21 08:41:52 2025 +0000 + + upstream: test SOCKS4A; ok tb + + OpenBSD-Regress-ID: d880b75280295cd581a86e39bb0996d347f122d2 + +commit 5699f4e9553c6a228fd9dc578d99e3aa6451c014 +Author: djm@openbsd.org +Date: Wed May 21 08:36:39 2025 +0000 + + upstream: remove log tarballing "it seemed like a good idea at the + + time" - dtucker@ + + ensure that log files have correct perms when running under sudo/doas + + ok dtucker@ + + OpenBSD-Regress-ID: 20588c14b05de9519f85d638b374b66ae0678c89 + +commit 0c14e6b69a20f20d602e0e72559ca3f4dbc797fb +Author: djm@openbsd.org +Date: Wed May 21 06:44:24 2025 +0000 + + upstream: use logit_f("...") instead of logit("func: ...") + + OpenBSD-Commit-ID: c8d49eb39a9abff3cbcaeaf7df9d48468a5a0695 + +commit 1743589d038476f28dc4dfb1f69317649ae22ac5 +Author: djm@openbsd.org +Date: Wed May 21 06:43:48 2025 +0000 + + upstream: function to make a sshbuf from a hex string; useful in + + tests + + also constify some arguments + + OpenBSD-Commit-ID: 00f9c25b256be0efd73f2d8268ff041bc45ffb2c + +commit 83729cf503289104d7e64a69be14579523988cb6 +Author: Damien Miller +Date: Wed May 21 18:47:46 2025 +1000 + + merge netcat SOCKS4A support from OpenBSD + + Not a full sync of this file as we have diverged substantially + from upstream (it has libtls support, etc.) + +commit 750f1867476bda36879f69e25e8f52cb45c58807 +Author: Darren Tucker +Date: Tue May 20 22:17:02 2025 +1000 + + Include OpenSSL compat shim where needed. + +commit 6fb728df50c1afd338cb0223a84ce24579577eff +Author: Darren Tucker +Date: Tue May 20 19:28:55 2025 +1000 + + Run all tests on Cygwin again. + + ... now that we've fixed ci-setup on Cygwin. + +commit 648a3a008cf1cfa54631d2f0457b5313c455f484 +Author: Darren Tucker +Date: Tue May 20 18:48:23 2025 +1000 + + Use USERNAME rather than LOGNAME on Cygwin. + + LOGNAME is specified by POSIX, but Windows (or at least, github's + Windows images) don't set it. + +commit 0214e53124c09528b6ee29b9a551442b5611a454 +Author: Darren Tucker +Date: Tue May 20 18:28:52 2025 +1000 + + Add debug output when setting up CI environment. + +commit 9d9a2c0369419f3b4952e597db7b8696f54e7f3a +Author: Darren Tucker +Date: Tue May 20 19:16:38 2025 +1000 + + Include openssl compat shims in test. + + Fixes tests on platforms using older LibreSSL releases prior to 3.4. + +commit 1a9b1cfa4e8b807c7f82fdba8f730c2abdbba071 +Author: Darren Tucker +Date: Tue May 20 18:14:06 2025 +1000 + + Add compat shims for EC_POINT affine_coordinates + + LibreSSL <3.4 does not have EC_POINT_[gs]et_affine_coordinates + but does have the now-deprecated _GFp variantes. We still support + LibreSSL back as far as 3.2.x so add a compat shim. + +commit cff2175200b412a9207a4fe5c1bdcc54e8a73d07 +Author: tb@openbsd.org +Date: Mon May 12 05:42:02 2025 +0000 + + upstream: Use EC_POINT_[sg]et_affine_coordinates() + + It is available in all supported OpenSSL flavors/versions and the _GFp + variants will be removed from LibreSSL. + + ok hshoexer jsing + + OpenBSD-Regress-ID: 66cf1561e7b6c49002978f2d6720956f33a882f0 + +commit 2d35e24739b515394017b74465a0996c384cf28f +Author: tb@openbsd.org +Date: Mon May 12 05:41:20 2025 +0000 + + upstream: Use EC_POINT_[sg]et_affine_coordinates() + + It is available in all supported OpenSSL flavors/versions and the _GFp + variants will be removed from LibreSSL. + + ok hshoexer jsing + + OpenBSD-Commit-ID: ecedca0e1ffa80e0c9ef7c787bc6a972882c596b + +commit 17003b9f1cd7b7bf1f52493cc4a1ab95727c3ed7 +Author: djm@openbsd.org +Date: Fri May 9 02:42:03 2025 +0000 + + upstream: make the progress-meter code safe against being called + + when not initialised; spotted by tb@ feedback/ok tb@ deraadt@ + + OpenBSD-Commit-ID: a9fda1ee08a24c62e0981ff6d15ca93b63467038 + +commit 2d023e7a95d673e93ccc1978bf8931f7335b2b53 +Author: tedu@openbsd.org +Date: Thu May 8 17:32:53 2025 +0000 + + upstream: convert a last quad_t to int64_t. ok deraadt djm + + OpenBSD-Commit-ID: 1c9e01ba1a9ccf442a9cdf10f222077f66885f1f + +commit fc8c56ade809f66f7df4b5153a4d92593631c12a +Author: Darren Tucker +Date: Tue May 20 15:01:29 2025 +1000 + + Set runner pasword to random string. + + The most recent version of the Github ubuntu-latest image sets the + password field to "!" which sshd considers to be a locked account, + breaking most of the tests. + +commit c404686c17daeda7e95ca6fc14c8a4a570cf975d +Author: Darren Tucker +Date: Sun May 11 22:54:13 2025 +1000 + + Debug log for why an account is considered locked. + +commit ee1d31781cf0d292a50b4df4cb8cb6ffcbfbe9af +Author: Darren Tucker +Date: Sun May 11 16:35:31 2025 +1000 + + Move debug log output into separate workflow step. + + Should reduce the need to scroll back to find out which test actually + failed. + +commit ddfb78a15f57a33427d462b9c401de5c8e6799da +Author: Darren Tucker +Date: Sat May 10 21:48:06 2025 +1000 + + Skip sftp-perm on Cygwin too. + +commit 8846caccb86b3f5a4f1c10bfffcc9cf1adc17925 +Author: Darren Tucker +Date: Sat May 10 10:23:30 2025 +1000 + + Remove CYGWIN binmode as it's now obsolete. + +commit cf795d55437e6c1ffe85e90e0fae00e885e50036 +Author: Darren Tucker +Date: Sat May 10 09:25:18 2025 +1000 + + Also skip sftp-cmds test on Cygwin. + + Fails at the hardlink step. + +commit d1b28639c1cb382943bd92c68992ea74af9b5773 +Author: Darren Tucker +Date: Sat May 10 08:52:11 2025 +1000 + + Tell Cygwin to use native symlinks. + +commit 56782dad7d7f96b4943951227515bd7904ac3cf7 +Author: Darren Tucker +Date: Sat May 10 08:26:37 2025 +1000 + + Skip keygen-knownhost test on Cygwin. + + It fails but at this time it's not clear why. + +commit d5cbac2364b03e55b733a2422a07e78e16d2a118 +Author: Darren Tucker +Date: Sat May 10 07:59:44 2025 +1000 + + Pass Cygwin setup location to CI setup. + + (instead of hard coding it, wrongly). + +commit 82f1f52c5582f005761e4e200c279ddd9c6781e4 +Author: Darren Tucker +Date: Sat May 10 06:37:24 2025 +1000 + + Add RUN_ONLY_TEST to limit which tests are run. + + For testing, you can set the repo variable RUN_ONLY_TEST in your repo + (Repo -> Settings -> Security -> Actions -> Variables) to run only that test. + +commit 140ba45895de8ebfb3e2517b0ddee58729979c29 +Author: Darren Tucker +Date: Fri May 9 19:32:06 2025 +1000 + + Move misc-agent.o to LIBSSH_OBJS. + + It's needed by the fuzzer. + +commit 3357bf2fe2d11b6ed4465c1ed2871bd1099cbbc5 +Author: Darren Tucker +Date: Fri May 9 19:08:36 2025 +1000 + + Put PRIV_ECDSA back, it's still used. + + Should fix oss-fuzz test. + +commit f5726215957bb34e18bb872d527845c2f64e2389 +Author: Darren Tucker +Date: Thu May 8 18:56:39 2025 +1000 + + Since it's unused, make dirfd() take void *. + + Some platforms (eg Old BSDs) in some configurations define DIR to "void + *", which causes compile errors in the no-op implementation. + +commit 1511f113a27d8aafe080aa6493cb3c0cf2b5abe0 +Author: Darren Tucker +Date: Thu May 8 11:38:24 2025 +1000 + + Add no-op implmentation of dirfd(). + + Fixes build on pre-POSIX.1 2008 systems. + +commit 086369736a9496b39af0d9f09443fa81b59b7f05 +Author: Daniel Kahn Gillmor +Date: Wed Apr 16 10:18:34 2025 +1000 + + ssh-agent: exit 0 from SIGTERM under systemd socket-activation + + When the ssh-agent service is configured to be launched under systemd + socket-activation, the user can inspect the status of the agent with + something like: + + systemctl --user status ssh-agent.service + + If the user does: + + systemctl --user stop ssh-agent.service + + it causes the `systemd --user` supervisor to send a SIGTERM to the + agent, which terminates while leaving the systemd-managed socket in + place. That's good, and as expected. (If the user wants to close the + socket, they can do "systemctl --user stop ssh-agent.socket" instead) + + But because ssh-agent exits with code 2 in response to a SIGTERM, the + supervisor marks the service as "failed", even though the state of the + supervised service is exactly the same as during session startup (not + running, ready to launch when a client connects to the socket). + + This change makes ssh-agent exit cleanly (code 0) in response to a + SIGTERM when launched under socket activation. This aligns the systemd + supervisor's understanding of the state of supervised ssh-agent with + reality. + + Signed-off-by: Daniel Kahn Gillmor + +commit 755c3d082e59e6884f28d30e6333a1444e9173d1 +Author: Darren Tucker +Date: Wed May 7 21:05:06 2025 +1000 + + Skip d_type check on platforms that don't have it. + + On those, the subsequent stat() should catch the sockets. + +commit 207289a5663bdf49903e1aeb938dcc0924e2ac63 +Author: dtucker@openbsd.org +Date: Wed May 7 10:44:26 2025 +0000 + + upstream: Rename sockaddr_un sun -> sunaddr. + + This makes things easier in -portable, where on Solaris an derivatives + "sun" is defined to "1", causing compilation errors. ok deraadt@. + + OpenBSD-Commit-ID: 0669043afb49856b57b382f0489221bd98305d3b + +commit 7cc8e150d51a4545b86d996692b541419b35d1a3 +Author: djm@openbsd.org +Date: Tue May 6 06:05:48 2025 +0000 + + upstream: remove DSA from the regression/unit test suite too. + + OpenBSD-Regress-ID: 4424d2eaf0bce3887318ef6d18de6c06f3617d6e + +commit 0404fa799746c283325a463c363436eb152daefc +Author: djm@openbsd.org +Date: Tue Apr 15 05:31:24 2025 +0000 + + upstream: another missing ifdef + + OpenBSD-Regress-ID: 4f71f8f122eac4cbf7f1d2088a9be45317dd3e4a + +commit c5dbbe8805caaee132545ab4cffd3b2221e80975 +Author: djm@openbsd.org +Date: Tue Apr 15 05:00:13 2025 +0000 + + upstream: missing ifdef + + OpenBSD-Regress-ID: 7260fb672de5738c17dec06c71a5be0186bb2b09 + +commit 93e904a673a632604525fdc98b940b7996f1ce54 +Author: djm@openbsd.org +Date: Wed May 7 04:10:21 2025 +0000 + + upstream: memory leak on error path; bz3821 + + OpenBSD-Commit-ID: 65577596a15ad6dd9a1ab3fc24c1c31303ee6e2b + +commit 55b38ff4d7286c8fac2a472da664462e0f2d75e0 +Author: deraadt@openbsd.org +Date: Tue May 6 15:15:05 2025 +0000 + + upstream: test ssh-agent with the -T flag to force the old /tmp + + location rather than inside the homedir. During relink operation, + /.ssh/agent was created which is surprising. This test sequence could use + some improvement so this is a temporary fix. observed by florian, change ok + semarie + + OpenBSD-Commit-ID: c7246a6b519ac390ca550719f91acfdaef1fa0f0 + +commit a32d28d792567253bb601362f36391f155f8f772 +Author: djm@openbsd.org +Date: Tue May 6 05:40:56 2025 +0000 + + upstream: finally remove DSA signature support from OpenSSH. + + feedback/ok tb@, ok deraadt@ + + OpenBSD-Commit-ID: bfe6ee73c1b676c81a2901030c791f8ec888228f + +commit 928f8dcc1bb622c25be409c34374b655d0149373 +Author: djm@openbsd.org +Date: Mon May 5 05:51:11 2025 +0000 + + upstream: Now that there's an I-D for certificate keys, refer to + + that instead of the much more basic format description we had previously. + + OpenBSD-Commit-ID: cf01e0727a813fee8626ad7b3aa240621cc92014 + +commit fe883543bece18c975fa53aa02104f0433645d99 +Author: jmc@openbsd.org +Date: Mon May 5 05:47:28 2025 +0000 + + upstream: - add full stop to the text in -a - move the -U and -u + + text to the correct place + + OpenBSD-Commit-ID: 2fb484337a0978c703f61983bb14bc5cbaf898c2 + +commit 5fd6ef297dec23e3574646b6334087131230d0a6 +Author: Darren Tucker +Date: Tue May 6 19:01:00 2025 +1000 + + Add minimal implementations of fstatat and unlinkat. + + Fixes build on some pre-POSIX.1-2008 platforms. + +commit d2480827b3ef6ec119965822afdff35d734b2dee +Author: Darren Tucker +Date: Tue May 6 08:15:34 2025 +1000 + + New location of cygwin setup. + +commit 57eb87b15bd0343372f99d661ce95efb25a16f1e +Author: Darren Tucker +Date: Tue May 6 08:07:23 2025 +1000 + + Boringssl now puts libcrypto in a different place. + +commit 61525ba967ac1bb7394ea0792aa6030bcbbad049 +Author: Darren Tucker +Date: Mon May 5 20:45:42 2025 +1000 + + Handle systems that don't have st_mtim. + + Ignores nanoseconds, but it's checking for >1h old so a few nanoseconds + shouldn't matter much. Fixes build on Mac OS X. + +commit 27861e9b15151898841097c14ee974c026093131 +Author: Darren Tucker +Date: Mon May 5 19:09:25 2025 +1000 + + Supply timespecsub if needed. + +commit 7c0e6626e4be53efcfbb92f0c6382a76f1138e38 +Author: Darren Tucker +Date: Mon May 5 19:08:48 2025 +1000 + + includes.h for compat, time.h for clock_gettime. + +commit 7a7cc3cf721fe7fe9f4925d92bb7c694b8550a7f +Author: Darren Tucker +Date: Mon May 5 18:51:34 2025 +1000 + + Cygwin install in back on D: + +commit 6ab8133c067a8e91ba69ce7ca04f95b50f2f2d7b +Author: Damien Miller +Date: Mon May 5 14:59:30 2025 +1000 + + depend + +commit 12912429cf39cfeca97dd18a8f875ad9824d1751 +Author: djm@openbsd.org +Date: Mon May 5 03:35:06 2025 +0000 + + upstream: missing file in previous commit + + OpenBSD-Commit-ID: e526c97fcb2fd9f0b7b229720972426ab437d7eb + +commit 80162f9d7e7eadca4ffd0bd1c015d38cb1821ab6 +Author: djm@openbsd.org +Date: Mon May 5 02:48:06 2025 +0000 + + upstream: Move agent listener sockets from /tmp to under + + ~/.ssh/agent for both ssh-agent(1) and forwarded sockets in sshd(8). + + This ensures processes (such as Firefox) that have restricted + filesystem access that includes /tmp (via unveil(3)) do not have the + ability to use keys in an agent. + + Moving the default directory has the consequence that the OS will no + longer clean up stale agent sockets, so ssh-agent now gains this + ability. + + To support $HOME on NFS, the socket path includes a truncated hash of + the hostname. ssh-agent will by default only clean up sockets from + the same hostname. + + ssh-agent gains some new flags: -U suppresses the automatic cleanup + of stale sockets when it starts. -u forces a cleanup without + keeping a running agent, -uu forces a cleanup that ignores the + hostname. -T makes ssh-agent put the socket back in /tmp. + + feedback deraadt@ naddy@, doitdoitdoit deraadt@ + + OpenBSD-Commit-ID: 8383dabd98092fe5498d5f7f15c7d314b03a93e1 + +commit 566443b5f5d7bc4c5310313b4e46232760850c7a +Author: djm@openbsd.org +Date: Mon May 5 02:40:30 2025 +0000 + + upstream: correct log messages; the reap function is used for more + + than just the preauth process now + + OpenBSD-Commit-ID: 768c5b674bd77802bb197c31dba78559f1174c02 + +commit e048230106fb3f5e7cc07abc311c6feb5f52fd05 +Author: djm@openbsd.org +Date: Wed Apr 30 05:26:15 2025 +0000 + + upstream: make writing known_hosts lines more atomic, by writing + + the entire line in one operation and using unbuffered stdio. + + Usually writes to this file are serialised on the "Are you sure you + want to continue connecting?" prompt, but if host key checking is + disabled and connections were being made with high concurrency + then interleaved writes might have been possible. + + feedback/ok deraadt@ millert@ + + OpenBSD-Commit-ID: d11222b49dabe5cfe0937b49cb439ba3d4847b08 + +commit c991273c18afc490313a9f282383eaf59d9c13b9 +Author: djm@openbsd.org +Date: Wed Apr 30 05:23:15 2025 +0000 + + upstream: fix a out-of-bounds read if the known_hosts file is + + truncated after the hostname. + + Reported by the OpenAI Security Research Team + + ok deraadt@ + + OpenBSD-Commit-ID: c0b516d7c80c4779a403826f73bcd8adbbc54ebd + +commit b5b405fee7f3e79d44e2d2971a4b6b4cc53f112e +Author: Darren Tucker +Date: Sun Apr 20 09:07:57 2025 +1000 + + Set Windows permssions on regress dir. + + Prevents "unprotected private key file" error when running tests. + +commit 76631fdd04824c3e50ea6551d3611b1fe0216a41 +Author: Darren Tucker +Date: Fri Apr 18 08:18:52 2025 +1000 + + Add 10.0 branch to test status page. + +commit c627b468d3b99e487e2b24c90958ae57e633d681 +Author: Darren Tucker +Date: Fri Apr 18 08:14:16 2025 +1000 + + cygwin-install-action now puts setup.exe on D: + +commit 52bddbc1a7f53a1e5c871767913648eb639ac6d5 +Author: Darren Tucker +Date: Fri Apr 18 08:10:32 2025 +1000 + + Include time.h for clock_gettime(). + +commit 9b50cb171b5c56184ce6fa3994ce62f9882d2daf +Author: Darren Tucker +Date: Thu Apr 17 16:51:14 2025 +1000 + + Add includes.h for new tests. + + Fixes builds on older platforms. + +commit 46e52fdae08b89264a0b23f94391c2bf637def34 +Author: Darren Tucker +Date: Wed Apr 16 22:29:17 2025 +1000 + + Provide INFINITY if it's not provided. + + INFINITY is specified in c99, so define if not provided. + +commit 849c2fd894aa87a7e40c71e8d5bda5392b1205be +Author: Darren Tucker +Date: Tue Apr 15 21:58:49 2025 +1000 + + Look for sqrt(), possibly in libm. + + The unit tests now use sqrt(), which in some platforms (notably + DragonFlyBSD and Solaris) is not in libc but rather libm. Since only + the unit tests use this, add TESTLIBS and if necessary put libm in it. + +commit 1ec5b39f1f673beac039bb42c98a11aa2b08a0b2 +Author: dtucker@openbsd.org +Date: Tue Apr 15 09:22:25 2025 +0000 + + upstream: Cast signalled_keydrop to int when logging to prevent warning + + on platforms where sig_atomic_t is not the same as int. bz#3811, patch from + jlduran at gmail com. + + OpenBSD-Commit-ID: b6bc9e9006e7f81ade57d41a48623a4323deca6c + +commit f3d465530e75cb6c02e2cde1d15e6c4bb51ebfd9 +Author: djm@openbsd.org +Date: Tue Apr 15 04:00:42 2025 +0000 + + upstream: basic benchmarking support for the unit test framework enable + + with "make UNITTEST_BENCHMARK=yes" + + ok dtucker@ + + OpenBSD-Regress-ID: 7f16a2e247f860897ca46ff87bccbe6002a32564 + +commit 609fe2cae2459d721ac11d23cd27b8a94397ef3c +Author: jmc@openbsd.org +Date: Mon Apr 14 05:41:42 2025 +0000 + + upstream: rework the text for -3 to make it clearer what default + + behaviour is, and adjust the text for -R to make them more consistent; + + issue raised by mikhail mp39590; + behaviour explained by naddy + + ok djm + + OpenBSD-Commit-ID: 15ff3bd1518d86c84fa8e91d7aa72cfdb41dccc8 + +commit 8725dbc5b5fcc3e326fc71189ef8dba4333362cc +Author: Damien Miller +Date: Wed Apr 9 17:02:17 2025 +1000 + + update version numbers + +commit cc7feb9458ad3b893b53dc9c7500d1affd208bde +Author: djm@openbsd.org +Date: Wed Apr 9 07:00:21 2025 +0000 + + upstream: openssh-10.0 + + OpenBSD-Commit-ID: db5b4a1f1c9e988f8f166b56dc5643606294b403 + +commit fc86875e6acb36401dfc1dfb6b628a9d1460f367 +Author: djm@openbsd.org +Date: Wed Apr 9 07:00:03 2025 +0000 + + upstream: Fix logic error in DisableForwarding option. This option + + was documented as disabling X11 and agent forwarding but it failed to do so. + Spotted by Tim Rice. + + OpenBSD-Commit-ID: fffc89195968f7eedd2fc57f0b1f1ef3193f5ed1 + +commit dd73459e351b0a2908aed90910c8ff9b0b381c6d +Author: djm@openbsd.org +Date: Wed Apr 9 01:24:40 2025 +0000 + + upstream: oops, I accidentally backed out the typo fix + + OpenBSD-Commit-ID: f485f79bf3e9ebbe1de13ac96150cf458956cfd8 + +commit 0cb945891944bada5850e85d60afa3c807cf1af6 +Author: djm@openbsd.org +Date: Wed Apr 9 01:23:47 2025 +0000 + + upstream: typo + + OpenBSD-Commit-ID: f912725c7d303720706b3ccfb2cb846d46296d13 + +commit cd4a6bd50b658d707867caa1f5aa40b35c2b6c19 +Author: Damien Miller +Date: Wed Apr 9 09:49:55 2025 +1000 + + initialise websafe_allowlist in agent fuzzer + +commit 55b7cb48af96c1102ef8ab5a73bb329cbed30945 +Author: djm@openbsd.org +Date: Tue Apr 8 23:10:46 2025 +0000 + + upstream: typo + + OpenBSD-Regress-ID: 08477b936d1d0c1e8a98aa1c0e1bdde8871894c9 + +commit 985d8cbcd3438cc36b4e709476f1783e358ddfb1 +Author: djm@openbsd.org +Date: Tue Apr 8 23:10:08 2025 +0000 + + upstream: typo + + OpenBSD-Commit-ID: 6e683e13e72bf1e43bbd3bbc6a8332d5a98bdc99 + +commit 000c3d14e94d8f7597087c457260ea9417045b65 +Author: dtucker@openbsd.org +Date: Mon Apr 7 08:12:22 2025 +0000 + + upstream: Include time.h for time(). + + Fixes warning on some platforms when building without openssl. + + OpenBSD-Commit-ID: 04ca29b8eaae1860c7adde3e770baa1866e30a54 + +commit 49b8b9bf829e08af22366530614a5e59ac341ca9 +Author: tb@openbsd.org +Date: Wed Apr 2 04:28:03 2025 +0000 + + upstream: Wrap #include in #ifdef WITH_DSA + + ok djm + + OpenBSD-Commit-ID: ed01a7c102243f84e4a317aefb431916d98aab15 + +commit f80fb819e5521e13f167edbcc3eed66e22ad0c2a +Author: Damien Miller +Date: Thu Apr 3 09:10:19 2025 +1100 + + remove all instances of -pie from LDFLAGS + + Previously only the first instance of this flag was removed. + Unbreaks build on OpenSUSE Tumbleweed. Patch from Antonio Larrosa + +commit 6c9872faa1c297a84c6d3e3b95a927be99eadbf6 +Author: djm@openbsd.org +Date: Tue Apr 1 23:23:20 2025 +0000 + + upstream: remove ability to enable DSA support. Actual code will be + + g/c'd separately. ok deraadt@ + + OpenBSD-Commit-ID: 2a032b75156c4d922e8343fa97ff6bc227f09819 + +commit 8460aaa4e1f8680f03cc5334556b9440b401f010 +Author: dtucker@openbsd.org +Date: Fri Mar 28 21:45:55 2025 +0000 + + upstream: Add TEST_SSH_SSHD_ENV to sshd lines here too. + + OpenBSD-Regress-ID: 045f2c88b42d694b404db51c5de5eca20d748ff1 + +commit 5e60f5937b9c33190b9d7614f72d85d4a9b38d3d +Author: dtucker@openbsd.org +Date: Fri Mar 28 06:04:07 2025 +0000 + + upstream: Pass "ControlMaster no" to ssh when invoked by scp & sftp. + + If you have ControlMaster auto (or yes) in your config, and the + first connection you make is via scp or sftp, then you may get a + few unexpected options applied to it (eg ForwardX11 no), since sftp + and sftp explicitly disable those for reasons. These effects will + persist beyond the initial scp or sftp command. + + This explicitly disables persistent session *creation* by scp and sftp. + It will not prevent them from using an existing session if one has + already been created. + + From Github PR#557, ok djm@ kn@ + + OpenBSD-Commit-ID: 9dad7c737466837e0150c4318920f46d844770c4 + +commit bbd36869dfb4b770cc9e6a345c04a585a0955aec +Author: dtucker@openbsd.org +Date: Fri Mar 28 05:41:15 2025 +0000 + + upstream: Set sshd environment variables during sshd test run too. + + OpenBSD-Regress-ID: 50cb325d92c390a2909662c901f6ac5d80b6f74d + +commit 98f05b1484daddef2f56b79e24540523b5016143 +Author: dtucker@openbsd.org +Date: Fri Mar 28 05:36:24 2025 +0000 + + upstream: Add TEST_SSH_SSHD_ENV variable which is added to sshd's + + environment. Will be used in Portable to tweak behaviour of tcmalloc's + debugging. + + OpenBSD-Regress-ID: 67e38c3c4517ddb72c8a3549a3325a166d7bb6d6 + +commit 8cd9ed4df0eccc825eca0c45354a37332e125e38 +Author: dtucker@openbsd.org +Date: Fri Mar 28 05:33:30 2025 +0000 + + upstream: chown log directory in addition to log files. + + OpenBSD-Regress-ID: b520d54a0bbf2c6554413c798218bda26b385ad9 + +commit e32de6bf4f3229d4838beb127de45eed1377ccc5 +Author: Darren Tucker +Date: Fri Mar 28 16:47:58 2025 +1100 + + Be explicit about environment variables for tests. + + This will make it easier to reproduce a test failure by cut-and-paste of + the corresponding line from the github log. + +commit 77a3e6ba47381547b3fe4b29223256f276fbd07e +Author: Darren Tucker +Date: Fri Mar 28 16:46:40 2025 +1100 + + Add tcmalloc flags to TEST_SSH_SSHD_ENV. + + This will get passed to sshd via test-exec.sh. + +commit a73890e340fbd6121251854b658a72d738b86c84 +Author: Darren Tucker +Date: Thu Mar 27 23:04:44 2025 +1100 + + Add PuTTY 0.81, 0.82 and 0.83 to tests. + +commit 90a28de0d49570324d1695c0b4686354ef3bcae0 +Author: Darren Tucker +Date: Thu Mar 27 22:30:40 2025 +1100 + + Include TCMALLOC_STACKTRACE_METHOD in output. + + If TCMALLOC_STACKTRACE_METHOD happens to be set, include it in the debug + output to make reproducing test cases easier. + +commit fd5a6bb6dd7657c4bd8cd0ee11d5c8ddf0d927b2 +Author: Darren Tucker +Date: Thu Mar 27 20:15:11 2025 +1100 + + Test with-linux-memlock-onfault in kitchensink. + +commit 22330711e2459c23d9736ee16e0e2ee0fcc30b9a +Author: Collin Funk +Date: Wed Mar 26 18:24:59 2025 -0700 + + Include fcntl.h so AT_FDCWD does not get redefined. + +commit 6c49e5f7dcaf886b4a702a6c003cae9dca04d3ea +Author: Daniil Tatianin +Date: Thu Feb 27 11:37:13 2025 +0300 + + Add support for locking memory on Linux + + Linux wakes up kcompactd threads in order to make more contiguous memory + available on the system, it does this by migrating live movable pages + (actively modifying live processes' page tables and constantly flooding + them with page invalidation IPIs, which can be up to millions per + second), which causes the process to become unresponsive for up to + seconds or even minutes in some severe cases. In case of sshd, we want + to always be able to connect to the system, even if it's under heavy + kcompactd load. + + Introduce an option to protect sshd and its children sessions from being + compacted by kcompactd (this works in cojunction with + compact_unevictable_allowed = 0). Note that we depend on MCL_ONFAULT + being available, which was introduced in linux 4.4. MCL_ONFAULT allows + the system to lock pages lazily, thus drastically reducing memory usage + of a locked process (without MCL_ONFAULT, every existing mapping in the + process is instantly write-faulted). + +commit fdc4853c5b1567934d43ab13282f03033cc21325 +Author: Daniil Tatianin +Date: Thu Feb 27 11:46:25 2025 +0300 + + platform: introduce a way to hook new session start + + Previously this was possible via post_fork_child, but ever since sshd + was split into multiple binaries, this is now no longer possible becase + of execv. + +commit 1b311b6b17be81577514c38e8be4f5740d7df496 +Author: dtucker@openbsd.org +Date: Wed Mar 19 06:11:15 2025 +0000 + + upstream: Prevent theoretical NULL deref in throughlocal_sftp. + + Coverity CID 405019, although at the moment it's not reachable. ok djm@ + + OpenBSD-Commit-ID: 630d46c1021b69fbb470e349976c70e9a48b7644 + +commit 96493ebd6ff48bbb802576e208794a26928569b0 +Author: Darren Tucker +Date: Wed Mar 19 17:35:10 2025 +1100 + + Fix workflow syntax again. + +commit 575c43fd4c44d376b1771c0fdaf4941021ba88c9 +Author: Darren Tucker +Date: Tue Mar 18 20:54:48 2025 +1100 + + Differentiate logfiles better. + +commit 8a1294638f3a47d46263ea574fa85c8e115ea893 +Author: Darren Tucker +Date: Tue Mar 18 20:27:46 2025 +1100 + + Fix another typo in workflow. + +commit bd9e6bbcc864b3e10c4e11f5aec1b3a5e3a89b55 +Author: Darren Tucker +Date: Tue Mar 18 18:16:12 2025 +1100 + + Fix syntax error in workflow. + +commit ce88a1bb4a2e6425752094f7a2eb4adfb0ca7971 +Author: Darren Tucker +Date: Tue Mar 18 18:13:14 2025 +1100 + + Identify each logfile while printing them. + +commit b58e429960c4791fc4e30bb7c70d1f77d538b546 +Author: djm@openbsd.org +Date: Tue Mar 18 04:53:14 2025 +0000 + + upstream: fix NULL dereference for Match conditions missing + + arguments, e.g. "Match user". Spotted by Coverity (CID 477813) + + OpenBSD-Commit-ID: 13584281cfa23b8ebc41f9d128a6b9464ae960d4 + +commit 0ce5281f017c3ad7bdcc2bbd9745119a73e0cbb8 +Author: tb@openbsd.org +Date: Fri Mar 14 09:49:49 2025 +0000 + + upstream: Fix EVP_CIPHER_CTX_ctrl() return checks + + While this API tries to translate negative return values (i.e. -1) to 0 + in BoringSSL and LibreSSL, it is still possible for it to return negative + values in prinicple. We even incorrectly document that -1 can be returned + while Boring and OpenSSL plead the Fifth. + + In OpenSSL 3 there are now code paths that explicitly return -1 and they + started shifting their return checks to <= 0 - of course they do this in + inconsistent and sometimes incorrect manner. While these paths aren't + reachable from ssh right now, who can really tell what happens in the two + hundred lines of inscrutable bloated mess this has become. + + So error check with <= 0 to ensure that we don't accidentally translate an + error to success. + + ok markus schwarze + + OpenBSD-Commit-ID: a855c833cf4ecfce43bedc761f26ad924f70483c + +commit 2e81100763d5885e500f065b04c16ed87ce74318 +Author: Darren Tucker +Date: Mon Mar 17 21:35:55 2025 +1100 + + Fix debug log path. + +commit 442a44970179d70ebb62bba792699eaec978a1db +Author: Darren Tucker +Date: Fri Mar 14 16:24:06 2025 +1100 + + Also lazily unmount workspace in case of straggers. + +commit 20427f6735fe5ddab31911ce5315adc71acf47d8 +Author: Darren Tucker +Date: Fri Mar 14 16:17:39 2025 +1100 + + Make sure upstream tests run on correct hardware. + +commit 91a2f70a56827ae31649baf17227b0914ac5aa36 +Author: Darren Tucker +Date: Fri Mar 14 13:47:27 2025 +1100 + + Add OpenBSD upstream test on obsdsnap-arm64. + +commit c20f7413525602b0ea786d8974d03a81f7ca2a92 +Author: Damien Miller +Date: Thu Mar 13 10:45:53 2025 +1100 + + rebuild .depend + +commit d47ef958b89c6fa809302d654009d3dfabe11b75 +Author: djm@openbsd.org +Date: Wed Mar 12 22:43:44 2025 +0000 + + upstream: remove assumption that the sshd_config and any configs + + included from it can fit in a (possibly enlarged) socket buffer, by having + the sshd listener mainloop actively manage sending the configuration to the + sshd-session subprocess. + + work by markus@ w/ a little feedback from me; + ok me and committing on his behalf + + OpenBSD-Commit-ID: 8f54451483f64951853074adb76bc4f838eaf3ae + +commit 9c90b563943c16418d737433ac478974b8761ee5 +Author: dtucker@openbsd.org +Date: Tue Mar 11 11:46:44 2025 +0000 + + upstream: Prime caches for DNS names needed for tests. + + When running the SSHFP tests, particularly on an ephemeral VM, the first + query or two can fail for some reason, presumably because something isn't + fully initialized or something. To work around this, issue queries for the + names we'll need before we need them. + + OpenBSD-Regress-ID: 900841133540e7dead253407db5a874a6ed09eca + +commit 10124eefe875a3e4e1cfb84ebe6a613ed3213b78 +Author: dtucker@openbsd.org +Date: Tue Mar 11 09:06:50 2025 +0000 + + upstream: Some dd's don't understand "1m", so handle seperately. + + OpenBSD-Regress-ID: 1d983b27c96f28f69d3a288c19e8d8c58e1b2ee3 + +commit c21c8fc319376c2f5e0da166e9e89a97a245ae72 +Author: Darren Tucker +Date: Tue Mar 11 19:17:46 2025 +1100 + + Lazily unmount github workspace at end of workflow. + + Sometimes when a test times out the workspace is still busy when we try + to unmount it, which leaves the runner unusable until it's cleaned up + manually. We try to unmount this in the first step, but that usually + doesn't work since it fails during setup before it starts our workflow. + Move it to the end and make it a lazy unmount so it hopefully works + eventually. + +commit 4bcbac742968f5086cfd4c570a51de25ef77931f +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:50:20 2025 +0000 + + upstream: Add regress test for sftp resume. + + OpenBSD-Regress-ID: 37f629b3014338fa23a85df1e1bb320ea12282e1 + +commit e2c4f070b43a4fd7d59a9350e2fe78df605830b5 +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:46:02 2025 +0000 + + upstream: Use ssh binary instead of the (smaller) script when + + preparing test data files since it's faster. + + OpenBSD-Regress-ID: 4215e42682fdb73e131e10645d4a1a23a91d64f5 + +commit 62f02e95ba5cda4649c482d30f4370e2360eb94d +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:43:45 2025 +0000 + + upstream: Set up dbclient's known_hosts as it expects. + + OpenBSD-Regress-ID: 9e0898e8423237ce5023be53787bb4062e0d0418 + +commit 395284bd52887dbaf7e78200c857d7f2d9ce398e +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:43:03 2025 +0000 + + upstream: Use $DBCLIENT to access dbclient for consistency. + + OpenBSD-Regress-ID: 81e1b41e1ffc49aba1e6fcaeb6242f3b7875ea3c + +commit 97e10c0005a784622c61cb4e8bb7858b410bbcc6 +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:42:08 2025 +0000 + + upstream: Check if dbclient supports SHA1 before trying SHA1-based + + KEX. + + Dropbear 2025.87 removed SHA1 support by default, which means + diffie-hellman-group14-sha1 is not available. Unfortunately there isn't a + flag to query supported KEX, so instead check MACs and if it doesn't have + SHA1 methods, assuming SHA1 based KEXes are likewise not available. Spotted + by anton@. + + OpenBSD-Regress-ID: acfa8e26c001cb18b9fb81a27271c3b51288d304 + +commit 29a5127f808d00aa539fd27d83a65c2c56179b0e +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:48:51 2025 +0000 + + upstream: Set highwater when resuming a "put". Prevents bogus "server + + reordered acks" debug message. ok djm@ + + OpenBSD-Commit-ID: aa7f6d0fc2e893c8c278ea3e6e0974c2eca83f5d + +commit 6575859d7acb110acf408707f98ed9744ca7d692 +Author: dtucker@openbsd.org +Date: Mon Mar 3 06:54:37 2025 +0000 + + upstream: Test for %-token and env var expansion in SetEnv. + + OpenBSD-Regress-ID: bd6139a6177ac4afb29a0ce4afc23567b22ef9f9 + +commit fd7ad8d7bf7dbdeb8f11a8b51aa9d31df1a17e52 +Author: dtucker@openbsd.org +Date: Sun Mar 2 07:41:06 2025 +0000 + + upstream: Also test User expansions when supplied via -l option and + + user@host. + + OpenBSD-Regress-ID: 56415859260b53ef0dd20f71225ba5fdf6320f50 + +commit e6cfd783f1491b502db9322aa970822c63f1667d +Author: dtucker@openbsd.org +Date: Sat Mar 1 06:12:47 2025 +0000 + + upstream: Tests for User expansion of %-tokens and environment + + variables. + + OpenBSD-Regress-ID: 7ed21dd0e09fb1f3537b8b177f171018aa501628 + +commit 197e503b8e4b642ce0f405a5d65da4256fa96431 +Author: djm@openbsd.org +Date: Fri Dec 6 16:25:58 2024 +0000 + + upstream: use glob(3) wildcards in AuthorizedKeys/PrincipalsFile + + tests to exercise this feature; ok dtucker + + OpenBSD-Regress-ID: 7f7b19c0b05b1862cc6521ce61b2b301a3f9cc3b + +commit 396202180180a4ac16788d469508a348789dafa1 +Author: djm@openbsd.org +Date: Fri Dec 6 10:37:42 2024 +0000 + + upstream: implement attestation verification for ED25519 keys + + OpenBSD-Regress-ID: c44fa5cdb434375a8b5545fdb4fc651061afca1f + +commit b49875428cda9c16c5bd52552100da2b419cda5f +Author: dtucker@openbsd.org +Date: Mon Mar 3 06:53:09 2025 +0000 + + upstream: Add %-token and environment variable expansion to SetEnv. + + feedback deraadt@ jmc@, nits and ok djm@ + + OpenBSD-Commit-ID: 2f6e5070481cb73e6f35fd1c6608c1eeff88a5c1 + +commit b6bba67e6c31d268480773e4fed16d0a32b4218e +Author: djm@openbsd.org +Date: Sun Mar 2 22:44:00 2025 +0000 + + upstream: fix PerSourcePenalty incorrectly using "crash" penalty when + + LoginGraceTime was exceeded. Reported by irwin AT princeton.edu via bz3797 + + OpenBSD-Commit-ID: 1ba3e490a5a9451359618c550d995380af454d25 + +commit 38d69fee1b06948f160d94abd07b6b297630d30a +Author: Damien Miller +Date: Sun Mar 2 22:06:53 2025 +1100 + + include __builtin_popcount replacement function + + Some systems/compilers lack __builtin_popcount(), so replace it as + necessary. Reported by Dennis Clarke; ok dtucker@ + +commit c94138d02a45dda5015f38f5a60b0bdde29019c1 +Author: djm@openbsd.org +Date: Sun Mar 2 11:03:13 2025 +0000 + + upstream: whitespace + + OpenBSD-Commit-ID: 1bd8953a37451ef7e0991f9fceec5e8005fe986a + +commit 65d2c59628e68e166046efa69e76c1d395a8df6e +Author: dtucker@openbsd.org +Date: Sun Mar 2 07:02:49 2025 +0000 + + upstream: Make a copy of the user when handling ssh -l, so that + + later during User token expansion we don't end up freeing a member of argv. + Spotted by anton@'s regress tests. + + OpenBSD-Commit-ID: 2f671a4f5726b66d123b88b1fdd1a90581339955 + +commit bd30cf784d6e825ef71592fb723c41d4f2fd407b +Author: dtucker@openbsd.org +Date: Sat Mar 1 06:11:26 2025 +0000 + + upstream: Allow %-token and environment variable expansion in User, + + with the exception of %r and %C which are self-referential. Requested in + bz#3477, ok djm@, man page improvements jmc@ + + OpenBSD-Commit-ID: caeb46251ee073662f6f5864c6f7b92d8ac80fa8 + +commit 94f59dcfc57f95ae044f75c3ce544329c8956c35 +Author: Darren Tucker +Date: Sat Mar 1 10:28:59 2025 +1100 + + Rebuild config files if Makefile changes. + + This ensures paths are updated if they are changed by re-running configure. + Patch from rapier at psc.edu. + +commit dfd9880585db1570656022f9fe1519df673f7b8a +Author: Darren Tucker +Date: Wed Feb 26 18:16:03 2025 +1100 + + Check for le32toh, le64toh, htole64 individually. + + It appears that at least some versions of endian.h in glibc do not have + the latter two, so check for and replace each one individually. + bz#3794, ok djm@ + +commit cb99e8eb228df366af33f4fe88d7a9dd0dbf0756 +Author: djm@openbsd.org +Date: Tue Feb 25 06:25:30 2025 +0000 + + upstream: ressurect fix for "match invalid-user" that got clobbered + + by 1.423 + + OpenBSD-Commit-ID: d18bf0945976e0f3467d710d4bc8bdbe181c0567 + +commit 487cf4c18c123b66c1f3f733398cd37e6b2ab6ab +Author: deraadt@openbsd.org +Date: Fri Feb 21 18:22:41 2025 +0000 + + upstream: Also prohibit , (comma) in hostnames, proposed by David + + Leadbeater ok djm millert + + OpenBSD-Commit-ID: 2837fa31dc6e81976f510f0a259edaa559b20b07 + +commit 3bc6de98c830bd5207f6c371ba69c5874f06305b +Author: Damien Miller +Date: Mon Feb 24 17:27:50 2025 +1100 + + Try to fix github tcmalloc target failure + + tcmalloc may, depending on the stacktrace generator it uses, create + pipe(2) fds during shared library initialisation. These will later + get clobbered by ssh/sshd calling closefrom() and chaos will ensue. + Tell tcmalloc to use an unwinder that doesn't pull this stuff. + +commit 922e54bbfe8c8479453693ef52350338f0c19124 +Author: Damien Miller +Date: Fri Feb 21 13:44:35 2025 +1100 + + cleanup last mention of ubuntu-20.04 + +commit bc4b3f6dc1738d389e5c9dcca8c56d7e153fee49 +Author: Damien Miller +Date: Fri Feb 21 13:44:13 2025 +1100 + + prune gcc/clang versions to be tested + + Test only the oldest and latest versions of each + +commit 94b73755f931d592a612ef5cb998694643eab5ff +Author: Damien Miller +Date: Fri Feb 21 11:30:22 2025 +1100 + + Update AWS-LC version number + + Patch from Shubham Mittal bz bz3792 + +commit 6887099fae6d9f3482e1075d034e9343dc413200 +Author: Damien Miller +Date: Fri Feb 21 11:22:34 2025 +1100 + + adjust workflows for ubuntu version transition + + remove workflows for unsupported compilers, add a few for additional + supported compilers, move some workflows to run on ubuntu-latest + +commit 33bb47e6f74f2ca8093946e6f462d655a9ae46d3 +Author: Damien Miller +Date: Thu Feb 20 17:10:32 2025 +1100 + + Add ubuntu-*-arm test runners + +commit a0c95fbb215b2168fa51b15906e2d6990d7fef6b +Author: Damien Miller +Date: Thu Feb 20 17:03:28 2025 +1100 + + remove ubuntu-20.04 Github action runners + + ubuntu-20.04 is deprecated now, so migrate all its unique runners + to ubuntu-22.04. + + ok dtucker@ + +commit 0cbeedba81b57c56379e1d202b9ccd3b72af7ddc +Author: Damien Miller +Date: Tue Feb 18 19:03:42 2025 +1100 + + openssh-9.9p2 + +commit 0832aac79517611dd4de93ad0a83577994d9c907 +Author: djm@openbsd.org +Date: Tue Feb 18 08:02:48 2025 +0000 + + upstream: Fix cases where error codes were not correctly set + + Reported by the Qualys Security Advisory team. ok markus@ + + OpenBSD-Commit-ID: 7bcd4ffe0fa1e27ff98d451fb9c22f5fae6e610d + +commit 6ce00f0c2ecbb9f75023dbe627ee6460bcec78c2 +Author: djm@openbsd.org +Date: Tue Feb 18 08:02:12 2025 +0000 + + upstream: Don't reply to PING in preauth phase or during KEX + + Reported by the Qualys Security Advisory team. ok markus@ + + OpenBSD-Commit-ID: c656ac4abd1504389d1733d85152044b15830217 + +commit 9e5bd74a85192c00a842f63d7ab788713b4284c3 +Author: jmc@openbsd.org +Date: Sat Feb 15 06:48:56 2025 +0000 + + upstream: - use \& when contructs like "e.g." end a line, to avoid + + double spacing - macro is Qq not Oq + + OpenBSD-Commit-ID: 17e5d2d7f288cc7fc536e3af252224525f9fb43a + +commit f519e71fb7a46314ae16e2a75490649dc0bd01a2 +Author: Damien Miller +Date: Sat Feb 15 13:12:40 2025 +1100 + + depend + +commit 9131ac64b0ebe66dc1de9d44bf8d1bd64a24c350 +Author: djm@openbsd.org +Date: Sat Feb 15 01:52:07 2025 +0000 + + upstream: add "Match version" support to ssh_config. Allows + + matching on the local version of OpenSSH, e.g. "Match version OpenSSH_10.*" + + ok markus@ + + OpenBSD-Commit-ID: c0cb504d0b9e43ccf12e68a544a7cd625e89758d + +commit 192a20df00c8a56fe7d92ffa23d959c865d7fb9e +Author: djm@openbsd.org +Date: Sat Feb 15 01:50:47 2025 +0000 + + upstream: Add support for "Match sessiontype" to ssh_config. Allows + + matching on the type of session requested, either "shell" for interactive + sessions, "exec" for command execution sessions, "subsystem" for subsystem + requests, such as sftp, or "none" for transport/forwarding-only sessions. + + ok markus@ + + OpenBSD-Commit-ID: eff5c001aecb2283d36639cfb28c0935a8bfd468 + +commit caa3c0c77082888236b0b0c4feb3e6879731b3ba +Author: djm@openbsd.org +Date: Sat Feb 15 01:48:30 2025 +0000 + + upstream: "Match command ..." support for ssh_config to allow + + matching on the remote command specified on the commandline. + + Also relaxes matching rules for `Match tagged` to allow + `Match tagged ""` to match an empty tag value. This also works + for command. + + ok markus@ + + OpenBSD-Commit-ID: 00dcfea425bf58d824bf5e3464cfc2409121b60d + +commit 38f6000e9851a00e2e4b8e1eb4ea6a243ef7e6a3 +Author: Damien Miller +Date: Tue Feb 11 10:32:26 2025 +1100 + + depend + +commit aa1409e7a0a5605f0127651a3ba5a348666325bc +Author: djm@openbsd.org +Date: Mon Feb 10 23:19:26 2025 +0000 + + upstream: include arguments the command was invoked with, and + + operating system name, version and architecture in startup debugging output; + ok dtucker + + OpenBSD-Commit-ID: 2a509d319aaf31a6bf9998e1842832883fbc3edd + +commit 857ac20f5fe19f183defba5dbf4b7d9e6400230c +Author: djm@openbsd.org +Date: Mon Feb 10 23:16:51 2025 +0000 + + upstream: include line number in Match debug messages, makes it a + + little easier to see what's going on + + OpenBSD-Commit-ID: 1fcf4aa2ee667711b9497ded0fa52d757c69b1df + +commit af49d474e481d2d78b2f06b06a06b0b37629358e +Author: djm@openbsd.org +Date: Mon Feb 10 23:00:29 2025 +0000 + + upstream: fix "Match invalid-user" from incorrectly being activated + + in initial configuration pass when no other predicates were present on the + match line + + OpenBSD-Commit-ID: 02703b4bd207fafd03788bc4e7774bf80be6c9a8 + +commit 1c67bae3f5834e48ded71c406f2039dea6e536db +Author: schwarze@openbsd.org +Date: Sun Feb 9 18:24:08 2025 +0000 + + upstream: In a section 1 manual, use the plain English words + + "standard output" rather than the overly technical abbreviation "stdout" - we + are not talking about a device file or a FILE * object here. Issue reported + by on the groff mailing list. + + OpenBSD-Commit-ID: a0816999f970e6159523bed8484f62c42ec93109 + +commit 85b3d68dd931416ede657f371f1d60cdc3a66f34 +Author: dtucker@openbsd.org +Date: Fri Jan 17 00:09:41 2025 +0000 + + upstream: Fix debug logging of user specific delay. Patch from + + Achim Leitner (fjl5) via github PR#552. + + OpenBSD-Commit-ID: 834a869ed9b15058d3c1ef0cd75402ef989255d8 + +commit e4e5b06fdf4532705669c0ae944b364022d16b9d +Author: dtucker@openbsd.org +Date: Thu Jan 16 06:37:10 2025 +0000 + + upstream: Call log_init in sshd-auth and sshd-session immediately + + after parsing the config file so that any log settings set in the config file + take effect immediately. Move version banners to immediately after that, and + make them distinct per binary. ok djm@ + + OpenBSD-Commit-ID: acf3d090638edf9b6e6f78eed96b537fe671f0f5 + +commit 0643994b20f2cc54bca80842a984b3052ff1a6a9 +Author: dtucker@openbsd.org +Date: Wed Jan 15 22:23:13 2025 +0000 + + upstream: Use strprefix helper when processing sshd -C test args + + instead of counting bytes by hand. ok djm@ + + OpenBSD-Commit-ID: 2866d369d96fe04bf76112260ac37e489f98a9a9 + +commit 66efd0fbb6b8b95f8a520f2cdf8ede14e62b30b3 +Author: Damien Miller +Date: Thu Feb 6 09:38:09 2025 +1100 + + add support for AWS-LC (AWS libcrypto) + + Patch from Shubham Mittal via bz3784; ok dtucker + +commit 826483d51a9fee60703298bbf839d9ce37943474 +Author: Tim Rice +Date: Mon Dec 16 15:36:54 2024 -0800 + + fix old typo (s/SYSVINITSTOPT/SYSVINITSTOP/) + +commit 1a8ce460f1d0c3f7304edba0733783b57b430e21 +Author: dtucker@openbsd.org +Date: Thu Dec 12 09:09:09 2024 +0000 + + upstream: Plug leak on error path, spotted by Coverity. ok djm@ + + OpenBSD-Commit-ID: b1859959374b4709569760cae0866d22a16606d3 + +commit 924f996144fc0ae1a659fadcfc2237d1ae935fc4 +Author: Xavier Hsinyuan +Date: Mon Dec 9 11:21:05 2024 +0800 + + Add $(srcdir) for standalone sk-libfido2 make target. + + Fix out-of-tree build failure due to incorrect path for `sk-usbhid.c`. + +commit bbc9c18e84de29c83fa03e69290979fcca54a2b2 +Author: djm@openbsd.org +Date: Sat Dec 7 10:12:19 2024 +0000 + + upstream: replace bespoke logging of MaxSessions enforcement with + + new ratelimited logging infrastructure. + + Add ratelimits to logging of connections dropped by PerSourcePenalties + + ok dtucker + + OpenBSD-Commit-ID: f22fe7c39607e4361aadf95e33773ffd68c59489 + +commit 5a6ddf946cf105189c2c99a04f86ce95edc55fc5 +Author: djm@openbsd.org +Date: Sat Dec 7 10:05:36 2024 +0000 + + upstream: add infrastructure for ratelimited logging; feedback/ok + + dtucker + + OpenBSD-Commit-ID: 18a83e5ac09d59aaf1e834fd6b796db89dd842e7 + +commit 85f0c1e75e8f6c5d83b8070918ee2f6ab16d403e +Author: djm@openbsd.org +Date: Fri Dec 6 16:24:27 2024 +0000 + + upstream: allow glob(3) patterns for sshd_config AuthorizedKeysFile + + and AuthorizedPrincipalsFile directives; bz2755 ok dtucker + + OpenBSD-Commit-ID: 3e3e05a17fca39bba78b993a07b44664519adf7f + +commit 9a9ffee6e10bcd039f1f9385599577441ebe542a +Author: djm@openbsd.org +Date: Fri Dec 6 16:21:48 2024 +0000 + + upstream: support VersionAddendum in the client, mirroring the + + option of the same name in the server; bz2745 ok dtucker@ + + OpenBSD-Commit-ID: 6ff7905b3f9806649bde750515786553fb89cdf4 + +commit 41ab0ccecd68232e196efae5e224b31ca104c423 +Author: djm@openbsd.org +Date: Fri Dec 6 16:02:12 2024 +0000 + + upstream: clarify encoding of options/extensions; bz2389 + + OpenBSD-Commit-ID: c4e92356d44dfe6d0a4416deecb33d1d1eba016c + +commit 5488810359f0fd91e2f7b919c70a3798e46376cb +Author: djm@openbsd.org +Date: Fri Dec 6 15:17:15 2024 +0000 + + upstream: ignore SIGPIPE here; some downstreams have had this for + + years... + + OpenBSD-Commit-ID: 73674ee4f8ceb8fc9cb8de71d8ddea0c721eb035 + +commit 4389a792d9078212366eba124a3eed36e009d09e +Author: djm@openbsd.org +Date: Fri Dec 6 15:12:56 2024 +0000 + + upstream: sync -o option lists with ssh.1; requested jmc@ + + OpenBSD-Commit-ID: a7ac295b444da7b2ca7a33a52370594f6897f6bb + +commit 6b9cd095565ddc5402d5096dce248fa0521dbda3 +Author: Fabio Pedretti +Date: Mon Oct 16 17:12:24 2023 +0200 + + Remove ancient RHL 6.x config in RPM spec. + + It looks like build6x options were intended for RHL 6.x + (the Red Hat distro predating Fedora, not RHEL), but were + then applied to RHEL. + + Completely remove support for this ancient configuration. + + Successfully built, installed and run on RHEL 6. This also + remove a build warning about deprecation of PreReq. + +commit 5cacfa798f92b707491375fed748d1d1bcb33ec9 +Author: Darren Tucker +Date: Fri Dec 6 23:54:45 2024 +1100 + + Add new hardware-backed signing key for myself. + + Retire old non-hardware based signing key. + +commit f129b6ee1d4361799e65307216e3a4d5544356b7 +Author: Jonas 'Sortie' Termansen +Date: Sat Nov 2 22:05:45 2024 +0100 + + Fix configure implicit declaration and format warnings. + +commit 11a5e5179077f73c2d45bcdf3f60153ae3f17815 +Author: dtucker@openbsd.org +Date: Fri Dec 6 07:05:54 2024 +0000 + + upstream: Expand $SSH to absolute path if it's not already. + + Prevents problem later in increase_datafile_size if ssh is not in + the path. Patch from quaresmajose via GHPR#510. + + OpenBSD-Regress-ID: 2670a66af8b827410ca7139f0a89f4501cece77b + +commit dc2ef8f0944a4ff7ba19e52fd17b4654e6bd9b93 +Author: dtucker@openbsd.org +Date: Fri Dec 6 06:55:28 2024 +0000 + + upstream: Change "login again" to "log in again" + + in password change message. From ThinLinc-Zeijlon via github PR#532. + + OpenBSD-Commit-ID: fea5e9bc04caf613a118c419f16863733b340cf1 + +commit 8252f346eb21cd6b30816f905b7d94f10962373e +Author: naddy@openbsd.org +Date: Thu Dec 5 22:45:03 2024 +0000 + + upstream: catch up documentation: AES-GCM is preferred to AES-CTR + + OpenBSD-Commit-ID: 63360924b6834507fe70020edb936f5075043a9e + +commit 9a2f4c75081769bd45eba2bf3fab0a32b25f1879 +Author: Darren Tucker +Date: Fri Dec 6 17:56:17 2024 +1100 + + Change text from "login to" to "log in to". + + From ThinLinc-Zeijlon via GHPR#532. + +commit 24dcf368d816b06136a02845ebd0c7846bf18927 +Author: Xavier Hsinyuan +Date: Fri Dec 6 11:56:34 2024 +0800 + + Fix configure message typo in sk-libfido2 standalone. + +commit 1a0cac2f3411a22d69ae6918eff48456b805e73b +Author: Alexander Kanavin +Date: Thu Dec 5 16:26:46 2024 +0100 + + Skip 2038 key expiry test on 64 bit time_t systems. + + This allows testing Y2038 with system time set to after that (i.e. 2040), + so that actual Y2038 issues can be exposed, and not masked by key expiry + errors. + + Signed-off-by: Alexander Kanavin + +commit 6b4611dc1232c5d2c8e43201f580f19aab320c87 +Author: Darren Tucker +Date: Fri Dec 6 01:45:52 2024 +1100 + + Skip 64bit expiry time test on 32bit time_t. + +commit c9b7866a7dc5e6c30f5aa9d22dd0bbafda0d496f +Author: dtucker@openbsd.org +Date: Thu Dec 5 14:28:39 2024 +0000 + + upstream: Add key expiry test in the 64bit time_t range for additional + + coverage. From Alexander Kanavin via bz#3684. + + OpenBSD-Regress-ID: bdf6eb3c2421f2e1e11483d03b34c7931d1bccf7 + +commit 790c913b5fc6ee93ae14793443dc85a0f574b7eb +Author: Damien Miller +Date: Thu Dec 5 19:24:56 2024 +1100 + + typo + +commit d23a23aaeeabc228792e3fd7eb5f2fa6ae13c482 +Author: Damien Miller +Date: Thu Dec 5 08:47:02 2024 +1100 + + add a Makefile target for ssh-verify-attestation + + Not built by default, but easier than doing it by hand + +commit d0ac63d0f8b5f778d5fd326701ef4489bc27635e +Author: dtucker@openbsd.org +Date: Thu Dec 5 06:49:26 2024 +0000 + + upstream: De-magic the x11 base port number into a define. ok djm@ + + OpenBSD-Commit-ID: 23b85ca9d222cb739b9c33ee5e4d6ac9fdeecbfa + +commit 9998c93d57bf0f1df2bc93e0bc2d8112c6f8c720 +Author: dtucker@openbsd.org +Date: Thu Dec 5 06:47:00 2024 +0000 + + upstream: Prevent integer overflow in x11 port handling. These are + + theoretically possible if the admin misconfigures X11DisplayOffset or the + user misconfigures their own $DISPLAY, but don't happen in normal operation. + From Suhov Roman via bz#3730, ok djm@ + + OpenBSD-Commit-ID: e9e3860f1a19b862ccf07dc8ecbe8f1e1034f4ed + +commit 8c9ee046d40e4254c6c1711783ea11027b72c3e9 +Author: djm@openbsd.org +Date: Wed Dec 4 16:42:49 2024 +0000 + + upstream: add a work-in-progress tool to verify FIDO attestation + + blobs that ssh-keygen can write when enrolling FIDO keys. + + OpenBSD-Regress-ID: 6c97bf3f46e48866677ad69f54b77683eb92437f + +commit 50c640d874d0246dd0a0d949398c3d7f757c716a +Author: dtucker@openbsd.org +Date: Wed Dec 4 10:51:13 2024 +0000 + + upstream: Don't assume existence of SK provider in test. Patch from + + balu.gajjala at gmail via bz#3402. + + OpenBSD-Regress-ID: d571932016d07d135b54433d07520b9e1901db43 + +commit 73d782693144262570d3585b62f16b183170c014 +Author: djm@openbsd.org +Date: Wed Dec 4 14:37:55 2024 +0000 + + upstream: sync the list of options accepted by -o with ssh_config.5 + + prompted by bz3455 + + OpenBSD-Commit-ID: 0ecbfa70aea6c769bcc259defe07182edf461f57 + +commit 6993d9f0959534b0b7d52e17b95e9e79fb0b3d0a +Author: djm@openbsd.org +Date: Wed Dec 4 14:24:20 2024 +0000 + + upstream: don't screw up ssh-keygen -l output when the file + + contains CR characters; GHPR236 bz3385, fix from Dmitry Belyavskiy + + OpenBSD-Commit-ID: e458cf6b0adcea5b69ef4c7ba38e590841d02ef4 + +commit c0b03c2534946fc114880092177aa4a3683ced2d +Author: jsg@openbsd.org +Date: Tue Dec 3 22:30:03 2024 +0000 + + upstream: spelling; ok djm@ + + OpenBSD-Commit-ID: c8ff3f70020451eef214e598117b7ce1a29853ef + +commit 97eb247f40167f44324e88a537d5b4fe771a63b2 +Author: dtucker@openbsd.org +Date: Tue Dec 3 16:27:53 2024 +0000 + + upstream: Remove fallback to compiled-in gropup for dhgex when the + + moduli file exists, but does not contain moduli within the client-requested + range. The fallback behaviour remains for the case where the moduli file does + not exist (typically, running tests prior to installing). From bz#2793, based + in part on patch from Joe Testa, ok djm@ + + OpenBSD-Commit-ID: b1a8c5dbbedf249b42474679ebaf14db7332b1ab + +commit 30c746265ebde29806dba77c92fb1fd3803cbf5c +Author: tb@openbsd.org +Date: Tue Dec 3 15:53:51 2024 +0000 + + upstream: Remove redundant field of definition check + + This will allow us to get rid of EC_GROUP_method_of() in the near future. + + ok djm + + OpenBSD-Commit-ID: b4a3d2e00990cf5c2ec6881c21ddca67327c2df8 + +commit eaa1744f34c30740328fd0a0d84b5f2f9e6918c1 +Author: Damien Miller +Date: Thu Dec 5 00:59:19 2024 +1100 + + don't ignore changes in regress Makefiles + + reported by Torben Hansen in bz2880 + +commit 66e986880b2472fefaad781f10113b138b65ff27 +Author: Damien Miller +Date: Thu Dec 5 00:01:33 2024 +1100 + + Support systemd-style socket activation in agent + + Adds support for systemd LISTEN_PID/LISTEN_FDS socket activation to + ssh-agent. Activated when these environment variables are set and + the agent is started with the -d or -D option and no socket path + is set. + + Based on GHPR502 by Daniel Kahn Gillmor, ok dtucker + +commit 9b57c099f57152e6c94f633c114f544087f4bdaa +Author: Darren Tucker +Date: Wed Dec 4 21:36:01 2024 +1100 + + Update readme files to better reflect reality. + + Prompted by bz#3738, ok djm@. + +commit ffa885db1b960451d426455045d2f51288e48ee8 +Author: dtucker@openbsd.org +Date: Tue Dec 3 14:12:47 2024 +0000 + + upstream: Improve description of KbdInteractiveAuthentication. + + Based on bz#3658, fixes jmc@ ok markus@ djm@. + + OpenBSD-Commit-ID: 9fadb56b9afed554d501acbba911c685acd6ffc2 + +commit b460f82a67795bba37c6cc6c78f788e5b435b4cb +Author: Jonas 'Sortie' Termansen +Date: Sat Nov 2 17:53:23 2024 +0100 + + Inherit DESTDIR from the environment. + + autoconf packages conventionally inherit the DESTDIR variable from the + environment. + +commit 9da7fa7c7464df241ae5d17da94e4ebed9013719 +Author: Jonas 'Sortie' Termansen +Date: Sat Nov 2 22:10:39 2024 +0100 + + Define u_short and u_long if needed. + +commit d3a7ff7cecbc23cc37044bdf02e7118d05bf3c35 +Author: djm@openbsd.org +Date: Tue Dec 3 08:31:49 2024 +0000 + + upstream: support FIDO tokens that return no attestation data, e.g. + + recent WinHello. From Michael Braun via GHPR542 + + OpenBSD-Commit-ID: a71b0542f2f7819ba0e33a88908e01b6fc49e4ce + +commit 96b64056c812620014b65371a9e3ac86bfcd08d5 +Author: Thorsten Kukuk +Date: Tue Nov 19 10:53:28 2024 +0100 + + Add wtmpdb support as Y2038 safe wtmp replacement + +commit 1d9563a56f2ad5b0c0aeef20e19c1a03ad54f88a +Author: djm@openbsd.org +Date: Mon Dec 2 14:06:42 2024 +0000 + + upstream: unbreak + + OpenBSD-Commit-ID: 05b6c31f4a6e385338f43cc0e08776cea75802a1 + +commit d75837b9f6d0d6cc18ed5078789ea0f3dad08f00 +Author: djm@openbsd.org +Date: Mon Dec 2 13:37:18 2024 +0000 + + upstream: prefer AES-GCM to AES-CTR; ok deraadt markus + + OpenBSD-Commit-ID: 8366a72e0f300ee31c5dab2c95025387ec15bbc9 + +commit e19cd494b567a73dc390e09b47c1e21545e6116b +Author: Shiva Kaul +Date: Mon Dec 2 02:04:20 2024 -0500 + + Fix compilation with DEBUG_SK enabled + + In `ssh_ecdsa_sk_verify`, the `datalen` variable was renamed to `dlen` -- but not in this debugging block. + +commit 67ace92be0718df7e0f52c0a76684fc2ebae4089 +Author: dtucker@openbsd.org +Date: Fri Nov 29 00:13:36 2024 +0000 + + upstream: Import regenerated moduli. + + OpenBSD-Commit-ID: 311d271bf0fab8a119e84f4f696d8cd40731692f + +commit ca0697a90e5720ba4d76cb0ae9d5572b5260a16c +Author: Jeremy Stott +Date: Sat Oct 19 12:10:52 2024 +1300 + + Add make target for standalone sk-libfido2 + + Add a Makefile target for sk-libfido2, the standalone fido2 security + key shared library, suitable for use with the SecurityKeyProvider + option. + + Add a new configure option `--with-security-key-standalone` that + optionally sets the shared library target sk-libfido2$(SHLIBEXT), and + adds it to $(TARGETS). + + misc.h is required when SK_STANDALONE is defined, because of the use + of `monotime_tv` in `sk_select_by_touch`. + + Sets the shared library extension for sk-libfido2 is by setting + `SHLIBEXT` depending on the platform in configure.ac. + + Add the shared library to the CI builds in the `sk` target config to + make sure it can compile under the same conditions as + `--with-security-key-builtin`. + + Add a libssh-pic.a static library that compiles with `-fPIC` reusing + .c.lo method in sk-dummy.so for use in the shared library sk-libfido2. + + Note, a separate static library libssh-pic.a is needed, since defining + -DSK_STANDALONE excludes some symbols needed in sshkey.lo. + +commit 74d70841efbf41b9fcc8e6f6f4777d2e9d7e2004 +Author: Arnout Engelen +Date: Fri Oct 18 13:42:38 2024 +0200 + + mdoc2man: balance nested square brackets + + I noticed the square brackets in `destination [command [argument...]` + in the synopsis for the `ssh.1` manpage were not balanced, + this balances them. + + Signed-off-by: Arnout Engelen + +commit 8eabd2ae2ca1d7756417a1ee5b41f09c5d997634 +Author: djm@openbsd.org +Date: Wed Nov 27 16:07:08 2024 +0000 + + upstream: fix argument of "Compression" directive in ssh -G config + + dump, which used to work but broke in 9.8 + + OpenBSD-Commit-ID: c79936242d29c70d01941b28d2d07fd0b85fe46f + +commit 53c03961769d8879a81398074ea3cb36253d4f2e +Author: djm@openbsd.org +Date: Wed Nov 27 13:27:34 2024 +0000 + + upstream: new name/link for agent I-D + + OpenBSD-Commit-ID: e3420f3925a297a1b2ab7dfe7c7d274cfc8e1193 + +commit 785e3c9110df8f2d30e42ce8b45969c49700f35b +Author: djm@openbsd.org +Date: Wed Nov 27 13:00:23 2024 +0000 + + upstream: mention that biometrics may be used for FIDO key user + + verification as well as PIN. Prompted by Zack Newman, ok jmc@ + + OpenBSD-Commit-ID: b774a4438c9be70012661ee278450790d21277b8 + +commit fd2e64c9ec9ea3e89e396be0db41aaf982ae1210 +Author: djm@openbsd.org +Date: Tue Nov 26 22:05:51 2024 +0000 + + upstream: g/c outdated XXX comments + + OpenBSD-Commit-ID: 74d0c0b74994d9a4343c4d7ea4948cb34f609a6c + +commit 0ad34a6193357d286042322ea7347262a6fb0778 +Author: djm@openbsd.org +Date: Tue Nov 26 22:02:28 2024 +0000 + + upstream: regression test for UpdateHostkeys with multiple keys backed + + by ssh-agent. Patch from Maxime Rey. + + OpenBSD-Regress-ID: 1777ab6e639e57c0e20cbcb6df60455b49fd8bb3 + +commit 84023656d91b78f1ef86c8321ec563f2e90f7227 +Author: djm@openbsd.org +Date: Tue Nov 26 22:01:37 2024 +0000 + + upstream: Explicitly specify the signature algorithm when signing + + hostkeys-prove requests. + + Fixes a corner-case triggered by UpdateHostKeys with one or more unknown + host keys stored in ssh-agent where sshd refuses to accept the signature + coming back from the agent. + + Report/fix from Maxime Rey + + OpenBSD-Commit-ID: 460c7d527a24f92b7e5f68ca1a2fa242ebf0d086 + +commit d1c1cfc5e4e9b43593d4642810ea8135e4c7db49 +Author: djm@openbsd.org +Date: Tue Nov 26 21:23:35 2024 +0000 + + upstream: when using RSA keys to sign messages, select the + + signature algorithm based on the requested hash algorithm ("-Ohashalg=xxx"). + + This allows using something other than rsa-sha2-512, which may not + be supported on all signing backends, e.g. some smartcards only + support SHA256. + + Patch from Morten Linderud; ok markus@ + + OpenBSD-Commit-ID: 246353fac24e92629263996558c6788348363ad7 + +commit ac7544654441280071b90a4129a47467d40f2389 +Author: djm@openbsd.org +Date: Sun Nov 24 23:47:50 2024 +0000 + + upstream: turn off CDIAGFLAGS and turn back on INSTALL_STRIP + + accidentally changed in last commit + + OpenBSD-Commit-ID: 6d07e4606997e36b860621a14dd41975f2902f8f + +commit 953fa5b59afb04c3c74ed82d7bace65c13cd8baa +Author: Darren Tucker +Date: Sat Nov 9 11:41:44 2024 +1100 + + Disable security key for bigendian interop. + + It doesn't currently work. It's not clear why, but I suspect + sk-dummy.so ends up being built for the wrong architecture. + +commit a80eb71c428c474098087c672398f200be8fabdf +Author: Darren Tucker +Date: Sat Nov 9 05:14:16 2024 +1100 + + Reshuffle OpenWRT test configs. + + Move the the flags used by the OpenWRT distro to mipsel target and + enable OpenSSL on all targets to improve coverage. + + Explicitly disable security key and openssl on mips target so that host + end of the bigendian interop tests don't attempt them and fail (since + they're not enabled on the target side). + +commit d2709c461359e4129311cdff81ee05242d6c53cd +Author: Darren Tucker +Date: Sat Nov 9 03:26:08 2024 +1100 + + Add keytype to bigendian interop test. + +commit 50ac0f0e0627d29fd9becf5e15e8ceca5ad18078 +Author: Darren Tucker +Date: Sat Nov 9 03:24:29 2024 +1100 + + Ignore chown failure, eg due to dangling symlinks. + +commit 9e528e65a03245cf28e814f09b88c701bec935d1 +Author: Darren Tucker +Date: Sat Nov 2 18:05:41 2024 +1100 + + Test bigendian interop. + + Where our test target is a bigendian system, do an additional build on + the runner host (which is little endian) and test interop between the two. + Should hopefully catch obvious endianness bugs. + +commit dd416f5bfa96ac1ff44b27a93f7b55ee627c6baf +Author: Darren Tucker +Date: Fri Nov 1 19:44:29 2024 +1100 + + Allow overridding TEST_SSH_SSHD. + + This will allow tests to specify an alternative sshd, eg on a remote + machine with different endianness. + +commit 82662d562cf54829df8a941cdfb2fd307e1d9a90 +Author: djm@openbsd.org +Date: Wed Nov 6 22:51:26 2024 +0000 + + upstream: ssh-agent implemented an all-or-nothing allow-list of + + FIDO application IDs for security key-backed keys, to prevent web key handles + from being used remotely as this would likely lead to unpleasant surprises. + By default, only application IDs that start with "ssh:*" are allowed. + + This adds a -Owebsafe-allow=... argument that can override the default + list with a more or less restrictive one. The default remains unchanged. + + ok markus@ + + OpenBSD-Commit-ID: 957c1ed92a8d7c87453b9341f70cb3f4e6b23e8d + +commit 593a0b65c55c1e06a8c22b084aefc395aedb0127 +Author: jca@openbsd.org +Date: Mon Nov 4 21:59:15 2024 +0000 + + upstream: Ignore extra groups that don't fit in the buffer passed + + to getgrouplist(3) + + Our kernel supports 16 groups (NGROUPS_MAX), but nothing prevents + an admin from adding a user to more groups. With that tweak we'll keep + on ignoring them instead of potentially reading past the buffer passed to + getgrouplist(3). That behavior is explicitely described in initgroups(3). + + ok millert@ gilles@ + + OpenBSD-Commit-ID: a959fc45ea3431b36f52eda04faefc58bcde00db + +commit e7adebeff3a9d038d0eaeeb0fcefedf29acb7e90 +Author: Damien Miller +Date: Mon Nov 4 14:39:27 2024 +1100 + + Add git signing key for Tim Rice + +commit da4b84845e874f12af7e0686170fa391c919d1df +Author: Darren Tucker +Date: Fri Nov 1 18:51:22 2024 +1100 + + Correct path to c-cpp.yml file in workflow config. + +commit 28740aa2c75392a9c4191eb9523f9b20853e2932 +Author: Darren Tucker +Date: Fri Nov 1 18:44:42 2024 +1100 + + Test new OpenSSL and LibreSSL releases.` + +commit a74809fe06540f16231b354ffe21fcbf39e81f73 +Author: Darren Tucker +Date: Fri Nov 1 18:44:00 2024 +1100 + + Add nbsd10 default test config. + +commit 88b35cbdc1500efece65cd6a9a20a72cf7e46eaa +Author: Damien Miller +Date: Wed Oct 30 14:25:14 2024 +1100 + + fix uint64_t types; reported by Tom G. Christensen + +commit ef7c26cd2f0f9a8222f851d1e551f6dfd3113f8b +Author: Damien Miller +Date: Sun Oct 27 13:28:11 2024 +1100 + + htole64() etc for systems without endian.h + +commit 0c3927c45f8a57b511c874c4d51a8c89414f74ef +Author: djm@openbsd.org +Date: Sun Oct 27 02:06:59 2024 +0000 + + upstream: explicitly include endian.h + + OpenBSD-Commit-ID: 13511fdef7535bdbc35b644c90090013da43a318 + +commit cf3e48ee8ba1beeccddd2f203b558fa102be67a2 +Author: djm@openbsd.org +Date: Sun Oct 27 02:06:01 2024 +0000 + + upstream: fix ML-KEM768x25519 KEX on big-endian systems; spotted by + + jsg@ feedback/ok deraadt@ + + OpenBSD-Commit-ID: 26d81a430811672bc762687166986cad40d28cc0 + +commit ae566d51b64fa3dce7063e7745b9b35f8f47abde +Author: naddy@openbsd.org +Date: Fri Oct 25 21:53:24 2024 +0000 + + upstream: mlkem768x25519-sha256 has been promoted to default key + + exchange + + OpenBSD-Commit-ID: 5a3259a193fd42108a869ebf650b95b5f2d08dcf + +commit 3af1dba1384ca896df6e973c70398c41d36de1ea +Author: Darren Tucker +Date: Fri Oct 25 19:04:30 2024 +1100 + + Retire the minix3 test config. + + It got broken by the sshd-auth change, it's not obvious why, and the + platform lacks the debugging tools (eg gdb, strace) to figure it out. + The upstream project seems effectively dead (6 years since the last + commit, 10 since the last release). It was useful while it lasted + (we found a real bug because of it) but its time seems to have passed. + +commit 3b240cc44b8de9175280ddbe59331317d427b0e3 +Author: Preetish Amballi +Date: Mon Oct 21 14:07:02 2024 +0000 + + Updated gitignore to ignore sshd-session and sshd-auth targets + +commit 326495744f06a0ab18ee0d16f87b3fe91cac92fb +Author: Darren Tucker +Date: Fri Oct 25 19:01:02 2024 +1100 + + Simplify pselect shim and remove side effects. + + Instead of maintaing state (pipe descriptors, signal handlers) across + pselect-on-select invocations, set up and restore them each call. + This prevents outside factors (eg a closefrom or signal handler + installation) from potentially causing problems. This does result in a + drop in throughput of a couple of percent on geriatric platforms without + a native pselect due to the extra overhead. Tweaks & ok djm@ + +commit e53b615f3934ffac1efb3c1e491d126b9b09fd24 +Author: djm@openbsd.org +Date: Fri Oct 25 01:34:18 2024 +0000 + + upstream: promote mlkem768x25519-sha256 to be the default key exchange; + + ok markus@ + + OpenBSD-Commit-ID: fc673065e6505bb06b2e2b9362f78ccb4200a828 + +commit de644b1831b970f6655f871c051774cc871e8e74 +Author: djm@openbsd.org +Date: Thu Oct 24 03:28:34 2024 +0000 + + upstream: test SIGUSR1 dropping all keys from ssh-agent + + OpenBSD-Regress-ID: 8654b9aa8eb695b1499fffc408c25319592bf0e0 + +commit e86d7a077ce9a2b9ee9d4138c358a17cbdb786f9 +Author: djm@openbsd.org +Date: Thu Oct 24 03:15:47 2024 +0000 + + upstream: amake ssh-agent drop all keys when it receives SIGUSR1; + + let's users zap keys without access to $SSH_AUTH_SOCK + + ok deraadt@ + + OpenBSD-Commit-ID: dae9db0516b1011e5ba8c655ac702fce42e6c023 + +commit 94cdfebec852a2429c008cc2a55f8e4183f36972 +Author: djm@openbsd.org +Date: Thu Oct 24 03:14:37 2024 +0000 + + upstream: relax valid_domain() checks to allow an underscore as the + + first character. ok deraadt@ + + OpenBSD-Commit-ID: 3f8be6d32496e5596dd8b14e19cb067ddd7969ef + +commit 1b05d5437bf45bee5e3104772dea06ed51764f1b +Author: dtucker@openbsd.org +Date: Tue Oct 22 07:13:28 2024 +0000 + + upstream: Remove sshd logfile in start_sshd + + ... and ssh and sshd log wrappers before recreating them. Prevents "can't + create" errors during tests when running tests without SUDO after having + run them with SUDO. + + OpenBSD-Regress-ID: 2f0a83532e3dccd673a9bf0291090277268c69a6 + +commit 307ab3c7720f8879b835614b02687358ee4df9b9 +Author: dtucker@openbsd.org +Date: Tue Oct 22 06:16:26 2024 +0000 + + upstream: Add a sshd debug wrapper + + ... to run all of the subprograms from the build directory while + developing and debugging. Should help prevent accidentally testing + against unchanged installed sshd-auth and sshd-session binaries. ok djm@ + + OpenBSD-Commit-ID: 61760cdc98c2bc8f1e9f83a6f97cca0f66b52e69 + +commit 87bd1cb3ccba5e91d2650eb7f753c898ee43858e +Author: dtucker@openbsd.org +Date: Tue Oct 22 06:13:00 2024 +0000 + + upstream: Make debug call printf("%s", NULL) safe. + + Prevents problems on platforms where this isn't safe (which it's not + required to be). ok djm@ + + OpenBSD-Commit-ID: 8fa4ce3ad90915c925b81b99a79ab920b0523387 + +commit c44c349edd157b2c00c42bd5ef5f9dfb37de26f3 +Author: Darren Tucker +Date: Tue Oct 22 17:48:32 2024 +1100 + + Resync cvsid missed in commit 6072e4c9. + +commit fe4305c37ffe53540a67586854e25f05cf615849 +Author: djm@openbsd.org +Date: Fri Oct 18 05:53:26 2024 +0000 + + upstream: mention that LocalForward and RemoteForward can accept Unix + + domain socket paths; GHPR115 + + OpenBSD-Commit-ID: a8a34d0a0c51a9ddab3dfce615f9878fa76ef842 + +commit 9c97b6af8e052ab5ffe0f9096fadc8f9a4d0ed0f +Author: djm@openbsd.org +Date: Fri Oct 18 05:45:40 2024 +0000 + + upstream: remove duplicate check; GHPR392 from Pedro Martelletto + + OpenBSD-Commit-ID: 597ab7dd3f0e78939d2659fc1904d0f39ee95487 + +commit d9cd208e89a471a3ff8adfcec68d6210af9e9fd5 +Author: djm@openbsd.org +Date: Fri Oct 18 05:37:24 2024 +0000 + + upstream: allow "-" as output file for moduli screening + + based on GHPR393 + + OpenBSD-Commit-ID: 1517763764eb55d03a6092dd120d2909c6fef0e1 + +commit 5eb5c4b2820d0636b1eccee646fb32ec946c4a95 +Author: djm@openbsd.org +Date: Fri Oct 18 05:32:51 2024 +0000 + + upstream: ssh-keyscan doesn't need it's own sshfatal() definition, it + + can use the shared one from fatal.c + + based on GHPR401 from lengyijun + + OpenBSD-Commit-ID: 8ea75ea99f27f464c9223cbc89cb046ccf9cd5c4 + +commit 0a1e75499e2c6fc258ee903645c878480949f362 +Author: djm@openbsd.org +Date: Fri Oct 18 05:14:51 2024 +0000 + + upstream: in _ssh_order_hostkeyalgs() consider ECDSA curve type when + + arranging the hostkey algorithms. AFAIK this code is unused in OpenSSH, but I + guess others are using it + + based on GHPR387 from Pawel Jakub Dawidek + + OpenBSD-Commit-ID: 4d462495ac0c40f7b7dd66178e0005b9b2128225 + +commit d01ee7a88c5f4b1aa8c75a7c739f8f3bc1ad8bde +Author: djm@openbsd.org +Date: Fri Oct 18 05:03:34 2024 +0000 + + upstream: require control-escape character sequences passed via the '-e + + ^x' commandline to be exactly two characters long. Avoids one by OOB read if + ssh is invoked as "ssh -e^ ..." + + Spotted by Maciej Domanski in GHPR368 + + OpenBSD-Commit-ID: baa72bc60898fc5639e6c62de7493a202c95823d + +commit 74ff6382f5743e09930e6cbd195dac65cd6062c9 +Author: djm@openbsd.org +Date: Fri Oct 18 04:30:09 2024 +0000 + + upstream: remove addr.[ch] functions that are unused and + + visbility-restrict ones that are unused outside the implementation itself; + based on GHPR#282 by tobias@ + + OpenBSD-Commit-ID: a0140f2418b4d46cfaa7b33febc0a0931f9b2744 + +commit a9d6d7d93c533fa729f08b405e786d912553f33e +Author: djm@openbsd.org +Date: Fri Oct 18 04:14:59 2024 +0000 + + upstream: unreachable POLLERR case; from ya0guang via GHPR485 + + OpenBSD-Commit-ID: b3c82655190532b01eb817e532742cfaa4687eff + +commit d76424bf279ff951383e21213eb3759ea4090674 +Author: djm@openbsd.org +Date: Fri Oct 18 04:11:54 2024 +0000 + + upstream: s/Sx/Cm/ for external references; from Domen Puncer + + Kugler via GHPR501 + + OpenBSD-Commit-ID: f864a34feb5d5ff17160cf7c42ad0f7744fe8a3f + +commit ca204b994e2981e7bf95627b3105408917105649 +Author: naddy@openbsd.org +Date: Mon Oct 14 23:53:34 2024 +0000 + + upstream: mention SshdAuthPath option; ok djm@ + + OpenBSD-Commit-ID: 9a5d3add25e4e77bd3805bc5583a842ecf34d85c + +commit be27770e840c4dd9d9fcad1aa879400c727d7c2f +Author: Darren Tucker +Date: Fri Oct 18 13:37:55 2024 +1100 + + Remove references to systrace and pledge sandboxes. + + ok djm@ + +commit 49e64bf63fbf2f14961062dafe8ef08cb816bb08 +Author: Pavel Miadzvedzeu +Date: Wed Apr 24 10:19:56 2024 +0300 + + Fix "undeclared 'ut'" error by replacing it with 'utx' + +commit 67f684733f60f66479854a2867b953de731e71b2 +Author: Darren Tucker +Date: Thu Oct 17 20:50:29 2024 +1100 + + Seed RNG when starting up sshd-auth. + + Makes builds configured --without-openssl work again since otherwise + the first use of the RNG comes after the sandbox init and it can't + open /dev/random. + +commit c06c681aeebbe8e84e7410095514e7ee91f7e6cb +Author: Darren Tucker +Date: Thu Oct 17 19:18:23 2024 +1100 + + MacOS 12 runners are deprecated, replace with 15. + +commit 39db1f23bafb48a7c0cc9c65c716a0370f4cc677 +Author: Damien Miller +Date: Thu Oct 17 13:28:47 2024 +1100 + + Fix lookup path for sshd-auth; bz3745 + +commit c537eeb1ae5f069450053b0027e64efe5bdb37d2 +Author: Damien Miller +Date: Wed Oct 16 08:28:21 2024 +1100 + + fix breakage; missing saved_argc symbol + +commit 98a0883bdef28a06c7e017f27adf21ba57898bf4 +Author: Damien Miller +Date: Mon Oct 14 17:17:50 2024 +1100 + + fix capsicum sandbox + +commit 164ea4380564a2a83713eacf71908e3946e5e4e4 +Author: Damien Miller +Date: Mon Oct 14 17:16:41 2024 +1100 + + put back some portable bits for sshd-auth.c + +commit f8edf08c258ee2918689872c4702302052729726 +Author: Damien Miller +Date: Mon Oct 14 14:49:25 2024 +1100 + + there's only one sandbox, move to a static global + +commit 4482f0042b41d3d63c3845d7ba9fcf47c9252a84 +Author: Damien Miller +Date: Mon Oct 14 14:49:20 2024 +1100 + + depend + +commit 74856204a353a187dc6e7706c6cf84b7f14d775d +Author: djm@openbsd.org +Date: Mon Oct 14 03:02:08 2024 +0000 + + upstream: regress support for split sshd-auth binary + + OpenBSD-Regress-ID: df7d18a87b475f70004770f0f4e404adba5f6ab7 + +commit 461741083d7254595fecea274e60fe3ebf3ce3f9 +Author: djm@openbsd.org +Date: Fri Sep 27 01:05:54 2024 +0000 + + upstream: test some more Match syntax, including criteria=arg and + + negations + + OpenBSD-Regress-ID: 67476baccc60bf1a255fd4e329ada950047b8b8d + +commit 6072e4c9385713e9c166f32cfca6a7e603d4f0b8 +Author: djm@openbsd.org +Date: Mon Oct 14 01:57:50 2024 +0000 + + upstream: Split per-connection sshd-session binary + + This splits the user authentication code from the sshd-session + binary into a separate sshd-auth binary. This will be executed by + sshd-session to complete the user authentication phase of the + protocol only. + + Splitting this code into a separate binary ensures that the crucial + pre-authentication attack surface has an entirely disjoint address + space from the code used for the rest of the connection. It also + yields a small runtime memory saving as the authentication code will + be unloaded after thhe authentication phase completes. + + Joint work with markus@ feedback deraadt@ + + Tested in snaps since last week + + OpenBSD-Commit-ID: 9c3b2087ae08626ec31b4177b023db600e986d9c + +commit fe6c6330c1a94c7a537efe9069853ce7a275c50a +Author: djm@openbsd.org +Date: Sun Oct 13 22:20:06 2024 +0000 + + upstream: don't start the ObscureKeystrokeTiming mitigations if + + there has been traffic on a X11 forwarding channel recently. + + Should fix X11 forwarding performance problems when this setting is + enabled. Patch from Antonio Larrosa via bz3655 + + OpenBSD-Commit-ID: 820284a92eb4592fcd3d181a62c1b86b08a4a7ab + +commit 538cd28598ae942c94b99855b06fdd937e2e7381 +Author: jsg@openbsd.org +Date: Sat Oct 12 10:50:37 2024 +0000 + + upstream: remove duplicate misc.h include ok dtucker@ + + OpenBSD-Commit-ID: fdd056e7854294834d54632b4282b877cfe4c12e + +commit 0051381a8c33740a77a1eca6859efa1c78887d80 +Author: djm@openbsd.org +Date: Sun Oct 6 23:37:17 2024 +0000 + + upstream: Turn off finite field (a.k.a modp) Diffie-Hellman key + + exchange in sshd by default. Specifically, this removes the + diffie-hellman-group* and diffie-hellman-group-exchange-* methods. The client + is unchanged and continues to support these methods by default. + + Finite field Diffie Hellman is slow and computationally expensive for + the same security level as Elliptic Curve DH or PQ key agreement while + offering no redeeming advantages. + + ECDH has been specified for the SSH protocol for 15 years and some + form of ECDH has been the default key exchange in OpenSSH for the last + 14 years. + + ok markus@ + + OpenBSD-Commit-ID: 4e238ad480a33312667cc10ae0eb6393abaec8da + +commit 67a115e7a56dbdc3f5a58c64b29231151f3670f5 +Author: djm@openbsd.org +Date: Thu Sep 26 23:55:08 2024 +0000 + + upstream: fix previous change to ssh_config Match, which broken on + + negated Matches; spotted by phessler@ ok deraadt@ + + OpenBSD-Commit-ID: b1c6acec66cd5bd1252feff1d02ad7129ced37c7 + +commit 220b6c1290042acd5180d783dea01efe1365c265 +Author: jsg@openbsd.org +Date: Wed Sep 25 23:01:39 2024 +0000 + + upstream: remove some unused defines; ok djm@ + + OpenBSD-Commit-ID: 3a63e4e11d455704f684c28715d61b17f91e0996 + +commit 3ef4f6e8a4d774f73852391fdccbb95f39fc71bf +Author: jmc@openbsd.org +Date: Wed Sep 25 06:13:01 2024 +0000 + + upstream: remove some unneeded Xo/Xc calls; from evan silberman the + + original diff had a couple of errors, which i've fixed + + OpenBSD-Commit-ID: f37ad5888adbc0d4e1cd6b6de237841f4b1e650d + +commit 3f02368e8e9121847727c46b280efc280e5eb615 +Author: djm@openbsd.org +Date: Wed Sep 25 01:24:04 2024 +0000 + + upstream: fix regression introduced when I switched the "Match" + + criteria tokeniser to a more shell-like one. Apparently the old tokeniser + (accidentally?) allowed "Match criteria=argument" as well as the "Match + criteria argument" syntax that we tested for. + + People were using this syntax so this adds back support for + "Match criteria=argument" + + bz3739 ok dtucker + + OpenBSD-Commit-ID: d1eebedb8c902002b75b75debfe1eeea1801f58a + +commit 9517cc58577f85a0ba5f8bb46778dff625f0688f +Author: djm@openbsd.org +Date: Tue Sep 24 02:28:17 2024 +0000 + + upstream: some extra paranoia, reminded by jsg@ + + OpenBSD-Commit-ID: 22072bfa1df1391858ae7768a6c627e08593a91e + +commit 815a94e86a68c1000b8310cb47695cea9329516c +Author: Damien Miller +Date: Wed Sep 25 11:15:45 2024 +1000 + + gss-serv.c needs sys/param.h + + From Void Linux + +commit 76a618d2842c34c16cd21a4efc7230e2f459008d +Author: Damien Miller +Date: Wed Sep 25 11:13:05 2024 +1000 + + build construct_utmp() when USE_BTMP is set + + Fixes compile error on Void Linux/Musl + +commit d3aee17f6d395202eaa42a0c449b6da41f61527c +Author: Darren Tucker +Date: Tue Sep 24 18:41:44 2024 +1000 + + Test the flags from OpenWRT's package. + +commit 0f5d19e6fe4b58a89e6dc8c71a2aae30365d193e +Author: Christoph Ostarek +Date: Wed Jul 3 12:46:59 2024 +0200 + + fix utmpx ifdef + + 02e16ad95fb1f56ab004b01a10aab89f7103c55d did a copy-paste for + utmpx, but forgot to change the ifdef appropriately + +commit e03239f999acf9dc3da0f2f72bde36abbe678911 +Author: jsg@openbsd.org +Date: Sun Sep 22 12:56:21 2024 +0000 + + upstream: remove some unused defines; ok djm@ + + OpenBSD-Commit-ID: 81869ee6356fdbff19dae6ff757095e6b24de712 + +commit a35f543d3a6275fef781e515c262d1c687c3bc28 +Author: jsg@openbsd.org +Date: Fri Sep 20 02:00:46 2024 +0000 + + upstream: remove unneeded semicolons; checked by millert@ + + OpenBSD-Commit-ID: 3fb621a58e04b759a875ad6a33f35bb57ca80231 + +commit 1641f2d4d6e05d2147913442864cae546e64f08b +Author: Darren Tucker +Date: Mon Sep 23 20:52:31 2024 +1000 + + Add 9.9 branch to CI status console. + +commit 46d1fb16b20e971b9ac15e86a3d3e350b49c9ad6 +Author: Damien Miller +Date: Fri Sep 20 08:20:13 2024 +1000 + + update version numbers + +commit 0bdca1f218971b38728a0a129f482476baff0968 +Author: djm@openbsd.org +Date: Thu Sep 19 22:17:44 2024 +0000 + + upstream: openssh-9.9 + + OpenBSD-Commit-ID: 303417285f1a73b9cb7a2ae78d3f493bbbe31f98 + +commit ef2d7f2d3e1b4c9ae71bacf963e76a92ab8be543 +Author: Damien Miller +Date: Wed Sep 18 16:03:23 2024 +1000 + + include openbsd-compat/base64.c license in LICENSE + +commit 7ef362b989c8d1f7596f557f22e5924b9c08f0ea +Author: Damien Miller +Date: Wed Sep 18 09:01:23 2024 +1000 + + conditionally include mman.h in arc4random code + +commit 5fb2b5ad0e748732a27fd8cc16a7ca3c21770806 +Author: Damien Miller +Date: Tue Sep 17 11:53:24 2024 +1000 + + fix bug in recently-added sntrup761 fuzzer + + key values need to be static to persist across invocations; + spotted by the Qualys Security Advisory team. + +commit 0ca128c9ee894f1b0067abd473bfb33171df67f8 +Author: djm@openbsd.org +Date: Mon Sep 16 05:37:05 2024 +0000 + + upstream: use 64 bit math to avoid signed underflow. upstream code + + relies on using -fwrapv to provide defined over/underflow behaviour, but we + use -ftrapv to catch integer errors and abort the program. ok dtucker@ + + OpenBSD-Commit-ID: 8933369b33c17b5f02479503d0a92d87bc3a574b + +commit f82e5e22cad88c81d8a117de74241328c7b101c3 +Author: jmc@openbsd.org +Date: Sun Sep 15 08:27:38 2024 +0000 + + upstream: minor grammar/sort fixes for refuseconnection; ok djm + + OpenBSD-Commit-ID: 1c81f37b138b8b66abba811fec836388a0f3e6da + +commit 0c1165fc78e8fe69b5df71f81a8f944554a68b53 +Author: Damien Miller +Date: Sun Sep 15 13:30:13 2024 +1000 + + avoid gcc warning in fuzz test + +commit ce171d0718104b643854b53443ff72f7283d33f2 +Author: djm@openbsd.org +Date: Sun Sep 15 03:09:44 2024 +0000 + + upstream: bad whitespace in config dump output + + OpenBSD-Commit-ID: d899c13b0e8061d209298eaf58fe53e3643e967c + +commit 671c440786a5a66216922f15d0007b60f1e6733f +Author: Damien Miller +Date: Sun Sep 15 12:53:59 2024 +1000 + + use construct_utmp to construct btmp records + + Simpler and removes some code with the old-style BSD license. + +commit 930cb02b6113df72fbc732b9feb8e4f490952a81 +Author: djm@openbsd.org +Date: Sun Sep 15 02:20:51 2024 +0000 + + upstream: update the Streamlined NTRU Prime code from the "ref" + + implementation in SUPERCOP 20201130 to the "compact" implementation in + SUPERCOP 20240808. The new version is substantially faster. Thanks to Daniel + J Bernstein for pointing out the new implementation (and of course for + writing it). + + tested in snaps/ok deraadt@ + + OpenBSD-Commit-ID: bf1a77924c125ecdbf03e2f3df8ad13bd3dafdcb + +commit 9306d6017e0ce5dea6824c29ca5ba5673c2923ad +Author: djm@openbsd.org +Date: Sun Sep 15 01:19:56 2024 +0000 + + upstream: document Match invalid-user + + OpenBSD-Commit-ID: 2c84a9b517283e9711e2812c1f268081dcb02081 + +commit 0118a4da21147a88a56dc8b90bbc2849fefd5c1e +Author: djm@openbsd.org +Date: Sun Sep 15 01:18:26 2024 +0000 + + upstream: add a "Match invalid-user" predicate to sshd_config Match + + options. + + This allows writing Match conditions that trigger for invalid username. + E.g. + + PerSourcePenalties refuseconnection:90s + Match invalid-user + RefuseConnection yes + + Will effectively penalise bots try to guess passwords for bogus accounts, + at the cost of implicitly revealing which accounts are invalid. + + feedback markus@ + + OpenBSD-Commit-ID: 93d3a46ca04bbd9d84a94d1e1d9d3a21073fbb07 + +commit 7875975136f275619427604900cb0ffd7020e845 +Author: djm@openbsd.org +Date: Sun Sep 15 01:11:26 2024 +0000 + + upstream: Add a "refuseconnection" penalty class to sshd_config + + PerSourcePenalties + + This allows penalising connection sources that have had connections + dropped by the RefuseConnection option. ok markus@ + + OpenBSD-Commit-ID: 3c8443c427470bb3eac1880aa075cb4864463cb6 + +commit 8d21713b669b8516ca6d43424a356fccc37212bb +Author: djm@openbsd.org +Date: Sun Sep 15 01:09:40 2024 +0000 + + upstream: Add a sshd_config "RefuseConnection" option + + If set, this will terminate the connection at the first authentication + request (this is the earliest we can evaluate sshd_config Match blocks) + + ok markus@ + + OpenBSD-Commit-ID: 43cc2533984074c44d0d2f92eb93f661e7a0b09c + +commit acad117e66018fe1fa5caf41b36e6dfbd61f76a1 +Author: djm@openbsd.org +Date: Sun Sep 15 00:58:01 2024 +0000 + + upstream: switch sshd_config Match processing to the argv tokeniser + + too; ok markus@ + + OpenBSD-Commit-ID: b74b5b0385f2e0379670e2b869318a65b0bc3923 + +commit baec3f7f4c60cd5aa1bb9adbeb6dfa4a172502a8 +Author: djm@openbsd.org +Date: Sun Sep 15 00:57:36 2024 +0000 + + upstream: switch "Match" directive processing over to the argv + + string tokeniser, making it possible to use shell-like quoting in Match + directives, particularly "Match exec". ok markus@ + + OpenBSD-Commit-ID: 0877309650b76f624b2194c35dbacaf065e769a5 + +commit dd424d7c382c2074ab70f1b8ad4f169a10f60ee7 +Author: djm@openbsd.org +Date: Sun Sep 15 00:47:01 2024 +0000 + + upstream: include pathname in some of the ssh-keygen passphrase + + prompts. Helps the user know what's going on when ssh-keygen is invoked via + other tools. Requested in GHPR503 + + OpenBSD-Commit-ID: 613b0bb6cf845b7e787d69a5b314057ceda6a8b6 + +commit 62bbf8f825cc390ecb0523752ddac1435006f206 +Author: djm@openbsd.org +Date: Sun Sep 15 00:41:18 2024 +0000 + + upstream: Do not apply authorized_keys options when signature + + verification fails. Prevents restrictive key options being incorrectly + applied to subsequent keys in authorized_keys. bz3733, ok markus@ + + OpenBSD-Commit-ID: ba3776d9da4642443c19dbc015a1333622eb5a4e + +commit 49f325fd47af4e53fcd7aafdbcc280e53f5aa5ce +Author: Wu Weixin +Date: Fri Aug 2 22:16:40 2024 +0800 + + Fix without_openssl always being set to 1 + + In Fedora systems, %{?rhel} is empty. In RHEL systems, %{?fedora} is + empty. Therefore, the original code always sets without_openssl to 1. + +commit c21c3a2419bbc1c59cb1a16ea356e703e99a90d9 +Author: djm@openbsd.org +Date: Thu Sep 12 00:36:27 2024 +0000 + + upstream: Relax absolute path requirement back to what it was prior to + + OpenSSH 9.8, which incorrectly required that sshd was started with an + absolute path in inetd mode. bz3717, patch from Colin Wilson + + OpenBSD-Commit-ID: 25c57f22764897242d942853f8cccc5e991ea058 + +commit 1bc426f51b0a5cfdcfbd205218f0b6839ffe91e9 +Author: naddy@openbsd.org +Date: Mon Sep 9 14:41:21 2024 +0000 + + upstream: document the mlkem768x25519-sha256 key exchange algorithm + + OpenBSD-Commit-ID: fa18dccdd9753dd287e62ecab189b3de45672521 + +commit 0a2db61a5ffc64d2e2961c52964f933879952fc7 +Author: Darren Tucker +Date: Tue Sep 10 21:11:14 2024 +1000 + + Spell omnios test host correctly. + +commit 059ed698a47c9af541a49cf754fd09f984ac5a21 +Author: Darren Tucker +Date: Tue Sep 10 18:52:02 2024 +1000 + + Add omnios test target. + +commit f4ff91575a448b19176ceaa8fd6843a25f39d572 +Author: Darren Tucker +Date: Tue Sep 10 18:45:55 2024 +1000 + + Wrap stdint.h in ifdef. + +commit ff714f001d20a9c843ee1fd9d92a16d40567d264 +Author: Darren Tucker +Date: Mon Sep 9 19:31:54 2024 +1000 + + Also test PAM on dfly64. + +commit 509b757c052ea969b3a41fc36818b44801caf1cf +Author: Damien Miller +Date: Mon Sep 9 21:50:14 2024 +1000 + + stubs for ML-KEM KEX functions + + used for C89 compilers + +commit 273581210c99ce7275b8efdefbb9f89e1c22e341 +Author: Damien Miller +Date: Mon Sep 9 17:30:38 2024 +1000 + + declare defeat trying to detect C89 compilers + + I can't find a reliable way to detect the features the ML-KEM code + requires in configure. Give up for now and use VLA support (that we + can detect) as a proxy for "old compiler" and turn off ML-KEM if + it isn't supported. + +commit e8a0f19b56dfa20f98ea9876d7171ec315fb338a +Author: Damien Miller +Date: Mon Sep 9 16:46:40 2024 +1000 + + fix previous; check for C99 compound literals + + The previous commit was incorrect (or at least insufficient), the + ML-KEM code is actually using compound literals, so test for them. + +commit 7c07bec1446978bebe0780ed822c8fedfb377ae8 +Author: Damien Miller +Date: Mon Sep 9 16:06:21 2024 +1000 + + test for compiler feature needed for ML-KEM + + The ML-KEM implementation we uses need the compiler to support + C99-style named struct initialisers (e.g foo = {.bar = 1}). We + still support (barely) building OpenSSH with older compilers, so + add a configure test for this. + +commit d469d5f348772058789d35332d1ccb0b109c28ef +Author: djm@openbsd.org +Date: Mon Sep 9 03:13:39 2024 +0000 + + upstream: test mlkem768x25519-sha256 + + OpenBSD-Regress-ID: 7baf6bc39ae55648db1a2bfdc55a624954847611 + +commit 62fb2b51bb7f6863c3ab697f397b2068da1c993f +Author: djm@openbsd.org +Date: Mon Sep 9 02:39:57 2024 +0000 + + upstream: pull post-quantum ML-KEM/x25519 key exchange out from + + compile-time flag now than an IANA codepoint has been assigned for the + algorithm. + + Add mlkem768x25519-sha256 in 2nd KexAlgorithms preference slot. + + ok markus@ + + OpenBSD-Commit-ID: 9f50a0fae7d7ae8b27fcca11f8dc6f979207451a + +commit a8ad7a2952111c6ce32949a775df94286550af6b +Author: djm@openbsd.org +Date: Fri Sep 6 02:30:44 2024 +0000 + + upstream: make parsing user@host consistently look for the last '@' in + + the string rather than the first. This makes it possible to use usernames + that contain '@' characters. + MIME-Version: 1.0 + Content-Type: text/plain; charset=UTF-8 + Content-Transfer-Encoding: 8bit + + Prompted by Max Zettlmeißl; feedback/ok millert@ + + OpenBSD-Commit-ID: 0b16eec246cda15469ebdcf3b1e2479810e394c5 + +commit 13cc78d016b67a74a67f1c97c7c348084cd9212c +Author: djm@openbsd.org +Date: Wed Sep 4 05:33:34 2024 +0000 + + upstream: be more strict in parsing key type names. Only allow + + shortnames (e.g "rsa") in user-interface code and require full SSH protocol + names (e.g. "ssh-rsa") everywhere else. + + Prompted by bz3725; ok markus@ + + OpenBSD-Commit-ID: b3d8de9dac37992eab78adbf84fab2fe0d84b187 + +commit ef8472309a68e319018def6f8ea47aeb40d806f5 +Author: djm@openbsd.org +Date: Wed Sep 4 05:11:33 2024 +0000 + + upstream: fix RCSID in output + + OpenBSD-Commit-ID: 889ae07f2d2193ddc4351711919134664951dd76 + +commit ba2ef20c75c5268d4d1257adfc2ac11c930d31e1 +Author: jmc@openbsd.org +Date: Tue Sep 3 06:17:48 2024 +0000 + + upstream: envrionment -> environment; + + OpenBSD-Commit-ID: b719f39c20e8c671ec6135c832d6cc67a595af9c + +commit e66c0c5673a4304a3a9fbf8305c6a19f8653740f +Author: Damien Miller +Date: Wed Sep 4 15:35:29 2024 +1000 + + add basic fuzzers for our import of sntrup761 + +commit d19dea6330ecd4eb403fef2423bd7e127f4c9828 +Author: djm@openbsd.org +Date: Tue Sep 3 05:58:56 2024 +0000 + + upstream: regression test for Include variable expansion + + OpenBSD-Regress-ID: 35477da3ba1abd9ca64bc49080c50a9c1350c6ca + +commit 8c4d6a628051e318bae2f283e8dc38b896400862 +Author: djm@openbsd.org +Date: Tue Sep 3 05:29:55 2024 +0000 + + upstream: allow the "Include" directive to expand the same set of + + %-tokens that "Match Exec" and environment variables. + + ok dtucker@ + + OpenBSD-Commit-ID: 12ef521eaa966a9241e684258564f52f1f3c5d37 + +commit 51b82648b6827675fc0cde21175fd1ed8e89aab2 +Author: djm@openbsd.org +Date: Mon Sep 2 12:18:35 2024 +0000 + + upstream: missing ifdef + + OpenBSD-Commit-ID: 85f09da957dd39fd0abe08fe5ee19393f25c2021 + +commit f68312eb593943127b39ba79a4d7fa438c34c153 +Author: djm@openbsd.org +Date: Mon Sep 2 12:13:56 2024 +0000 + + upstream: Add experimental support for hybrid post-quantum key exchange + + ML-KEM768 with ECDH/X25519 from the Internet-draft: + https://datatracker.ietf.org/doc/html/draft-kampanakis-curdle-ssh-pq-ke-03 + + This is based on previous patches from markus@ but adapted to use the + final FIPS203 standard ML-KEM using a formally-verified implementation + from libcrux. + + Note this key exchange method is still a draft and thus subject to + change. It is therefore disabled by default; set MLKEM=yes to build it. + We're making it available now to make it easy for other SSH + implementations to test against it. + + ok markus@ deraadt@ + + OpenBSD-Commit-ID: 02a8730a570b63fa8acd9913ec66353735dea42c + +commit 05f2b141cfcc60c7cdedf9450d2b9d390c19eaad +Author: Antonio Larrosa +Date: Fri Aug 23 12:21:06 2024 +0200 + + Don't skip audit before exitting cleanup_exit + + This fixes an issue where the SSH_CONNECTION_ABANDON event is not + audited because cleanup_exit overrides the regular _exit too soon and + as a result, failed auth attempts are not logged correctly. + + The problem was introduced in 81c1099d22b81ebfd20a334ce986c4f753b0db29 + where the code from upstream was merged before the audit_event call when + it should have been merged right before the _exit call in order to honor + the comment that just mentions an override of the exit value. + +commit 16eaf9d401e70996f89f3f417738a8db421aa959 +Author: djm@openbsd.org +Date: Wed Aug 28 12:08:26 2024 +0000 + + upstream: fix test: -F is the argument to specify a non-default + + ssh_config, not -f (this is sadly not a new bug) + + OpenBSD-Regress-ID: 45a7bda4cf33f2cea218507d8b6a55cddbcfb322 + +commit 10ccf611ab8ecba9ce6b0548c5ccd8c1220baf92 +Author: deraadt@openbsd.org +Date: Fri Aug 23 04:51:00 2024 +0000 + + upstream: As defined in the RFC, the SSH protocol has negotiable + + compression support (which is requested as the name "zlib"). Compression + starts very early in the session. Relative early in OpenSSH lifetime, privsep + was added to sshd, and this required a shared-memory hack so the two + processes could see what was going on in the dataflow. This shared-memory + hack was soon recognized as a tremendous complexity risk, because it put libz + (which very much trusts it's memory) in a dangerous place, and a new option + ("zlib@openssh.com") was added begins compression after authentication (aka + delayed-compression). That change also permitted removal of the + shared-memory hack. Despite removal from the server, the old "zlib" support + remained in the client, to allow negotiation with non-OpenSSH daemons which + lack the delayed-compression option. This commit deletes support for the + older "zlib" option in the client. It reduces our featureset in a small way, + and encourages other servers to move to a better design. The SSH protocol is + different enough that compressed-key-material attacks like BEAST are + unlikely, but who wants to take the chance? We encourage other ssh servers + who care about optional compression support to add delayed-zlib support. + (Some already do "zlib@openssh.com") ok djm markus + + OpenBSD-Commit-ID: 6df986f38e4ab389f795a6e39e7c6857a763ba72 + +commit aee54878255d71bf93aa6e91bbd4eb1825c0d1b9 +Author: djm@openbsd.org +Date: Thu Aug 22 23:11:30 2024 +0000 + + upstream: sntrup761x25519-sha512 now has an IANA codepoint assigned, so + + we can make the algorithm available without the @openssh.com suffix too. ok + markus@ deraadt@ + + OpenBSD-Commit-ID: eeed8fcde688143a737729d3d56d20ab4353770f + +commit a76a6b85108e3032c8175611ecc5746e7131f876 +Author: Darren Tucker +Date: Thu Aug 22 20:36:12 2024 +1000 + + Move rekey test into valgrind-2. + + Now that the rekey test has been optimized it's fast enough to not be in + its own valgrind test, so move it into valgrind-2, which is currently + the quickest of the others, bringing all of them to roughly the same + runtime of ~1.1 hours. + +commit 7e75e3f57c41b9a6e6401e7674d7c2ff5c33975b +Author: dtucker@openbsd.org +Date: Thu Aug 22 10:21:02 2024 +0000 + + upstream: Use aes128-ctr for MAC tests since default has implicit MAC. + + Also verify that the Cipher or MAC we intended to use is actually the one + selected during the test. + + OpenBSD-Regress-ID: ff43fed30552afe23d1364526fe8cf88cbfafe1d + +commit ebc890b8b4ba08c84cd1066b7b94b2b11f6c4cb4 +Author: Damien Miller +Date: Thu Aug 22 09:45:49 2024 +1000 + + fix incorrect default for PasswordAuthentication + + merge botch spotted by gsgleason + +commit 15ace435ea1c2fab2a1cc7d9c3157fe20c776b80 +Author: dtucker@openbsd.org +Date: Wed Aug 21 10:33:27 2024 +0000 + + upstream: Some awks won't match on the \r so delete it instead. Fixes + + regress in portable on, eg Solaris. + + OpenBSD-Regress-ID: 44a96d6d2f8341d89b7d5fff777502b92ac9e9ba + +commit 51c96b6ed627779a04493a8fe25747996a37f3c2 +Author: dtucker@openbsd.org +Date: Wed Aug 21 07:06:27 2024 +0000 + + upstream: Import regenerated moduli. + + OpenBSD-Commit-ID: 5db7049ad5558dee5b2079d3422e8ddab187c1cc + +commit 25c52f37a82c4da48ec537de37d7c168982b8d6d +Author: dtucker@openbsd.org +Date: Wed Aug 21 06:59:08 2024 +0000 + + upstream: Use curve25519-sha256 kex where possible. + + Except where we're explicitly testing a different kex, use + curve25519-sha256 since it's faster than the default and supported even + when configured without OpenSSL. Add a check to ensure that the kex we + intended to test is the one we actually tested. Speeds test up by ~5%. + + OpenBSD-Regress-ID: 3b27fcc2ae953cb08fd82a0d3155c498b226d6e0 + +commit 3eb62b7ba49483c309b483eb9002a679014f3887 +Author: dtucker@openbsd.org +Date: Tue Aug 20 12:36:59 2024 +0000 + + upstream: Send only as much data as needed to trigger rekeying. Speeds + + up tests by about 10% in the common case, hopefully more when instrumented + with something like valgrind. + + OpenBSD-Regress-ID: 7bf9292b4803357efcf0baf7cfbdc8521f212da1 + +commit cbd3f034bbf7853618fac99d7d868a2250154ea7 +Author: Damien Miller +Date: Wed Aug 21 09:18:29 2024 +1000 + + simplify sshkey_prekey_alloc(); always use mmap + +commit 4442bbc2fc661277a6dabfedb756a7e15ee8b8b8 +Author: dtucker@openbsd.org +Date: Tue Aug 20 09:15:49 2024 +0000 + + upstream: Merge AEAD test into main test loop. + + Removes 3 duplicate tests and speeds overall test up by about 1%. + + OpenBSD-Regress-ID: 5e5c9ff3f7588091ed369e34ac28520490ad2619 + +commit 829976a63fd1efae3a4c3e7c16fded59d92edb67 +Author: dtucker@openbsd.org +Date: Tue Aug 20 09:02:45 2024 +0000 + + upstream: Set a default RekeyLimit of 256k. + + Used unless overridden by a command-line flag, which simplifies some of + the ssh command lines. + + OpenBSD-Regress-ID: e7cffa57027088e10336e412b34113969f88cb87 + +commit 57d02c9ea36aebad4e7146d46e041b6b2e582f7f +Author: dtucker@openbsd.org +Date: Tue Aug 20 07:52:43 2024 +0000 + + upstream: Add Compression=no to default ssh_config. + + All of the rekey tests use it (otherwise the encrypted byte counts would + not match) so this lets us simplify the command lines. + + OpenBSD-Regress-ID: dab7ce10f4cf6c68827eb8658141272aab3ea262 + +commit 7254eb26f7c0772c4b47c3b32f6d1b15855cdd8c +Author: dtucker@openbsd.org +Date: Tue Aug 20 07:41:35 2024 +0000 + + upstream: Remove duplicate curve25519-sha256 kex. + + curve25519-sha256@libssh.org is the pre-standardization name for the same + thing, so remove it as a duplicate. Speeds up test by a tiny amount. + + OpenBSD-Regress-ID: 5a5ee5fa1595a6e140b1cc16040bedf5996a5715 + +commit 749896b874928c2785256cae4d75161dc3bfcc7d +Author: dtucker@openbsd.org +Date: Tue Aug 20 07:27:25 2024 +0000 + + upstream: Unnest rekey param parsing test and use ssh not sshd. + + ssh uses the same parsing code, now has "-G" to dump its config and is + slightly faster to start up. This speeds up the test slightly (~5%) in the + common case but should help more during instrumented tests, eg under + valgrind, where startup costs are magnified. + + OpenBSD-Regress-ID: 07c3acaf4c728e641033071f4441afc88141b0d0 + +commit 2b1762115481ff2b7a60fd4db2ae69b725437462 +Author: djm@openbsd.org +Date: Tue Aug 20 11:10:04 2024 +0000 + + upstream: actually use the length parameter that was passed in rather + + than a constant (this makes no difference in practice because the length is + always the same); reported by martin AT nmkd.net + + OpenBSD-Commit-ID: 4aecce232c2fe9b16e9217ff6bcb3c848d853e7e + +commit d922762ca16a7381131b242f49d7376c41fabcb5 +Author: Damien Miller +Date: Tue Aug 20 13:55:30 2024 +1000 + + private key coredump protection for Linux/FreeBSD + + platforms not supporting coredump exclusion using mmap/madvise flags + fall back to plain old malloc(3). + +commit cc048ca536d6bed6f2285b07040b0d57cd559ba5 +Author: djm@openbsd.org +Date: Tue Aug 20 03:48:30 2024 +0000 + + upstream: place shielded keys (i.e. keys at rest in RAM) into memory + + allocated using mmap(3) with MAP_CONCEAL set. This prevents exposure of the + key material in coredumps, etc (this is in addition to other measures we take + in this area). + + ok deraadt@ + + OpenBSD-Commit-ID: cbbae59f337a00c9858d6358bc65f74e62261369 + +commit a0b35c791cad1f85481b23ba46373060292e1c80 +Author: djm@openbsd.org +Date: Sat Aug 17 08:35:04 2024 +0000 + + upstream: mention that ed25519 is the default key type generated and + + clarify that rsa-sha2-512 is the default signature scheme when RSA is in use. + Based on GHPR505 from SebastianRzk + + OpenBSD-Commit-ID: 1d90df71636a04601685d2a10a8233bcc8d4f4c5 + +commit 127a50f2c80572ed1a021feb11ecf941e92cbbef +Author: djm@openbsd.org +Date: Sat Aug 17 08:23:04 2024 +0000 + + upstream: fix minor memory leak in Subsystem option parsing; from + + Antonio Larrosa via GHPR515 + + OpenBSD-Commit-ID: fff3bbefd1b2c45c98cbe45c6b857b15d8a2d364 + +commit 171427261d2079941eb1041079dbae875da37cbc +Author: djm@openbsd.org +Date: Sat Aug 17 08:09:50 2024 +0000 + + upstream: fix swapping of source and destination addresses in some sshd + + log messages + + OpenBSD-Commit-ID: 24d4cbb86325275df1f037545aa3b91456e52d25 + +commit 2a50a8f1fa57857a5e124a2280bcf61cc63c77f7 +Author: Darren Tucker +Date: Sat Aug 17 11:10:19 2024 +1000 + + Add compat functions for EVP_Digest{Sign,Verify}. + + This should make LibreSSL 3.1.x through 3.3.x work again. Code from + tb@, ok djm@. Restore the test configs covering those. + +commit 1c3a7145260e03037cc18715b883880836fd122d +Author: Philip Hands +Date: Thu Aug 8 13:03:51 2024 +0200 + + make sure that usage & man page match + + SSH-Copy-ID-Upstream: da5b1abe55b72a16e0430e7598e1573da01779c0 + +commit cd0d681645b9adcf2467e7838bfd9d5142de4c4e +Author: Philip Hands +Date: Thu Aug 8 13:01:47 2024 +0200 + + update copyright notices + + Bump the year to 2024, but also reflect the fact that hands.com Ltd. has + been wound up in the UK, and its assets (including this copyright) have + now reverted to its owner, Philip Hands. + + SSH-Copy-ID-Upstream: 0e4c4d072747a6568b11a790c29dd1b4ce663d7f + +commit 7fc9ccdce18841ebd0a97e31e43258512ab32a32 +Author: Philip Hands +Date: Sun Aug 4 20:45:00 2024 +0200 + + restore optionality of -i's argument + + SSH-Copy-ID-Upstream: f70e3abb510e4eeb040b47894e41828246c1b720 + +commit c37aa7012b1a3c2c322fd19e71310aadc90fc674 +Author: Philip Hands +Date: Fri Aug 2 15:52:07 2024 +0200 + + avoid exploring .ssh/id*.pub subdirectories + + SSH-Copy-ID-Upstream: 0b9e08b7707ad16de3c8e6a0410d9f42fbd56997 + +commit 777dce9e2e0d12f7e81e162f77749f30899869fe +Author: Philip Hands +Date: Fri Aug 2 10:07:11 2024 +0200 + + ensure that we're always told the source of keys + + SSH-Copy-ID-Upstream: 1bee96f4793e8ec3fab9f9361204ae58f5cc7cae + +commit fb94fd2339848e40cad6c9bb42b822244cc1a7bc +Author: Philip Hands +Date: Wed Jul 31 23:19:51 2024 +0200 + + add $HOME to ERROR if one cannot write to ~/.ssh + + SSH-Copy-ID-Upstream: ebef3e9c06e0447bff06e9d84b33023cf592e0ba + +commit eb5aafa1ffaeee75799141ec5ded406a65ec7d18 +Author: Philip Hands +Date: Wed Jul 31 23:19:03 2024 +0200 + + assert that SCRATCH_DIR is a writable directory + + SSH-Copy-ID-Upstream: ecb2b9d10883b9a16df56c83896c9bb47a80cde2 + +commit abcc460a2af46f0d812f8433d97a8eae1d80724c +Author: Philip Hands +Date: Wed Jul 31 23:17:54 2024 +0200 + + quote to avoid potential for word splitting + + SSH-Copy-ID-Upstream: f379adbe06ac2ef1daf0f130752234c7f8b97e3c + +commit b3f91411fd1473605f74c40c1a91a024c7171e27 +Author: Philip Hands +Date: Wed Jul 31 23:15:11 2024 +0200 + + ensure ERROR output goes to STDERR + + SSH-Copy-ID-Upstream: ac394b05eead3b91feb7c2ae4129a3e9b892f1e2 + +commit 674b8f30f0dbacd787eb1e4e7e1ece34b5543d8f +Author: Philip Hands +Date: Thu Aug 1 14:03:06 2024 +0200 + + avoid extra space when no arg given to -i option + + SSH-Copy-ID-Upstream: feca9e67e6e37c5653445d1c733569d7abb1770e + +commit 0efa0e1c41427c0c6ba839a18c72c1afcd7b7cc0 +Author: Philip Hands +Date: Wed Jul 31 23:28:36 2024 +0200 + + put the -i before -[pP] (matching man pages) + + The man pages (ssh, sftp & ssh-copy-id) all list -i before the port + setting, so make the output match that order, which also seems more + natural with the port being next to the server. + + SSH-Copy-ID-Upstream: 34d5d614172c78f9a42249466c4b81975b8883a1 + +commit 87831345e9745f2d13bd7a4a7972809f6788f331 +Author: Shreyas Mahangade +Date: Mon Jul 29 15:26:05 2024 +0000 + + Minor space issue fixed + + SSH-Copy-ID-Upstream: 335e44d7be78b03962a54c3a5c99a2ff45294a54 + +commit 2f3010f4736b4b3f5c10a4be97a24e90ff04c5e7 +Author: Shreyas Mahangade +Date: Mon Jul 29 16:55:28 2024 +0530 + + Show identity file in 'ssh' command + + - Previously no identity file is shown in "ssh" command output on the line "Now try logging into the..." + - This commit makes sure whenever "ssh-copy-id" with "-i" is invoked, it also reflects in "ssh" command + + SSH-Copy-ID-Upstream: 58e022ec26cb2315eb3be581d01e0ba787082428 + +commit a13856374b894397a7682b32257ed0bf67cfede9 +Author: Damien Miller +Date: Fri Aug 16 08:30:20 2024 +1000 + + more OPENSSL_HAS_ECC + +commit 4da2a1a7f648979bea6eaf3b17f5f250faed4afc +Author: Damien Miller +Date: Thu Aug 15 23:35:54 2024 +1000 + + fix merge botch that broke !OPENSSL_HAS_ECC + +commit 2c53d2f32b8e3992b61682c909ae5bc5122b6e5d +Author: Damien Miller +Date: Thu Aug 15 15:09:45 2024 +1000 + + missed OPENSSL_HAS_ECC case + +commit 342dd7a219f39119b8b686b5aaa99c8e15ede368 +Author: Damien Miller +Date: Thu Aug 15 15:06:55 2024 +1000 + + retire testing aginst older LibreSSL versions + + libressl prior to 3.4.x lack support for the EVP_DigestSign and + EVP_DigestVerify APIs that we need now that sshkey is converted + to EVP_PKEY. + + If someone makes a good case for why we should support these versions + then we could bring back support with wrappers. + +commit a7c6ea8eebe0f179141ec5dbf0c9e5354417930f +Author: Damien Miller +Date: Thu Aug 15 12:44:17 2024 +1000 + + sync TEST_MALLOC_OPTIONS for OpenBSD + +commit 60c2cf22e8f64f35d8b1175e4671257313f2e4d3 +Author: Damien Miller +Date: Thu Aug 15 12:43:47 2024 +1000 + + remove gratuitious difference from OpenBSD + +commit 339c4fc60a6250429d41fa8713f783d82aad4551 +Author: djm@openbsd.org +Date: Thu Aug 15 00:52:23 2024 +0000 + + upstream: adapt to EVP_PKEY conversion + + OpenBSD-Regress-ID: 0e2d4efb0ed0e392e23cd8fda183fe56531ac446 + +commit 63a94f99b9d7c8a48182a40192e45879d1ba8791 +Author: djm@openbsd.org +Date: Fri Jul 19 04:33:36 2024 +0000 + + upstream: test transfers in mux proxy mode too + + OpenBSD-Regress-ID: 2edfc980628cfef3550649cab8d69fa23b5cd6c4 + +commit 7bdfc20516e288b58c8c847958059c7b141eeff9 +Author: djm@openbsd.org +Date: Thu Aug 15 00:51:51 2024 +0000 + + upstream: Convert RSA and ECDSA key to the libcrypto EVP_PKEY API. + + DSA remains unconverted as it will be removed within six months. + + Based on patches originally from Dmitry Belyavskiy, but significantly + reworked based on feedback from Bob Beck, Joel Sing and especially + Theo Buehler (apologies to anyone I've missed). + + ok tb@ + + OpenBSD-Commit-ID: d098744e89f1dc7e5952a6817bef234eced648b5 + +commit 0af06e2c5b898992a18c74333e75a0136506acc6 +Author: tobias@openbsd.org +Date: Wed Aug 14 15:42:18 2024 +0000 + + upstream: Reorder calloc arguments + + The first argument should be the amount, the second argument should be the + element size. Fixing this also silences some gcc compiler warnings for + portable. + + Spotted with Benny Baumann (BenBE at geshi dot org). + + ok djm@ + + OpenBSD-Commit-ID: 711ad6f7bd7fb48bf52208f2cf9f108cddb6d41a + +commit 56ce0aa3c6cf28d9fcbce3207457abeac91b5050 +Author: tobias@openbsd.org +Date: Wed Aug 14 15:40:30 2024 +0000 + + upstream: Extend sshbuf validation + + Multiple sshbuf structs can be linked through a parent/child relationship. + Make sure that a single sshbuf cannot be its own parent. If this would ever + happen, it would result in reference counting issues. + + This is a cheap way of testing this with very little overhead. It does not + detect A->B->A linkages though for performance reason and the fact that it + takes a programming error for this to occur anyway. + + Authored with Benny Baumann (BenBE at geshi dot org). + + ok djm@ + + OpenBSD-Commit-ID: fb3fa9ee2cad3c7e842ebadfd7f5db220c4aaf16 + +commit fc48ddf6998188517af42dce807e2088b6a0c0be +Author: tobias@openbsd.org +Date: Wed Aug 14 15:37:11 2024 +0000 + + upstream: Use freezero for better readability + + It has the same meaning as the current pair of calling explicit_bzero + and free. Spotted with Benny Baumann (BenBE at geshi dot org). + + ok djm@ + + OpenBSD-Commit-ID: 939fbe9ccf52d0d48c5fa53694d6f3bb9927970c + +commit 1ff6907ec26dac6ac59fe9fe232899a63b4c14d8 +Author: tobias@openbsd.org +Date: Wed Aug 14 15:35:23 2024 +0000 + + upstream: Fix typo in comment + + Spotted with Benny Baumann (BenBE at geshi dot org). + + ok djm@ + + OpenBSD-Commit-ID: 829160ac8ef3ad3409695ce3a3ade835061cae57 + +commit 487faaed8f3bb9ffb19e8f807a3da72895b16421 +Author: dlg@openbsd.org +Date: Wed Jul 31 12:00:18 2024 +0000 + + upstream: add a random amount of time (up to 4 seconds) to the + + grace login time. + + ok deraadt@ djm@ + + OpenBSD-Commit-ID: abd3c57aaa5861517529b322df79b6be35ee67f4 + +commit 2865f5b7520bed3e74fbbb5f8d7a44193d7a4314 +Author: naddy@openbsd.org +Date: Fri Jul 26 15:24:49 2024 +0000 + + upstream: document the reduced logingrace penalty + + OpenBSD-Commit-ID: 9b63e0e3599d524ddc10edc4f978081382c3548b + +commit 1ec0a64c5dc57b8a2053a93b5ef0d02ff8598e5c +Author: Darren Tucker +Date: Sun Jul 28 21:26:51 2024 +1000 + + Explicitly install libssl-devel cygwin. + + Should fix CI tests for cygwin default config. + +commit 0bf6e5bb750b66b25c20a1c5a471f91850de3748 +Author: djm@openbsd.org +Date: Thu Jul 25 23:44:01 2024 +0000 + + upstream: reduce logingrace penalty. + + A single forgotton login that times out should be below the penalty + threshold. + + ok deraadt/claudio + + OpenBSD-Commit-ID: cee1f7d17597c97bff8e5092af5d136fdb08f81d + +commit 29fb6f6d46b67770084b4f12bcf8a01bd535041b +Author: djm@openbsd.org +Date: Thu Jul 25 22:40:08 2024 +0000 + + upstream: Fix proxy multiplexing (-O proxy) bug + + If a mux started with ControlPersist then later has a forwarding added using + mux proxy connection and the forwarding was used, then when the mux proxy + session terminates, the mux master process will send a channel close to the + server with a bad channel ID and crash the connection. + + This was caused by my stupidly reusing c->remote_id for mux channel + associations when I should have just added another member to struct channel. + + ok markus@ + + OpenBSD-Commit-ID: c9f474e0124e3fe456c5e43749b97d75e65b82b2 + +commit 53d1d307438517805989c7d5616d752739a97e03 +Author: djm@openbsd.org +Date: Thu Jul 18 01:47:27 2024 +0000 + + upstream: mention mux proxy mode + + OpenBSD-Commit-ID: fd77a77779f06d316a314e4540dc57c93fc3369a + +commit a9b90859d252c2f5a24142f985d38610ac74685f +Author: jsg@openbsd.org +Date: Sun Jul 14 10:19:23 2024 +0000 + + upstream: fix double word; ok dtucker@ + + OpenBSD-Commit-ID: e6aff005914fa350b896d2be030be3d3b56ec0e8 + +commit b05fda224bbcd2f641254534ed2175c42487f3c8 +Author: Darren Tucker +Date: Thu Jul 25 17:59:35 2024 +1000 + + Check for SA_RESTART before using it. + + ok djm@ + +commit c276672fc0e99f0c4389988d54a84c203ce325b6 +Author: Yuichiro Naito +Date: Wed Sep 1 10:19:32 2021 +0900 + + Class-imposed login restrictions + + If the following functions are available, + add an additional check if users are allowed to login imposed by login class. + + * auth_hostok(3) + * auth_timeok(3) + + These functions are implemented on FreeBSD. + +commit 7717b9e9155209916cc6b4b4b54f4e8fa578e889 +Author: djm@openbsd.org +Date: Wed Jul 10 21:58:34 2024 +0000 + + upstream: correct keyword; from Yatao Su via GHPR509 + + OpenBSD-Commit-ID: 81c778c76dea7ef407603caa157eb0c381c52ad2 + +commit f2b78bb8f149d6b4d1f62c21aa1f06995dccf4ce +Author: djm@openbsd.org +Date: Mon Jul 8 03:04:34 2024 +0000 + + upstream: don't need return at end of void function + + OpenBSD-Commit-ID: 42d322d37f13aa075ae7b1ad9eef591e20b89717 + +commit a395d37a813c0177cb5bfc4bebf5a52badb73cf0 +Author: djm@openbsd.org +Date: Thu Jul 4 22:53:59 2024 +0000 + + upstream: fix grammar: "a pattern lists" -> "one or more pattern + + lists" + + OpenBSD-Commit-ID: f3c844763398faa9800687e8ff6621225498202a + +commit 8b664df75966e5aed8dabea00b8838303d3488b8 +Author: Darren Tucker +Date: Sun Jul 7 18:46:19 2024 +1000 + + Cast to sockaddr * in systemd interface. + + Fixes build with musl libx. bz#3707. diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 000000000000..5a19d278477f --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,15 @@ +# generated automatically by aclocal 1.16.5 -*- Autoconf -*- + +# Copyright (C) 1996-2021 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_include([m4/openssh.m4]) diff --git a/config.h.in b/config.h.in new file mode 100644 index 000000000000..009b53c649cf --- /dev/null +++ b/config.h.in @@ -0,0 +1,2114 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* Define if you have a getaddrinfo that fails for the all-zeros IPv6 address + */ +#undef AIX_GETNAMEINFO_HACK + +/* Define if your AIX loginfailed() function takes 4 arguments (AIX >= 5.2) */ +#undef AIX_LOGINFAILED_4ARG + +/* System only supports IPv4 audit records */ +#undef AU_IPv4 + +/* Define if your resolver libs need this for getrrsetbyname */ +#undef BIND_8_COMPAT + +/* The system has incomplete BSM API */ +#undef BROKEN_BSM_API + +/* broken in chroots on older kernels */ +#undef BROKEN_CLOSEFROM + +/* Define if cmsg_type is not passed correctly */ +#undef BROKEN_CMSG_TYPE + +/* getaddrinfo is broken (if present) */ +#undef BROKEN_GETADDRINFO + +/* getgroups(0,NULL) will return -1 */ +#undef BROKEN_GETGROUPS + +/* getline is not what we expect */ +#undef BROKEN_GETLINE + +/* Do not use system glob */ +#undef BROKEN_GLOB + +/* Define if you system's inet_ntoa is busted (e.g. Irix gcc issue) */ +#undef BROKEN_INET_NTOA + +/* Define if your struct dirent expects you to allocate extra space for d_name + */ +#undef BROKEN_ONE_BYTE_DIRENT_D_NAME + +/* System poll(2) implementation is broken */ +#undef BROKEN_POLL + +/* Can't do comparisons on readv */ +#undef BROKEN_READV_COMPARISON + +/* NetBSD read function is sometimes redirected, breaking atomicio comparisons + against it */ +#undef BROKEN_READ_COMPARISON + +/* Needed for NeXT */ +#undef BROKEN_SAVED_UIDS + +/* Define if your setregid() is broken */ +#undef BROKEN_SETREGID + +/* Define if your setresgid() is broken */ +#undef BROKEN_SETRESGID + +/* Define if your setresuid() is broken */ +#undef BROKEN_SETRESUID + +/* Define if your setreuid() is broken */ +#undef BROKEN_SETREUID + +/* LynxOS has broken setvbuf() implementation */ +#undef BROKEN_SETVBUF + +/* QNX shadow support is broken */ +#undef BROKEN_SHADOW_EXPIRE + +/* Define if your snprintf is busted */ +#undef BROKEN_SNPRINTF + +/* strndup broken, see APAR IY61211 */ +#undef BROKEN_STRNDUP + +/* strnlen broken, see APAR IY62551 */ +#undef BROKEN_STRNLEN + +/* strnvis detected broken */ +#undef BROKEN_STRNVIS + +/* tcgetattr with ICANON may hang */ +#undef BROKEN_TCGETATTR_ICANON + +/* updwtmpx is broken (if present) */ +#undef BROKEN_UPDWTMPX + +/* Define if you have BSD auth support */ +#undef BSD_AUTH + +/* Define if you want to specify the path to your lastlog file */ +#undef CONF_LASTLOG_FILE + +/* Define if you want to specify the path to your utmp file */ +#undef CONF_UTMP_FILE + +/* Define if you want to specify the path to your wtmpx file */ +#undef CONF_WTMPX_FILE + +/* Define if you want to specify the path to your wtmp file */ +#undef CONF_WTMP_FILE + +/* Need to call setpgrp as root */ +#undef DISABLE_FD_PASSING + +/* Define if you don't want to use lastlog */ +#undef DISABLE_LASTLOG + +/* Define if you don't want to use your system's login() call */ +#undef DISABLE_LOGIN + +/* Define if you don't want to use pututline() etc. to write [uw]tmp */ +#undef DISABLE_PUTUTLINE + +/* Define if you don't want to use pututxline() etc. to write [uw]tmpx */ +#undef DISABLE_PUTUTXLINE + +/* Define if you want to disable shadow passwords */ +#undef DISABLE_SHADOW + +/* Define if you don't want to use utmp */ +#undef DISABLE_UTMP + +/* Define if you don't want to use utmpx */ +#undef DISABLE_UTMPX + +/* Define if you don't want to use wtmp */ +#undef DISABLE_WTMP + +/* Define if you don't want to use wtmpx */ +#undef DISABLE_WTMPX + +/* Enable for PKCS#11 support */ +#undef ENABLE_PKCS11 + +/* Enable for U2F/FIDO support */ +#undef ENABLE_SK + +/* Enable for built-in U2F/FIDO support */ +#undef ENABLE_SK_INTERNAL + +/* define if fflush(NULL) does not work */ +#undef FFLUSH_NULL_BUG + +/* File names may not contain backslash characters */ +#undef FILESYSTEM_NO_BACKSLASH + +/* fsid_t has member val */ +#undef FSID_HAS_VAL + +/* fsid_t has member __val */ +#undef FSID_HAS___VAL + +/* getpgrp takes one arg */ +#undef GETPGRP_VOID + +/* Conflicting defs for getspnam */ +#undef GETSPNAM_CONFLICTING_DEFS + +/* Define if your system glob() function has the GLOB_ALTDIRFUNC extension */ +#undef GLOB_HAS_ALTDIRFUNC + +/* Define if your system glob() function has gl_matchc options in glob_t */ +#undef GLOB_HAS_GL_MATCHC + +/* Define if your system glob() function has gl_statv options in glob_t */ +#undef GLOB_HAS_GL_STATV + +/* Define this if you want GSSAPI support in the version 2 protocol */ +#undef GSSAPI + +/* Define if you want to use shadow password expire field */ +#undef HAS_SHADOW_EXPIRE + +/* Define if your system uses access rights style file descriptor passing */ +#undef HAVE_ACCRIGHTS_IN_MSGHDR + +/* Define if you have ut_addr in utmp.h */ +#undef HAVE_ADDR_IN_UTMP + +/* Define if you have ut_addr in utmpx.h */ +#undef HAVE_ADDR_IN_UTMPX + +/* Define if you have ut_addr_v6 in utmp.h */ +#undef HAVE_ADDR_V6_IN_UTMP + +/* Define if you have ut_addr_v6 in utmpx.h */ +#undef HAVE_ADDR_V6_IN_UTMPX + +/* Define to 1 if you have the `arc4random' function. */ +#undef HAVE_ARC4RANDOM + +/* Define to 1 if you have the `arc4random_buf' function. */ +#undef HAVE_ARC4RANDOM_BUF + +/* Define to 1 if you have the `arc4random_stir' function. */ +#undef HAVE_ARC4RANDOM_STIR + +/* Define to 1 if you have the `arc4random_uniform' function. */ +#undef HAVE_ARC4RANDOM_UNIFORM + +/* Define to 1 if you have the `asprintf' function. */ +#undef HAVE_ASPRINTF + +/* OpenBSD's gcc has bounded */ +#undef HAVE_ATTRIBUTE__BOUNDED__ + +/* Have attribute nonnull */ +#undef HAVE_ATTRIBUTE__NONNULL__ + +/* compiler supports nonstring attribute */ +#undef HAVE_ATTRIBUTE__NONSTRING__ + +/* OpenBSD's gcc has sentinel */ +#undef HAVE_ATTRIBUTE__SENTINEL__ + +/* Define to 1 if you have the `aug_get_machine' function. */ +#undef HAVE_AUG_GET_MACHINE + +/* Define to 1 if you have the `auth_hostok' function. */ +#undef HAVE_AUTH_HOSTOK + +/* Define to 1 if you have the `auth_timeok' function. */ +#undef HAVE_AUTH_TIMEOK + +/* Define to 1 if you have the `b64_ntop' function. */ +#undef HAVE_B64_NTOP + +/* Define to 1 if you have the `b64_pton' function. */ +#undef HAVE_B64_PTON + +/* Define if you have the basename function. */ +#undef HAVE_BASENAME + +/* Define to 1 if you have the `bcopy' function. */ +#undef HAVE_BCOPY + +/* Define to 1 if you have the `bcrypt_pbkdf' function. */ +#undef HAVE_BCRYPT_PBKDF + +/* Define to 1 if you have the `bindresvport_sa' function. */ +#undef HAVE_BINDRESVPORT_SA + +/* Define to 1 if you have the `blf_enc' function. */ +#undef HAVE_BLF_ENC + +/* Define to 1 if you have the header file. */ +#undef HAVE_BLF_H + +/* Define to 1 if you have the `Blowfish_expand0state' function. */ +#undef HAVE_BLOWFISH_EXPAND0STATE + +/* Define to 1 if you have the `Blowfish_expandstate' function. */ +#undef HAVE_BLOWFISH_EXPANDSTATE + +/* Define to 1 if you have the `Blowfish_initstate' function. */ +#undef HAVE_BLOWFISH_INITSTATE + +/* Define to 1 if you have the `Blowfish_stream2word' function. */ +#undef HAVE_BLOWFISH_STREAM2WORD + +/* Define to 1 if you have the `BN_is_prime_ex' function. */ +#undef HAVE_BN_IS_PRIME_EX + +/* Define to 1 if you have the header file. */ +#undef HAVE_BSD_LIBUTIL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_BSM_AUDIT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_BSTRING_H + +/* Define to 1 if you have the `bzero' function. */ +#undef HAVE_BZERO + +/* calloc(0, x) returns NULL */ +#undef HAVE_CALLOC + +/* Define if you have caph_cache_tzdata */ +#undef HAVE_CAPH_CACHE_TZDATA + +/* Define to 1 if you have the header file. */ +#undef HAVE_CAPSICUM_HELPERS_H + +/* Define to 1 if you have the `cap_rights_limit' function. */ +#undef HAVE_CAP_RIGHTS_LIMIT + +/* Define to 1 if you have the `clock' function. */ +#undef HAVE_CLOCK + +/* Have clock_gettime */ +#undef HAVE_CLOCK_GETTIME + +/* define if you have clock_t data type */ +#undef HAVE_CLOCK_T + +/* Define to 1 if you have the `closefrom' function. */ +#undef HAVE_CLOSEFROM + +/* Define to 1 if you have the `close_range' function. */ +#undef HAVE_CLOSE_RANGE + +/* Define if gai_strerror() returns const char * */ +#undef HAVE_CONST_GAI_STRERROR_PROTO + +/* Define if your system uses ancillary data style file descriptor passing */ +#undef HAVE_CONTROL_IN_MSGHDR + +/* Define to 1 if you have the `crypt' function. */ +#undef HAVE_CRYPT + +/* Define to 1 if you have the header file. */ +#undef HAVE_CRYPTO_SHA2_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_CRYPT_H + +/* Define if you are on Cygwin */ +#undef HAVE_CYGWIN + +/* Define if your libraries define daemon() */ +#undef HAVE_DAEMON + +/* Define to 1 if you have the declaration of `AI_NUMERICSERV', and to 0 if + you don't. */ +#undef HAVE_DECL_AI_NUMERICSERV + +/* Define to 1 if you have the declaration of `authenticate', and to 0 if you + don't. */ +#undef HAVE_DECL_AUTHENTICATE + +/* Define to 1 if you have the declaration of `bzero', and to 0 if you don't. + */ +#undef HAVE_DECL_BZERO + +/* Define to 1 if you have the declaration of `ftruncate', and to 0 if you + don't. */ +#undef HAVE_DECL_FTRUNCATE + +/* Define to 1 if you have the declaration of `getentropy', and to 0 if you + don't. */ +#undef HAVE_DECL_GETENTROPY + +/* Define to 1 if you have the declaration of `getpeereid', and to 0 if you + don't. */ +#undef HAVE_DECL_GETPEEREID + +/* Define to 1 if you have the declaration of `GLOB_NOMATCH', and to 0 if you + don't. */ +#undef HAVE_DECL_GLOB_NOMATCH + +/* Define to 1 if you have the declaration of `GSS_C_NT_HOSTBASED_SERVICE', + and to 0 if you don't. */ +#undef HAVE_DECL_GSS_C_NT_HOSTBASED_SERVICE + +/* Define to 1 if you have the declaration of `howmany', and to 0 if you + don't. */ +#undef HAVE_DECL_HOWMANY + +/* Define to 1 if you have the declaration of `htobe32', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOBE32 + +/* Define to 1 if you have the declaration of `htole64', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOLE64 + +/* Define to 1 if you have the declaration of `h_errno', and to 0 if you + don't. */ +#undef HAVE_DECL_H_ERRNO + +/* Define to 1 if you have the declaration of `INFINITY', and to 0 if you + don't. */ +#undef HAVE_DECL_INFINITY + +/* Define to 1 if you have the declaration of `le32toh', and to 0 if you + don't. */ +#undef HAVE_DECL_LE32TOH + +/* Define to 1 if you have the declaration of `le64toh', and to 0 if you + don't. */ +#undef HAVE_DECL_LE64TOH + +/* Define to 1 if you have the declaration of `loginfailed', and to 0 if you + don't. */ +#undef HAVE_DECL_LOGINFAILED + +/* Define to 1 if you have the declaration of `loginrestrictions', and to 0 if + you don't. */ +#undef HAVE_DECL_LOGINRESTRICTIONS + +/* Define to 1 if you have the declaration of `loginsuccess', and to 0 if you + don't. */ +#undef HAVE_DECL_LOGINSUCCESS + +/* Define to 1 if you have the declaration of `MAXSYMLINKS', and to 0 if you + don't. */ +#undef HAVE_DECL_MAXSYMLINKS + +/* Define to 1 if you have the declaration of `memmem', and to 0 if you don't. + */ +#undef HAVE_DECL_MEMMEM + +/* Define to 1 if you have the declaration of `NFDBITS', and to 0 if you + don't. */ +#undef HAVE_DECL_NFDBITS + +/* Define to 1 if you have the declaration of `offsetof', and to 0 if you + don't. */ +#undef HAVE_DECL_OFFSETOF + +/* Define to 1 if you have the declaration of `O_NONBLOCK', and to 0 if you + don't. */ +#undef HAVE_DECL_O_NONBLOCK + +/* Define to 1 if you have the declaration of `passwdexpired', and to 0 if you + don't. */ +#undef HAVE_DECL_PASSWDEXPIRED + +/* Define to 1 if you have the declaration of `readv', and to 0 if you don't. + */ +#undef HAVE_DECL_READV + +/* Define to 1 if you have the declaration of `setauthdb', and to 0 if you + don't. */ +#undef HAVE_DECL_SETAUTHDB + +/* Define to 1 if you have the declaration of `SHUT_RD', and to 0 if you + don't. */ +#undef HAVE_DECL_SHUT_RD + +/* Define to 1 if you have the declaration of `UINT32_MAX', and to 0 if you + don't. */ +#undef HAVE_DECL_UINT32_MAX + +/* Define to 1 if you have the declaration of `writev', and to 0 if you don't. + */ +#undef HAVE_DECL_WRITEV + +/* Define to 1 if you have the declaration of `_getlong', and to 0 if you + don't. */ +#undef HAVE_DECL__GETLONG + +/* Define to 1 if you have the declaration of `_getshort', and to 0 if you + don't. */ +#undef HAVE_DECL__GETSHORT + +/* Define to 1 if you have the declaration of `__builtin_inff', and to 0 if + you don't. */ +#undef HAVE_DECL___BUILTIN_INFF + +/* Define to 1 if you have the `DES_crypt' function. */ +#undef HAVE_DES_CRYPT + +/* Define if you have /dev/ptmx */ +#undef HAVE_DEV_PTMX + +/* Define if you have /dev/ptc */ +#undef HAVE_DEV_PTS_AND_PTC + +/* Define to 1 if you have the header file. */ +#undef HAVE_DIRENT_H + +/* Define to 1 if you have the `dirfd' function. */ +#undef HAVE_DIRFD + +/* Define to 1 if you have the `dirname' function. */ +#undef HAVE_DIRNAME + +/* Define to 1 if you have the `dlopen' function. */ +#undef HAVE_DLOPEN + +/* Define to 1 if you have the `EC_KEY_METHOD_new' function. */ +#undef HAVE_EC_KEY_METHOD_NEW + +/* Define to 1 if you have the `EC_POINT_get_affine_coordinates' function. */ +#undef HAVE_EC_POINT_GET_AFFINE_COORDINATES + +/* Define to 1 if you have the `EC_POINT_get_affine_coordinates_GFp' function. + */ +#undef HAVE_EC_POINT_GET_AFFINE_COORDINATES_GFP + +/* Define to 1 if you have the `EC_POINT_set_affine_coordinates' function. */ +#undef HAVE_EC_POINT_SET_AFFINE_COORDINATES + +/* Define to 1 if you have the `EC_POINT_set_affine_coordinates_GFp' function. + */ +#undef HAVE_EC_POINT_SET_AFFINE_COORDINATES_GFP + +/* Define to 1 if you have the header file. */ +#undef HAVE_ELF_H + +/* Define to 1 if you have the `endgrent' function. */ +#undef HAVE_ENDGRENT + +/* Define to 1 if you have the header file. */ +#undef HAVE_ENDIAN_H + +/* Define to 1 if you have the `endutent' function. */ +#undef HAVE_ENDUTENT + +/* Define to 1 if you have the `endutxent' function. */ +#undef HAVE_ENDUTXENT + +/* Define to 1 if you have the `err' function. */ +#undef HAVE_ERR + +/* Define to 1 if you have the `errx' function. */ +#undef HAVE_ERRX + +/* Define to 1 if you have the header file. */ +#undef HAVE_ERR_H + +/* Define if your system has /etc/default/login */ +#undef HAVE_ETC_DEFAULT_LOGIN + +/* Define to 1 if you have the `EVP_chacha20' function. */ +#undef HAVE_EVP_CHACHA20 + +/* Define to 1 if you have the `EVP_CIPHER_CTX_get_iv' function. */ +#undef HAVE_EVP_CIPHER_CTX_GET_IV + +/* Define to 1 if you have the `EVP_CIPHER_CTX_get_updated_iv' function. */ +#undef HAVE_EVP_CIPHER_CTX_GET_UPDATED_IV + +/* Define to 1 if you have the `EVP_CIPHER_CTX_iv' function. */ +#undef HAVE_EVP_CIPHER_CTX_IV + +/* Define to 1 if you have the `EVP_CIPHER_CTX_iv_noconst' function. */ +#undef HAVE_EVP_CIPHER_CTX_IV_NOCONST + +/* Define to 1 if you have the `EVP_CIPHER_CTX_set_iv' function. */ +#undef HAVE_EVP_CIPHER_CTX_SET_IV + +/* Define to 1 if you have the `EVP_DigestFinal_ex' function. */ +#undef HAVE_EVP_DIGESTFINAL_EX + +/* Define to 1 if you have the `EVP_DigestInit_ex' function. */ +#undef HAVE_EVP_DIGESTINIT_EX + +/* Define to 1 if you have the `EVP_DigestSign' function. */ +#undef HAVE_EVP_DIGESTSIGN + +/* Define to 1 if you have the `EVP_DigestVerify' function. */ +#undef HAVE_EVP_DIGESTVERIFY + +/* Define to 1 if you have the `EVP_MD_CTX_cleanup' function. */ +#undef HAVE_EVP_MD_CTX_CLEANUP + +/* Define to 1 if you have the `EVP_MD_CTX_copy_ex' function. */ +#undef HAVE_EVP_MD_CTX_COPY_EX + +/* Define to 1 if you have the `EVP_MD_CTX_init' function. */ +#undef HAVE_EVP_MD_CTX_INIT + +/* Define to 1 if you have the `EVP_PKEY_get_raw_private_key' function. */ +#undef HAVE_EVP_PKEY_GET_RAW_PRIVATE_KEY + +/* Define to 1 if you have the `EVP_PKEY_get_raw_public_key' function. */ +#undef HAVE_EVP_PKEY_GET_RAW_PUBLIC_KEY + +/* Define to 1 if you have the `EVP_sha256' function. */ +#undef HAVE_EVP_SHA256 + +/* Define to 1 if you have the `EVP_sha384' function. */ +#undef HAVE_EVP_SHA384 + +/* Define to 1 if you have the `EVP_sha512' function. */ +#undef HAVE_EVP_SHA512 + +/* Define if you have ut_exit in utmp.h */ +#undef HAVE_EXIT_IN_UTMP + +/* Define to 1 if you have the `explicit_bzero' function. */ +#undef HAVE_EXPLICIT_BZERO + +/* Define to 1 if you have the `explicit_memset' function. */ +#undef HAVE_EXPLICIT_MEMSET + +/* Define to 1 if you have the `fchmod' function. */ +#undef HAVE_FCHMOD + +/* Define to 1 if you have the `fchmodat' function. */ +#undef HAVE_FCHMODAT + +/* Define to 1 if you have the `fchown' function. */ +#undef HAVE_FCHOWN + +/* Define to 1 if you have the `fchownat' function. */ +#undef HAVE_FCHOWNAT + +/* Use F_CLOSEM fcntl for closefrom */ +#undef HAVE_FCNTL_CLOSEM + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if the system has the type `fd_mask'. */ +#undef HAVE_FD_MASK + +/* Define to 1 if you have the header file. */ +#undef HAVE_FEATURES_H + +/* Define to 1 if you have the `fido_assert_set_clientdata' function. */ +#undef HAVE_FIDO_ASSERT_SET_CLIENTDATA + +/* Define to 1 if you have the `fido_cred_prot' function. */ +#undef HAVE_FIDO_CRED_PROT + +/* Define to 1 if you have the `fido_cred_set_clientdata' function. */ +#undef HAVE_FIDO_CRED_SET_CLIENTDATA + +/* Define to 1 if you have the `fido_cred_set_prot' function. */ +#undef HAVE_FIDO_CRED_SET_PROT + +/* Define to 1 if you have the `fido_dev_get_touch_begin' function. */ +#undef HAVE_FIDO_DEV_GET_TOUCH_BEGIN + +/* Define to 1 if you have the `fido_dev_get_touch_status' function. */ +#undef HAVE_FIDO_DEV_GET_TOUCH_STATUS + +/* Define to 1 if you have the `fido_dev_is_winhello' function. */ +#undef HAVE_FIDO_DEV_IS_WINHELLO + +/* Define to 1 if you have the `fido_dev_supports_cred_prot' function. */ +#undef HAVE_FIDO_DEV_SUPPORTS_CRED_PROT + +/* Define to 1 if you have the header file. */ +#undef HAVE_FLOATINGPOINT_H + +/* Define to 1 if you have the `flock' function. */ +#undef HAVE_FLOCK + +/* Define to 1 if you have the `fmt_scaled' function. */ +#undef HAVE_FMT_SCALED + +/* Define to 1 if you have the `fnmatch' function. */ +#undef HAVE_FNMATCH + +/* Define to 1 if you have the header file. */ +#undef HAVE_FNMATCH_H + +/* Define to 1 if you have the `freeaddrinfo' function. */ +#undef HAVE_FREEADDRINFO + +/* Define to 1 if you have the `freezero' function. */ +#undef HAVE_FREEZERO + +/* Define to 1 if the system has the type `fsblkcnt_t'. */ +#undef HAVE_FSBLKCNT_T + +/* Define to 1 if the system has the type `fsfilcnt_t'. */ +#undef HAVE_FSFILCNT_T + +/* Define to 1 if you have the `fstatat' function. */ +#undef HAVE_FSTATAT + +/* Define to 1 if you have the `fstatfs' function. */ +#undef HAVE_FSTATFS + +/* Define to 1 if you have the `fstatvfs' function. */ +#undef HAVE_FSTATVFS + +/* Define to 1 if you have the `futimes' function. */ +#undef HAVE_FUTIMES + +/* Define to 1 if you have the `gai_strerror' function. */ +#undef HAVE_GAI_STRERROR + +/* Define to 1 if you have the `getaddrinfo' function. */ +#undef HAVE_GETADDRINFO + +/* Define to 1 if you have the `getaudit' function. */ +#undef HAVE_GETAUDIT + +/* Define to 1 if you have the `getaudit_addr' function. */ +#undef HAVE_GETAUDIT_ADDR + +/* Define to 1 if you have the `getcwd' function. */ +#undef HAVE_GETCWD + +/* Define to 1 if you have the `getentropy' function. */ +#undef HAVE_GETENTROPY + +/* Define to 1 if you have the `getgrouplist' function. */ +#undef HAVE_GETGROUPLIST + +/* Define to 1 if you have the `getgrset' function. */ +#undef HAVE_GETGRSET + +/* Define to 1 if you have the `getlastlogxbyname' function. */ +#undef HAVE_GETLASTLOGXBYNAME + +/* Define to 1 if you have the `getline' function. */ +#undef HAVE_GETLINE + +/* Define to 1 if you have the `getluid' function. */ +#undef HAVE_GETLUID + +/* Define to 1 if you have the `getnameinfo' function. */ +#undef HAVE_GETNAMEINFO + +/* Define to 1 if you have the `getopt' function. */ +#undef HAVE_GETOPT + +/* Define to 1 if you have the header file. */ +#undef HAVE_GETOPT_H + +/* Define if your getopt(3) defines and uses optreset */ +#undef HAVE_GETOPT_OPTRESET + +/* Define if your libraries define getpagesize() */ +#undef HAVE_GETPAGESIZE + +/* Define to 1 if you have the `getpeereid' function. */ +#undef HAVE_GETPEEREID + +/* Define to 1 if you have the `getpeerucred' function. */ +#undef HAVE_GETPEERUCRED + +/* Define to 1 if you have the `getpgid' function. */ +#undef HAVE_GETPGID + +/* Define to 1 if you have the `getpgrp' function. */ +#undef HAVE_GETPGRP + +/* Define to 1 if you have the `getpwanam' function. */ +#undef HAVE_GETPWANAM + +/* Define to 1 if you have the `getrandom' function. */ +#undef HAVE_GETRANDOM + +/* Define to 1 if you have the `getrlimit' function. */ +#undef HAVE_GETRLIMIT + +/* Define if getrrsetbyname() exists */ +#undef HAVE_GETRRSETBYNAME + +/* Define to 1 if you have the `getseuserbyname' function. */ +#undef HAVE_GETSEUSERBYNAME + +/* Define to 1 if you have the `getsid' function. */ +#undef HAVE_GETSID + +/* Define to 1 if you have the `gettimeofday' function. */ +#undef HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the `getttyent' function. */ +#undef HAVE_GETTTYENT + +/* Define to 1 if you have the `getutent' function. */ +#undef HAVE_GETUTENT + +/* Define to 1 if you have the `getutid' function. */ +#undef HAVE_GETUTID + +/* Define to 1 if you have the `getutline' function. */ +#undef HAVE_GETUTLINE + +/* Define to 1 if you have the `getutxent' function. */ +#undef HAVE_GETUTXENT + +/* Define to 1 if you have the `getutxid' function. */ +#undef HAVE_GETUTXID + +/* Define to 1 if you have the `getutxline' function. */ +#undef HAVE_GETUTXLINE + +/* Define to 1 if you have the `getutxuser' function. */ +#undef HAVE_GETUTXUSER + +/* Define to 1 if you have the `get_default_context_with_level' function. */ +#undef HAVE_GET_DEFAULT_CONTEXT_WITH_LEVEL + +/* Define to 1 if you have the `glob' function. */ +#undef HAVE_GLOB + +/* Define to 1 if you have the header file. */ +#undef HAVE_GLOB_H + +/* Define to 1 if you have the `group_from_gid' function. */ +#undef HAVE_GROUP_FROM_GID + +/* Define to 1 if you have the header file. */ +#undef HAVE_GSSAPI_GENERIC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_GSSAPI_GSSAPI_GENERIC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_GSSAPI_GSSAPI_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_GSSAPI_GSSAPI_KRB5_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_GSSAPI_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_GSSAPI_KRB5_H + +/* Define if HEADER.ad exists in arpa/nameser.h */ +#undef HAVE_HEADER_AD + +/* Define to 1 if you have the `HMAC_CTX_init' function. */ +#undef HAVE_HMAC_CTX_INIT + +/* Define if you have ut_host in utmp.h */ +#undef HAVE_HOST_IN_UTMP + +/* Define if you have ut_host in utmpx.h */ +#undef HAVE_HOST_IN_UTMPX + +/* Define to 1 if you have the header file. */ +#undef HAVE_IAF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_IA_H + +/* Define if you have ut_id in utmp.h */ +#undef HAVE_ID_IN_UTMP + +/* Define if you have ut_id in utmpx.h */ +#undef HAVE_ID_IN_UTMPX + +/* Define to 1 if you have the header file. */ +#undef HAVE_IFADDRS_H + +/* Define to 1 if you have the `inet_aton' function. */ +#undef HAVE_INET_ATON + +/* Define to 1 if you have the `inet_ntoa' function. */ +#undef HAVE_INET_NTOA + +/* Define to 1 if you have the `inet_ntop' function. */ +#undef HAVE_INET_NTOP + +/* Define to 1 if you have the `innetgr' function. */ +#undef HAVE_INNETGR + +/* define if you have int64_t data type */ +#undef HAVE_INT64_T + +/* Define to 1 if the system has the type `intmax_t'. */ +#undef HAVE_INTMAX_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* define if you have intxx_t data type */ +#undef HAVE_INTXX_T + +/* Define to 1 if the system has the type `in_addr_t'. */ +#undef HAVE_IN_ADDR_T + +/* Define to 1 if the system has the type `in_port_t'. */ +#undef HAVE_IN_PORT_T + +/* Define if you have isblank(3C). */ +#undef HAVE_ISBLANK + +/* Define to 1 if you have the `killpg' function. */ +#undef HAVE_KILLPG + +/* Define to 1 if you have the `krb5_cc_new_unique' function. */ +#undef HAVE_KRB5_CC_NEW_UNIQUE + +/* Define to 1 if you have the `krb5_free_error_message' function. */ +#undef HAVE_KRB5_FREE_ERROR_MESSAGE + +/* Define to 1 if you have the `krb5_get_error_message' function. */ +#undef HAVE_KRB5_GET_ERROR_MESSAGE + +/* Define to 1 if you have the header file. */ +#undef HAVE_LANGINFO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LASTLOG_H + +/* Define if you want ldns support */ +#undef HAVE_LDNS + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBAUDIT_H + +/* Define to 1 if you have the `bsm' library (-lbsm). */ +#undef HAVE_LIBBSM + +/* Define to 1 if you have the `dl' library (-ldl). */ +#undef HAVE_LIBDL + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBGEN_H + +/* Define if system has libiaf that supports set_id */ +#undef HAVE_LIBIAF + +/* Define to 1 if you have the `network' library (-lnetwork). */ +#undef HAVE_LIBNETWORK + +/* Define to 1 if you have the `pam' library (-lpam). */ +#undef HAVE_LIBPAM + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBPROC_H + +/* Define to 1 if you have the `socket' library (-lsocket). */ +#undef HAVE_LIBSOCKET + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBUTIL_H + +/* Define to 1 if you have the `xnet' library (-lxnet). */ +#undef HAVE_LIBXNET + +/* Define to 1 if you have the `z' library (-lz). */ +#undef HAVE_LIBZ + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_AUDIT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_FILTER_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_IF_TUN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_SECCOMP_H + +/* Define to 1 if you have the `llabs' function. */ +#undef HAVE_LLABS + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if you have the `localtime_r' function. */ +#undef HAVE_LOCALTIME_R + +/* Define to 1 if you have the `login' function. */ +#undef HAVE_LOGIN + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOGIN_CAP_H + +/* Define to 1 if you have the `login_getcapbool' function. */ +#undef HAVE_LOGIN_GETCAPBOOL + +/* Define to 1 if you have the `login_getpwclass' function. */ +#undef HAVE_LOGIN_GETPWCLASS + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOGIN_H + +/* Define to 1 if you have the `logout' function. */ +#undef HAVE_LOGOUT + +/* Define to 1 if you have the `logwtmp' function. */ +#undef HAVE_LOGWTMP + +/* Define to 1 if the system has the type `long double'. */ +#undef HAVE_LONG_DOUBLE + +/* Define to 1 if the system has the type `long long'. */ +#undef HAVE_LONG_LONG + +/* Define to 1 if you have the header file. */ +#undef HAVE_MAILLOCK_H + +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#undef HAVE_MALLOC + +/* Define to 1 if you have the `mblen' function. */ +#undef HAVE_MBLEN + +/* Define to 1 if you have the `mbtowc' function. */ +#undef HAVE_MBTOWC + +/* Define to 1 if you have the `memmem' function. */ +#undef HAVE_MEMMEM + +/* Define to 1 if you have the `memmove' function. */ +#undef HAVE_MEMMOVE + +/* Define to 1 if you have the `memset_s' function. */ +#undef HAVE_MEMSET_S + +/* Define to 1 if you have the `mkdtemp' function. */ +#undef HAVE_MKDTEMP + +/* Define to 1 if you have the `mmap' function. */ +#undef HAVE_MMAP + +/* define if you have mode_t data type */ +#undef HAVE_MODE_T + +/* Some systems put nanosleep outside of libc */ +#undef HAVE_NANOSLEEP + +/* Define to 1 if you have the header file. */ +#undef HAVE_NDIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETDB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETGROUP_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NET_IF_TUN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NET_ROUTE_H + +/* Define if you are on NeXT */ +#undef HAVE_NEXT + +/* Define to 1 if the system has the type `nfds_t'. */ +#undef HAVE_NFDS_T + +/* Define to 1 if you have the `ngetaddrinfo' function. */ +#undef HAVE_NGETADDRINFO + +/* Define to 1 if you have the `nlist' function. */ +#undef HAVE_NLIST + +/* Define to 1 if you have the header file. */ +#undef HAVE_NLIST_H + +/* Define to 1 if you have the `nl_langinfo' function. */ +#undef HAVE_NL_LANGINFO + +/* Define to 1 if you have the `nsleep' function. */ +#undef HAVE_NSLEEP + +/* Define to 1 if you have the `ogetaddrinfo' function. */ +#undef HAVE_OGETADDRINFO + +/* Define if you have an old version of PAM which takes only one argument to + pam_strerror */ +#undef HAVE_OLD_PAM + +/* Define to 1 if you have the `openlog_r' function. */ +#undef HAVE_OPENLOG_R + +/* Define to 1 if you have the `openpty' function. */ +#undef HAVE_OPENPTY + +/* Define to 1 if you have the header file. */ +#undef HAVE_OPENSSL_CONFIGURATION_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_OPENSSL_OPENSSLCONF_H + +/* Define to 1 if you have the `OpenSSL_version' function. */ +#undef HAVE_OPENSSL_VERSION + +/* Define to 1 if you have the `OpenSSL_version_num' function. */ +#undef HAVE_OPENSSL_VERSION_NUM + +/* Define if you have Digital Unix Security Integration Architecture */ +#undef HAVE_OSF_SIA + +/* Define to 1 if you have the `pam_getenvlist' function. */ +#undef HAVE_PAM_GETENVLIST + +/* Define to 1 if you have the header file. */ +#undef HAVE_PAM_PAM_APPL_H + +/* Define to 1 if you have the `pam_putenv' function. */ +#undef HAVE_PAM_PUTENV + +/* Define to 1 if you have the header file. */ +#undef HAVE_PATHS_H + +/* Define if you have ut_pid in utmp.h */ +#undef HAVE_PID_IN_UTMP + +/* define if you have pid_t data type */ +#undef HAVE_PID_T + +/* Define to 1 if you have the `pledge' function. */ +#undef HAVE_PLEDGE + +/* Define to 1 if you have the `poll' function. */ +#undef HAVE_POLL + +/* Define to 1 if you have the header file. */ +#undef HAVE_POLL_H + +/* Define to 1 if you have the `ppoll' function. */ +#undef HAVE_PPOLL + +/* Define to 1 if you have the `prctl' function. */ +#undef HAVE_PRCTL + +/* Define to 1 if you have the `priv_basicset' function. */ +#undef HAVE_PRIV_BASICSET + +/* Define to 1 if you have the header file. */ +#undef HAVE_PRIV_H + +/* Define to 1 if you have the `procctl' function. */ +#undef HAVE_PROCCTL + +/* Define if you have /proc/$pid/fd */ +#undef HAVE_PROC_PID + +/* Define to 1 if you have the `proc_pidinfo' function. */ +#undef HAVE_PROC_PIDINFO + +/* Define to 1 if you have the `pselect' function. */ +#undef HAVE_PSELECT + +/* Define to 1 if you have the `pstat' function. */ +#undef HAVE_PSTAT + +/* Define to 1 if you have the header file. */ +#undef HAVE_PTY_H + +/* Define to 1 if you have the `pututline' function. */ +#undef HAVE_PUTUTLINE + +/* Define to 1 if you have the `pututxline' function. */ +#undef HAVE_PUTUTXLINE + +/* Define to 1 if you have the `raise' function. */ +#undef HAVE_RAISE + +/* Define to 1 if you have the `readpassphrase' function. */ +#undef HAVE_READPASSPHRASE + +/* Define to 1 if you have the header file. */ +#undef HAVE_READPASSPHRASE_H + +/* Define to 1 if your system has a GNU libc compatible `realloc' function, + and to 0 otherwise. */ +#undef HAVE_REALLOC + +/* Define to 1 if you have the `reallocarray' function. */ +#undef HAVE_REALLOCARRAY + +/* Define to 1 if you have the `realpath' function. */ +#undef HAVE_REALPATH + +/* Define to 1 if you have the `recallocarray' function. */ +#undef HAVE_RECALLOCARRAY + +/* Define to 1 if you have the `recvmsg' function. */ +#undef HAVE_RECVMSG + +/* sys/resource.h has RLIMIT_NPROC */ +#undef HAVE_RLIMIT_NPROC + +/* Define to 1 if you have the header file. */ +#undef HAVE_RPC_TYPES_H + +/* Define to 1 if you have the `rresvport_af' function. */ +#undef HAVE_RRESVPORT_AF + +/* Define to 1 if you have the `RSA_generate_key_ex' function. */ +#undef HAVE_RSA_GENERATE_KEY_EX + +/* Define to 1 if you have the `RSA_get_default_method' function. */ +#undef HAVE_RSA_GET_DEFAULT_METHOD + +/* Define to 1 if you have the header file. */ +#undef HAVE_SANDBOX_H + +/* Define to 1 if you have the `sandbox_init' function. */ +#undef HAVE_SANDBOX_INIT + +/* define if you have sa_family_t data type */ +#undef HAVE_SA_FAMILY_T + +/* Define to 1 if you have the `scan_scaled' function. */ +#undef HAVE_SCAN_SCALED + +/* Define if you have SecureWare-based protected password database */ +#undef HAVE_SECUREWARE + +/* Define to 1 if you have the header file. */ +#undef HAVE_SECURITY_PAM_APPL_H + +/* Define to 1 if you have the `sendmsg' function. */ +#undef HAVE_SENDMSG + +/* Define to 1 if you have the `setauthdb' function. */ +#undef HAVE_SETAUTHDB + +/* Define to 1 if you have the `setdtablesize' function. */ +#undef HAVE_SETDTABLESIZE + +/* Define to 1 if you have the `setegid' function. */ +#undef HAVE_SETEGID + +/* Define to 1 if you have the `setenv' function. */ +#undef HAVE_SETENV + +/* Define to 1 if you have the `seteuid' function. */ +#undef HAVE_SETEUID + +/* Define to 1 if you have the `setgroupent' function. */ +#undef HAVE_SETGROUPENT + +/* Define to 1 if you have the `setgroups' function. */ +#undef HAVE_SETGROUPS + +/* Define to 1 if you have the `setlinebuf' function. */ +#undef HAVE_SETLINEBUF + +/* Define to 1 if you have the `setlogin' function. */ +#undef HAVE_SETLOGIN + +/* Define to 1 if you have the `setluid' function. */ +#undef HAVE_SETLUID + +/* Define to 1 if you have the `setpassent' function. */ +#undef HAVE_SETPASSENT + +/* Define to 1 if you have the `setpcred' function. */ +#undef HAVE_SETPCRED + +/* Define to 1 if you have the `setpflags' function. */ +#undef HAVE_SETPFLAGS + +/* Define to 1 if you have the `setppriv' function. */ +#undef HAVE_SETPPRIV + +/* Define to 1 if you have the `setproctitle' function. */ +#undef HAVE_SETPROCTITLE + +/* Define to 1 if you have the `setregid' function. */ +#undef HAVE_SETREGID + +/* Define to 1 if you have the `setresgid' function. */ +#undef HAVE_SETRESGID + +/* Define to 1 if you have the `setresuid' function. */ +#undef HAVE_SETRESUID + +/* Define to 1 if you have the `setreuid' function. */ +#undef HAVE_SETREUID + +/* Define to 1 if you have the `setrlimit' function. */ +#undef HAVE_SETRLIMIT + +/* Define to 1 if you have the `setsid' function. */ +#undef HAVE_SETSID + +/* Define to 1 if you have the `setutent' function. */ +#undef HAVE_SETUTENT + +/* Define to 1 if you have the `setutxdb' function. */ +#undef HAVE_SETUTXDB + +/* Define to 1 if you have the `setutxent' function. */ +#undef HAVE_SETUTXENT + +/* Define to 1 if you have the `setvbuf' function. */ +#undef HAVE_SETVBUF + +/* Define to 1 if you have the `set_id' function. */ +#undef HAVE_SET_ID + +/* Define to 1 if you have the `SHA256Update' function. */ +#undef HAVE_SHA256UPDATE + +/* Define to 1 if you have the header file. */ +#undef HAVE_SHA2_H + +/* Define to 1 if you have the `SHA384Update' function. */ +#undef HAVE_SHA384UPDATE + +/* Define to 1 if you have the `SHA512Update' function. */ +#undef HAVE_SHA512UPDATE + +/* Define to 1 if you have the header file. */ +#undef HAVE_SHADOW_H + +/* Define to 1 if you have the `sigaction' function. */ +#undef HAVE_SIGACTION + +/* Define to 1 if the system has the type `sighandler_t'. */ +#undef HAVE_SIGHANDLER_T + +/* Define to 1 if you have the `sigvec' function. */ +#undef HAVE_SIGVEC + +/* Define to 1 if the system has the type `sig_atomic_t'. */ +#undef HAVE_SIG_ATOMIC_T + +/* define if you have size_t data type */ +#undef HAVE_SIZE_T + +/* Define to 1 if you have the `snprintf' function. */ +#undef HAVE_SNPRINTF + +/* Define to 1 if you have the `socketpair' function. */ +#undef HAVE_SOCKETPAIR + +/* Have PEERCRED socket option */ +#undef HAVE_SO_PEERCRED + +/* define if you have ssize_t data type */ +#undef HAVE_SSIZE_T + +/* Fields in struct sockaddr_storage */ +#undef HAVE_SS_FAMILY_IN_SS + +/* Define if you have ut_ss in utmpx.h */ +#undef HAVE_SS_IN_UTMPX + +/* Define to 1 if you have the `statfs' function. */ +#undef HAVE_STATFS + +/* Define to 1 if you have the `statvfs' function. */ +#undef HAVE_STATVFS + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strcasestr' function. */ +#undef HAVE_STRCASESTR + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* Define to 1 if you have the `strftime' function. */ +#undef HAVE_STRFTIME + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strlcat' function. */ +#undef HAVE_STRLCAT + +/* Define to 1 if you have the `strlcpy' function. */ +#undef HAVE_STRLCPY + +/* Define to 1 if you have the `strmode' function. */ +#undef HAVE_STRMODE + +/* Define to 1 if you have the `strndup' function. */ +#undef HAVE_STRNDUP + +/* Define to 1 if you have the `strnlen' function. */ +#undef HAVE_STRNLEN + +/* Define to 1 if you have the `strnvis' function. */ +#undef HAVE_STRNVIS + +/* Define to 1 if you have the `strptime' function. */ +#undef HAVE_STRPTIME + +/* Define to 1 if you have the `strsep' function. */ +#undef HAVE_STRSEP + +/* Define to 1 if you have the `strsignal' function. */ +#undef HAVE_STRSIGNAL + +/* Define to 1 if you have the `strtoll' function. */ +#undef HAVE_STRTOLL + +/* Define to 1 if you have the `strtonum' function. */ +#undef HAVE_STRTONUM + +/* Define to 1 if you have the `strtoul' function. */ +#undef HAVE_STRTOUL + +/* Define to 1 if you have the `strtoull' function. */ +#undef HAVE_STRTOULL + +/* define if you have struct addrinfo data type */ +#undef HAVE_STRUCT_ADDRINFO + +/* Define to 1 if `d_type' is a member of `struct dirent'. */ +#undef HAVE_STRUCT_DIRENT_D_TYPE + +/* define if you have struct in6_addr data type */ +#undef HAVE_STRUCT_IN6_ADDR + +/* Define to 1 if `pw_change' is a member of `struct passwd'. */ +#undef HAVE_STRUCT_PASSWD_PW_CHANGE + +/* Define to 1 if `pw_class' is a member of `struct passwd'. */ +#undef HAVE_STRUCT_PASSWD_PW_CLASS + +/* Define to 1 if `pw_expire' is a member of `struct passwd'. */ +#undef HAVE_STRUCT_PASSWD_PW_EXPIRE + +/* Define to 1 if `pw_gecos' is a member of `struct passwd'. */ +#undef HAVE_STRUCT_PASSWD_PW_GECOS + +/* Define to 1 if `fd' is a member of `struct pollfd'. */ +#undef HAVE_STRUCT_POLLFD_FD + +/* define if you have struct sockaddr_in6 data type */ +#undef HAVE_STRUCT_SOCKADDR_IN6 + +/* Define to 1 if `sin6_scope_id' is a member of `struct sockaddr_in6'. */ +#undef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID + +/* define if you have struct sockaddr_storage data type */ +#undef HAVE_STRUCT_SOCKADDR_STORAGE + +/* Define to 1 if `f_files' is a member of `struct statfs'. */ +#undef HAVE_STRUCT_STATFS_F_FILES + +/* Define to 1 if `f_flags' is a member of `struct statfs'. */ +#undef HAVE_STRUCT_STATFS_F_FLAGS + +/* Define to 1 if `st_blksize' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_BLKSIZE + +/* Define to 1 if `st_mtim' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_MTIM + +/* Define to 1 if `st_mtime' is a member of `struct stat'. */ +#undef HAVE_STRUCT_STAT_ST_MTIME + +/* define if you have struct timespec */ +#undef HAVE_STRUCT_TIMESPEC + +/* define if you have struct timeval */ +#undef HAVE_STRUCT_TIMEVAL + +/* Define to 1 if you have the `sysconf' function. */ +#undef HAVE_SYSCONF + +/* Define if you have syslen in utmpx.h */ +#undef HAVE_SYSLEN_IN_UTMPX + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_AUDIT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_BITYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_BSDTTY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_BYTEORDER_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_CAPSICUM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_CDEFS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_DIR_H + +/* Define if your system defines sys_errlist[] */ +#undef HAVE_SYS_ERRLIST + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_FILE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_LABEL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MMAN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MOUNT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_NDIR_H + +/* Define if your system defines sys_nerr */ +#undef HAVE_SYS_NERR + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_POLL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PRCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PROCCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PSTAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PTMS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PTRACE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RANDOM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SELECT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STATVFS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STREAM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STROPTS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STRTIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSCTL_H + +/* Force use of sys/syslog.h on Ultrix */ +#undef HAVE_SYS_SYSLOG_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSMACROS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIMERS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_UN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_VFS_H + +/* Define to 1 if you have the `tcgetpgrp' function. */ +#undef HAVE_TCGETPGRP + +/* Define to 1 if you have the `tcsendbreak' function. */ +#undef HAVE_TCSENDBREAK + +/* Define to 1 if you have the `time' function. */ +#undef HAVE_TIME + +/* Define to 1 if you have the `timegm' function. */ +#undef HAVE_TIMEGM + +/* Define to 1 if you have the header file. */ +#undef HAVE_TIME_H + +/* Define if you have ut_time in utmp.h */ +#undef HAVE_TIME_IN_UTMP + +/* Define if you have ut_time in utmpx.h */ +#undef HAVE_TIME_IN_UTMPX + +/* Define to 1 if you have the `timingsafe_bcmp' function. */ +#undef HAVE_TIMINGSAFE_BCMP + +/* Define to 1 if you have the header file. */ +#undef HAVE_TMPDIR_H + +/* Define to 1 if you have the `truncate' function. */ +#undef HAVE_TRUNCATE + +/* Define to 1 if you have the header file. */ +#undef HAVE_TTYENT_H + +/* Define if you have ut_tv in utmp.h */ +#undef HAVE_TV_IN_UTMP + +/* Define if you have ut_tv in utmpx.h */ +#undef HAVE_TV_IN_UTMPX + +/* Define if you have ut_type in utmp.h */ +#undef HAVE_TYPE_IN_UTMP + +/* Define if you have ut_type in utmpx.h */ +#undef HAVE_TYPE_IN_UTMPX + +/* Define to 1 if you have the header file. */ +#undef HAVE_UCRED_H + +/* Define to 1 if the system has the type `uintmax_t'. */ +#undef HAVE_UINTMAX_T + +/* define if you have uintxx_t data type */ +#undef HAVE_UINTXX_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the `unlinkat' function. */ +#undef HAVE_UNLINKAT + +/* Define to 1 if you have the `unsetenv' function. */ +#undef HAVE_UNSETENV + +/* Define to 1 if the system has the type `unsigned long long'. */ +#undef HAVE_UNSIGNED_LONG_LONG + +/* Define to 1 if you have the `unveil' function. */ +#undef HAVE_UNVEIL + +/* Define to 1 if you have the `updwtmp' function. */ +#undef HAVE_UPDWTMP + +/* Define to 1 if you have the `updwtmpx' function. */ +#undef HAVE_UPDWTMPX + +/* Define to 1 if you have the header file. */ +#undef HAVE_USERSEC_H + +/* Define to 1 if you have the `user_from_uid' function. */ +#undef HAVE_USER_FROM_UID + +/* Define to 1 if you have the `usleep' function. */ +#undef HAVE_USLEEP + +/* Define to 1 if you have the header file. */ +#undef HAVE_UTIL_H + +/* Define to 1 if you have the `utimensat' function. */ +#undef HAVE_UTIMENSAT + +/* Define to 1 if you have the `utimes' function. */ +#undef HAVE_UTIMES + +/* Define to 1 if you have the header file. */ +#undef HAVE_UTIME_H + +/* Define to 1 if you have the `utmpname' function. */ +#undef HAVE_UTMPNAME + +/* Define to 1 if you have the `utmpxname' function. */ +#undef HAVE_UTMPXNAME + +/* Define to 1 if you have the header file. */ +#undef HAVE_UTMPX_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UTMP_H + +/* define if you have u_char data type */ +#undef HAVE_U_CHAR + +/* define if you have u_int data type */ +#undef HAVE_U_INT + +/* define if you have u_int64_t data type */ +#undef HAVE_U_INT64_T + +/* define if you have u_intxx_t data type */ +#undef HAVE_U_INTXX_T + +/* Define to 1 if you have the `vasprintf' function. */ +#undef HAVE_VASPRINTF + +/* Define if va_copy exists */ +#undef HAVE_VA_COPY + +/* Define to 1 if you have the header file. */ +#undef HAVE_VIS_H + +/* Define to 1 if you have the `vsnprintf' function. */ +#undef HAVE_VSNPRINTF + +/* Define to 1 if you have the `waitpid' function. */ +#undef HAVE_WAITPID + +/* Define to 1 if you have the `warn' function. */ +#undef HAVE_WARN + +/* Define to 1 if you have the header file. */ +#undef HAVE_WCHAR_H + +/* Define to 1 if you have the `wcwidth' function. */ +#undef HAVE_WCWIDTH + +/* Define to 1 if you have the `_getlong' function. */ +#undef HAVE__GETLONG + +/* Define to 1 if you have the `_getpty' function. */ +#undef HAVE__GETPTY + +/* Define to 1 if you have the `_getshort' function. */ +#undef HAVE__GETSHORT + +/* Define if you have struct __res_state _res as an extern */ +#undef HAVE__RES_EXTERN + +/* Define to 1 if you have the `__b64_ntop' function. */ +#undef HAVE___B64_NTOP + +/* Define to 1 if you have the `__b64_pton' function. */ +#undef HAVE___B64_PTON + +/* Define if compiler implements __FUNCTION__ */ +#undef HAVE___FUNCTION__ + +/* Define if libc defines __progname */ +#undef HAVE___PROGNAME + +/* Fields in struct sockaddr_storage */ +#undef HAVE___SS_FAMILY_IN_SS + +/* Define if __va_copy exists */ +#undef HAVE___VA_COPY + +/* Define if compiler implements __func__ */ +#undef HAVE___func__ + +/* Define this if you are using the Heimdal version of Kerberos V5 */ +#undef HEIMDAL + +/* Define if you need to use IP address instead of hostname in $DISPLAY */ +#undef IPADDR_IN_DISPLAY + +/* Detect IPv4 in IPv6 mapped addresses and treat as IPv4 */ +#undef IPV4_IN_IPV6 + +/* Define if your system choked on IP TOS setting */ +#undef IP_TOS_IS_BROKEN + +/* Define if you want Kerberos 5 support */ +#undef KRB5 + +/* Define if pututxline updates lastlog too */ +#undef LASTLOG_WRITE_PUTUTXLINE + +/* Define to whatever link() returns for "not supported" if it doesn't return + EOPNOTSUPP. */ +#undef LINK_OPNOTSUPP_ERRNO + +/* Lock all memory to protect sshd against Linux kcompactd */ +#undef LINUX_MEMLOCK_ONFAULT + +/* Adjust Linux out-of-memory killer */ +#undef LINUX_OOM_ADJUST + +/* max value of long long calculated by configure */ +#undef LLONG_MAX + +/* min value of long long calculated by configure */ +#undef LLONG_MIN + +/* Account locked with pw(1) */ +#undef LOCKED_PASSWD_PREFIX + +/* String used in /etc/passwd to denote locked account */ +#undef LOCKED_PASSWD_STRING + +/* String used in /etc/passwd to denote locked account */ +#undef LOCKED_PASSWD_SUBSTR + +/* Some systems need a utmpx entry for /bin/login to work */ +#undef LOGIN_NEEDS_UTMPX + +/* Set this to your mail directory if you do not have _PATH_MAILDIR */ +#undef MAIL_DIRECTORY + +/* Define if your compiler lacks __builtin_popcount */ +#undef MISSING_BUILTIN_POPCOUNT + +/* Need setpgrp to for controlling tty */ +#undef NEED_SETPGRP + +/* compiler does not accept __attribute__ on prototype args */ +#undef NO_ATTRIBUTE_ON_PROTOTYPE_ARGS + +/* compiler does not accept __attribute__ on return types */ +#undef NO_ATTRIBUTE_ON_RETURN_TYPE + +/* SA_RESTARTed signals do no interrupt select */ +#undef NO_SA_RESTART + +/* Define to disable UID restoration test */ +#undef NO_UID_RESTORATION_TEST + +/* Define if X11 doesn't support AF_UNIX sockets on that system */ +#undef NO_X11_UNIX_SOCKETS + +/* Define if EVP_DigestUpdate returns void */ +#undef OPENSSL_EVP_DIGESTUPDATE_VOID + +/* OpenSSL has ECC */ +#undef OPENSSL_HAS_ECC + +/* libcrypto has ed25519 support */ +#undef OPENSSL_HAS_ED25519 + +/* libcrypto has NID_X9_62_prime256v1 */ +#undef OPENSSL_HAS_NISTP256 + +/* libcrypto has NID_secp384r1 */ +#undef OPENSSL_HAS_NISTP384 + +/* libcrypto has NID_secp521r1 */ +#undef OPENSSL_HAS_NISTP521 + +/* Define if you want the OpenSSL internally seeded PRNG only */ +#undef OPENSSL_PRNG_ONLY + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define if you are using Solaris-derived PAM which passes pam_messages to + the conversation function with an extra level of indirection */ +#undef PAM_SUN_CODEBASE + +/* Work around problematic Linux PAM modules handling of PAM_TTY */ +#undef PAM_TTY_KLUDGE + +/* must supply username to passwd */ +#undef PASSWD_NEEDS_USERNAME + +/* System dirs owned by bin (uid 2) */ +#undef PLATFORM_SYS_DIR_UID + +/* need inet in pledge for setsockopt IP_TOS */ +#undef PLEDGE_EXTRA_INET + +/* Define if poll 2nd arg is ulong */ +#undef POLL_NFDS_T_ULONG + +/* Port number of PRNGD/EGD random number socket */ +#undef PRNGD_PORT + +/* Location of PRNGD/EGD random number socket */ +#undef PRNGD_SOCKET + +/* read(1) can return 0 for a non-closed fd */ +#undef PTY_ZEROREAD + +/* Sandbox using capsicum */ +#undef SANDBOX_CAPSICUM + +/* Sandbox using Darwin sandbox_init(3) */ +#undef SANDBOX_DARWIN + +/* no privsep sandboxing */ +#undef SANDBOX_NULL + +/* Sandbox using setrlimit(2) */ +#undef SANDBOX_RLIMIT + +/* Sandbox using seccomp filter */ +#undef SANDBOX_SECCOMP_FILTER + +/* setrlimit RLIMIT_FSIZE works */ +#undef SANDBOX_SKIP_RLIMIT_FSIZE + +/* define if setrlimit RLIMIT_NOFILE breaks things */ +#undef SANDBOX_SKIP_RLIMIT_NOFILE + +/* Sandbox using Solaris/Illumos privileges */ +#undef SANDBOX_SOLARIS + +/* Specify the system call convention in use */ +#undef SECCOMP_AUDIT_ARCH + +/* Define if your platform breaks doing a seteuid before a setuid */ +#undef SETEUID_BREAKS_SETUID + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of `long int', as computed by sizeof. */ +#undef SIZEOF_LONG_INT + +/* The size of `long long int', as computed by sizeof. */ +#undef SIZEOF_LONG_LONG_INT + +/* The size of `short int', as computed by sizeof. */ +#undef SIZEOF_SHORT_INT + +/* The size of `time_t', as computed by sizeof. */ +#undef SIZEOF_TIME_T + +/* Define as const if snprintf() can declare const char *fmt */ +#undef SNPRINTF_CONST + +/* sockaddr_in has sin_len */ +#undef SOCK_HAS_LEN + +/* Define to a Set Process Title type if your system is supported by + bsd-setproctitle.c */ +#undef SPT_TYPE + +/* Define if sshd somehow reacquires a controlling TTY after setsid() */ +#undef SSHD_ACQUIRES_CTTY + +/* sshd PAM service name */ +#undef SSHD_PAM_SERVICE + +/* Use audit debugging module */ +#undef SSH_AUDIT_EVENTS + +/* Windows is sensitive to read buffer size */ +#undef SSH_IOBUFSZ + +/* non-privileged user for privilege separation */ +#undef SSH_PRIVSEP_USER + +/* Use tunnel device compatibility to OpenBSD */ +#undef SSH_TUN_COMPAT_AF + +/* Open tunnel devices the FreeBSD way */ +#undef SSH_TUN_FREEBSD + +/* Open tunnel devices the Linux tun/tap way */ +#undef SSH_TUN_LINUX + +/* No layer 2 tunnel support */ +#undef SSH_TUN_NO_L2 + +/* Open tunnel devices the OpenBSD way */ +#undef SSH_TUN_OPENBSD + +/* Prepend the address family to IP tunnel traffic */ +#undef SSH_TUN_PREPEND_AF + +/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ +#undef STDC_HEADERS + +/* Define if you want a different $PATH for the superuser */ +#undef SUPERUSER_PATH + +/* syslog_r function is safe to use in in a signal handler */ +#undef SYSLOG_R_SAFE_IN_SIGHAND + +/* Have sshd notify systemd on start/reload */ +#undef SYSTEMD_NOTIFY + +/* Support routing domains using Linux VRF */ +#undef SYS_RDOMAIN_LINUX + +/* Support passwords > 8 chars */ +#undef UNIXWARE_LONG_PASSWORDS + +/* Specify default $PATH */ +#undef USER_PATH + +/* Define this if you want to use libkafs' AFS support */ +#undef USE_AFS + +/* Use BSM audit module */ +#undef USE_BSM_AUDIT + +/* Use btmp to log bad logins */ +#undef USE_BTMP + +/* Use libedit for sftp */ +#undef USE_LIBEDIT + +/* Use Linux audit module */ +#undef USE_LINUX_AUDIT + +/* Enable OpenSSL engine support */ +#undef USE_OPENSSL_ENGINE + +/* Define if you want to enable PAM support */ +#undef USE_PAM + +/* Use PIPES instead of a socketpair() */ +#undef USE_PIPES + +/* Define if you have Solaris privileges */ +#undef USE_SOLARIS_PRIVS + +/* Define if you have Solaris process contracts */ +#undef USE_SOLARIS_PROCESS_CONTRACTS + +/* Define if you have Solaris projects */ +#undef USE_SOLARIS_PROJECTS + +/* Use libwtmpdb for sshd */ +#undef USE_WTMPDB + +/* compiler variable declarations after code */ +#undef VARIABLE_DECLARATION_AFTER_CODE + +/* compiler supports variable length arrays */ +#undef VARIABLE_LENGTH_ARRAYS + +/* Define if you shouldn't strip 'tty' from your ttyname in [uw]tmp */ +#undef WITH_ABBREV_NO_TTY + +/* Define if you want to enable AIX4's authenticate function */ +#undef WITH_AIXAUTHENTICATE + +/* Define if you have/want arrays (cluster-wide session management, not C + arrays) */ +#undef WITH_IRIX_ARRAY + +/* Define if you want IRIX audit trails */ +#undef WITH_IRIX_AUDIT + +/* Define if you want IRIX kernel jobs */ +#undef WITH_IRIX_JOBS + +/* Define if you want IRIX project management */ +#undef WITH_IRIX_PROJECT + +/* use libcrypto for cryptography */ +#undef WITH_OPENSSL + +/* Define if you want SELinux support. */ +#undef WITH_SELINUX + +/* Enable zlib */ +#undef WITH_ZLIB + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Define if xauth is found in your path */ +#undef XAUTH_PATH + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +/* log for bad login attempts */ +#undef _PATH_BTMP + +/* Full path of your "passwd" program */ +#undef _PATH_PASSWD_PROG + +/* Specify location of ssh.pid */ +#undef _PATH_SSH_PIDDIR + +/* Define if we don't have struct __res_state in resolv.h */ +#undef __res_state + +/* Define to rpl_calloc if the replacement function should be used. */ +#undef calloc + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to rpl_malloc if the replacement function should be used. */ +#undef malloc + +/* Define to rpl_realloc if the replacement function should be used. */ +#undef realloc + +/* type to use in place of socklen_t if not defined */ +#undef socklen_t diff --git a/configure b/configure new file mode 100755 index 000000000000..9d19f474c9f0 --- /dev/null +++ b/configure @@ -0,0 +1,28446 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.71 for OpenSSH Portable. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +# Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else $as_nop + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="as_nop=: +if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else \$as_nop + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ) +then : + +else \$as_nop + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +blah=\$(echo \$(echo blah)) +test x\"\$blah\" = xblah || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null +then : + as_have_required=yes +else $as_nop + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null +then : + +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$as_shell as_have_required=yes + if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null +then : + break 2 +fi +fi + done;; + esac + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi +fi + + + if test "x$CONFIG_SHELL" != x +then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno +then : + printf "%s\n" "$0: This script requires a shell more modern than all" + printf "%s\n" "$0: the shells that I found on your system." + if test ${ZSH_VERSION+y} ; then + printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" + printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." + else + printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and +$0: openssh-unix-dev@mindrot.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else $as_nop + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else $as_nop + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='OpenSSH' +PACKAGE_TARNAME='openssh' +PACKAGE_VERSION='Portable' +PACKAGE_STRING='OpenSSH Portable' +PACKAGE_BUGREPORT='openssh-unix-dev@mindrot.org' +PACKAGE_URL='' + +ac_unique_file="ssh.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_STDIO_H +# include +#endif +#ifdef HAVE_STDLIB_H +# include +#endif +#ifdef HAVE_STRING_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_header_c_list= +ac_subst_vars='LTLIBOBJS +COMPATINCLUDES +CFLAGS_NOPIE +LDFLAGS_NOPIE +TMUX +DROPBEARCONVERT +DROPBEARKEY +DBCLIENT +DROPBEAR +CONCH +PUTTYGEN +PLINK +DEPEND +UNSUPPORTED_ALGORITHMS +TEST_MALLOC_OPTIONS +TEST_SSH_UTF8 +TEST_SSH_IPV6 +piddir +user_path +mansubdir +MANTYPE +XAUTH_PATH +STRIP_OPT +xauth_path +PRIVSEP_PATH +CHANNELLIBS +K5LIBS +GSSLIBS +KRB5CONF +SSHDLIBS +SSH_PRIVSEP_USER +SK_STANDALONE +LIBFIDO2 +SK_DUMMY_LIBRARY +OPENSSL_BIN +openssl_bin +PICFLAG +LIBWTMPDB +LIBEDIT +LDNSCONFIG +LIBOBJS +TESTLIBS +LD +PATH_PASSWD_PROG +STARTUP_SCRIPT_SHELL +MAKE_PACKAGE_SUPPORTED +PATH_USERADD_PROG +PATH_GROUPADD_PROG +MANFMT +TEST_SHELL +PKGCONFIG +MANDOC +NROFF +GROFF +SH +TEST_MINUS_S_SH +SED +KILL +CAT +ac_ct_AR +AR +MKDIR_P +EGREP +GREP +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +RANLIB +CPP +AWK +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_largefile +with_openssl +with_stackprotect +with_hardening +with_retpoline +with_rpath +with_cflags +with_cflags_after +with_cppflags +with_ldflags +with_ldflags_after +with_libs +with_Werror +with_linux_memlock_onfault +with_solaris_contracts +with_solaris_projects +with_solaris_privs +with_osfsia +with_zlib +with_zlib_version_check +with_ldns +with_libedit +with_wtmpdb +with_audit +with_pie +enable_pkcs11 +enable_security_key +with_security_key_builtin +with_security_key_standalone +with_ssl_dir +with_openssl_header_check +with_ssl_engine +with_prngd_port +with_prngd_socket +with_pam +with_pam_service +with_privsep_user +with_sandbox +with_selinux +with_kerberos5 +with_privsep_path +with_xauth +enable_strip +with_maildir +with_mantype +with_shadow +with_ipaddr_display +enable_etc_default_login +with_default_path +with_superuser_path +with_4in6 +with_bsd_auth +with_pid_dir +enable_fd_passing +enable_lastlog +enable_utmp +enable_utmpx +enable_wtmp +enable_wtmpx +enable_libutil +enable_pututline +enable_pututxline +with_lastlog +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures OpenSSH Portable to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/openssh] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of OpenSSH Portable:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-largefile omit support for large files + --disable-pkcs11 disable PKCS#11 support code [no] + --disable-security-key disable U2F/FIDO support code no + --disable-strip Disable calling strip(1) on install + --disable-etc-default-login Disable using PATH from /etc/default/login no + --disable-fd-passing disable file descriptor passsing no + --disable-lastlog disable use of lastlog even if detected no + --disable-utmp disable use of utmp even if detected no + --disable-utmpx disable use of utmpx even if detected no + --disable-wtmp disable use of wtmp even if detected no + --disable-wtmpx disable use of wtmpx even if detected no + --disable-libutil disable use of libutil (login() etc.) no + --disable-pututline disable use of pututline() etc. (uwtmp) no + --disable-pututxline disable use of pututxline() etc. (uwtmpx) no + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --without-openssl Disable use of OpenSSL; use only limited internal crypto **EXPERIMENTAL** + --without-stackprotect Don't use compiler's stack protection + --without-hardening Don't use toolchain hardening flags + --without-retpoline Enable retpoline spectre mitigation + --without-rpath Disable auto-added -R linker paths + --with-cflags Specify additional flags to pass to compiler + --with-cflags-after Specify additional flags to pass to compiler after configure + --with-cppflags Specify additional flags to pass to preprocessor + --with-ldflags Specify additional flags to pass to linker + --with-ldflags-after Specify additional flags to pass to linker after configure + --with-libs Specify additional libraries to link with + --with-Werror Build main code with -Werror + --with-linux-memlock-onfault Enables memory locking on Linux + --with-solaris-contracts Enable Solaris process contracts (experimental) + --with-solaris-projects Enable Solaris projects (experimental) + --with-solaris-privs Enable Solaris/Illumos privileges (experimental) + --with-osfsia Enable Digital Unix SIA + --with-zlib=PATH Use zlib in PATH + --without-zlib-version-check Disable zlib version check + --with-ldns[=PATH] Use ldns for DNSSEC support (optionally in PATH) + --with-libedit[=PATH] Enable libedit support for sftp + --with-wtmpdb[=PATH] Enable wtmpdb support for sshd + --with-audit=module Enable audit support (modules=debug,bsm,linux) + --with-pie Build Position Independent Executables if possible + --with-security-key-builtin include builtin U2F/FIDO support + --with-security-key-standalone build standalone sk-libfido2 SecurityKeyProvider + --with-ssl-dir=PATH Specify path to OpenSSL installation + --without-openssl-header-check Disable OpenSSL version consistency check + --with-ssl-engine Enable OpenSSL (hardware) ENGINE support + --with-prngd-port=PORT read entropy from PRNGD/EGD TCP localhost:PORT + --with-prngd-socket=FILE read entropy from PRNGD/EGD socket FILE (default=/var/run/egd-pool) + --with-pam Enable PAM support + --with-pam-service=name Specify PAM service name + --with-privsep-user=user Specify non-privileged user for privilege separation + --with-sandbox=style Specify privilege separation sandbox (no, capsicum, darwin, rlimit, seccomp_filter) + --with-selinux Enable SELinux support + --with-kerberos5=PATH Enable Kerberos 5 support + --with-privsep-path=xxx Path for privilege separation chroot (default=/var/empty) + --with-xauth=PATH Specify path to xauth program + --with-maildir=/path/to/mail Specify your system mail directory + --with-mantype=man|cat|doc Set man page type + --without-shadow Disable shadow password support + --with-ipaddr-display Use ip address instead of hostname in $DISPLAY + --with-default-path= Specify default $PATH environment for server + --with-superuser-path= Specify different path for super-user + --with-4in6 Check for and convert IPv4 in IPv6 mapped addresses + --with-bsd-auth Enable BSD auth support + --with-pid-dir=PATH Specify location of sshd.pid file + --with-lastlog=FILE|DIR specify lastlog location common locations + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +OpenSSH configure Portable +generated by GNU Autoconf 2.71 + +Copyright (C) 2021 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that +# executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: program exited with status $ac_status" >&5 + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR +# ------------------------------------------------------------------ +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR. +ac_fn_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +printf %s "checking whether $as_decl_name is declared... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + eval ac_save_FLAGS=\$$6 + as_fn_append $6 " $5" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + eval $6=\$ac_save_FLAGS + +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_check_decl + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. */ + +#include +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main (void) +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES +# ---------------------------------------------------- +# Tries to find if the field MEMBER exists in type AGGR, after including +# INCLUDES, setting cache variable VAR accordingly. +ac_fn_c_check_member () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +printf %s "checking for $2.$3... " >&6; } +if eval test \${$4+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main (void) +{ +static $2 ac_aggr; +if (ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$4=yes" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main (void) +{ +static $2 ac_aggr; +if (sizeof ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$4=yes" +else $as_nop + eval "$4=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$4 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_member + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_hi=$ac_mid; break +else $as_nop + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_lo=$ac_mid; break +else $as_nop + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done +else $as_nop + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_hi=$ac_mid +else $as_nop + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval (void) { return $2; } +static unsigned long int ulongval (void) { return $2; } +#include +#include +int +main (void) +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + echo >>conftest.val; read $3 config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by OpenSSH $as_me Portable, which was +generated by GNU Autoconf 2.71. Invocation command line was + + $ $0$ac_configure_args_raw + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + printf "%s\n" "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Sanitize IFS. + IFS=" "" $as_nl" + # Save into config.log some information that might help in debugging. + { + echo + + printf "%s\n" "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + printf "%s\n" "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + printf "%s\n" "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + printf "%s\n" "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + printf "%s\n" "$as_me: caught signal $ac_signal" + printf "%s\n" "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +printf "%s\n" "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +if test -n "$CONFIG_SITE"; then + ac_site_files="$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + ac_site_files="$prefix/share/config.site $prefix/etc/config.site" +else + ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" +fi + +for ac_site_file in $ac_site_files +do + case $ac_site_file in #( + */*) : + ;; #( + *) : + ac_site_file=./$ac_site_file ;; +esac + if test -f "$ac_site_file" && test -r "$ac_site_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Test code for whether the C compiler supports C89 (global declarations) +ac_c_conftest_c89_globals=' +/* Does the compiler advertise C89 conformance? + Do not test the value of __STDC__, because some compilers set it to 0 + while being otherwise adequately conformant. */ +#if !defined __STDC__ +# error "Compiler does not advertise C89 conformance" +#endif + +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ +struct buf { int x; }; +struct buf * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not \xHH hex character constants. + These do not provoke an error unfortunately, instead are silently treated + as an "x". The following induces an error, until -std is added to get + proper ANSI mode. Curiously \x00 != x always comes out true, for an + array size at least. It is necessary to write \x00 == 0 to get something + that is true only with -std. */ +int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) '\''x'\'' +int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), + int, int);' + +# Test code for whether the C compiler supports C89 (body of main). +ac_c_conftest_c89_main=' +ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); +' + +# Test code for whether the C compiler supports C99 (global declarations) +ac_c_conftest_c99_globals=' +// Does the compiler advertise C99 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# error "Compiler does not advertise C99 conformance" +#endif + +#include +extern int puts (const char *); +extern int printf (const char *, ...); +extern int dprintf (int, const char *, ...); +extern void *malloc (size_t); + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +// dprintf is used instead of fprintf to avoid needing to declare +// FILE and stderr. +#define debug(...) dprintf (2, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + #error "your preprocessor is broken" +#endif +#if BIG_OK +#else + #error "your preprocessor is broken" +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static bool +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str = ""; + int number = 0; + float fnumber = 0; + + while (*format) + { + switch (*format++) + { + case '\''s'\'': // string + str = va_arg (args_copy, const char *); + break; + case '\''d'\'': // int + number = va_arg (args_copy, int); + break; + case '\''f'\'': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); + + return *str && number && fnumber; +} +' + +# Test code for whether the C compiler supports C99 (body of main). +ac_c_conftest_c99_main=' + // Check bool. + _Bool success = false; + success |= (argc != 0); + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[0] = argv[0][0]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' + || dynamic_array[ni.number - 1] != 543); +' + +# Test code for whether the C compiler supports C11 (global declarations) +ac_c_conftest_c11_globals=' +// Does the compiler advertise C11 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L +# error "Compiler does not advertise C11 conformance" +#endif + +// Check _Alignas. +char _Alignas (double) aligned_as_double; +char _Alignas (0) no_special_alignment; +extern char aligned_as_int; +char _Alignas (0) _Alignas (int) aligned_as_int; + +// Check _Alignof. +enum +{ + int_alignment = _Alignof (int), + int_array_alignment = _Alignof (int[100]), + char_alignment = _Alignof (char) +}; +_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); + +// Check _Noreturn. +int _Noreturn does_not_return (void) { for (;;) continue; } + +// Check _Static_assert. +struct test_static_assert +{ + int x; + _Static_assert (sizeof (int) <= sizeof (long int), + "_Static_assert does not work in struct"); + long int y; +}; + +// Check UTF-8 literals. +#define u8 syntax error! +char const utf8_literal[] = u8"happens to be ASCII" "another string"; + +// Check duplicate typedefs. +typedef long *long_ptr; +typedef long int *long_ptr; +typedef long_ptr long_ptr; + +// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. +struct anonymous +{ + union { + struct { int i; int j; }; + struct { int k; long int l; } w; + }; + int m; +} v1; +' + +# Test code for whether the C compiler supports C11 (body of main). +ac_c_conftest_c11_main=' + _Static_assert ((offsetof (struct anonymous, i) + == offsetof (struct anonymous, w.k)), + "Anonymous union alignment botch"); + v1.i = 2; + v1.w.k = 5; + ok |= v1.i != 5; +' + +# Test code for whether the C compiler supports C11 (complete). +ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +${ac_c_conftest_c11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + ${ac_c_conftest_c11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C99 (complete). +ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + return ok; +} +" + +# Test code for whether the C compiler supports C89 (complete). +ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + return ok; +} +" + +as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" +as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" +as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" +as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" +as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" +as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" +as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" +as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" +as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" + +# Auxiliary files required by this configure script. +ac_aux_files="install-sh config.guess config.sub" + +# Locations in which to look for auxiliary files. +ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." + +# Search for a directory containing all of the required auxiliary files, +# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. +# If we don't find one directory that contains all the files we need, +# we report the set of missing files from the *first* directory in +# $ac_aux_dir_candidates and give up. +ac_missing_aux_files="" +ac_first_candidate=: +printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in $ac_aux_dir_candidates +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + + printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 + ac_aux_dir_found=yes + ac_install_sh= + for ac_aux in $ac_aux_files + do + # As a special case, if "install-sh" is required, that requirement + # can be satisfied by any of "install-sh", "install.sh", or "shtool", + # and $ac_install_sh is set appropriately for whichever one is found. + if test x"$ac_aux" = x"install-sh" + then + if test -f "${as_dir}install-sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 + ac_install_sh="${as_dir}install-sh -c" + elif test -f "${as_dir}install.sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 + ac_install_sh="${as_dir}install.sh -c" + elif test -f "${as_dir}shtool"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 + ac_install_sh="${as_dir}shtool install -c" + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} install-sh" + else + break + fi + fi + else + if test -f "${as_dir}${ac_aux}"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" + else + break + fi + fi + fi + done + if test "$ac_aux_dir_found" = yes; then + ac_aux_dir="$as_dir" + break + fi + ac_first_candidate=false + + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 +fi + + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +if test -f "${ac_aux_dir}config.guess"; then + ac_config_guess="$SHELL ${ac_aux_dir}config.guess" +fi +if test -f "${ac_aux_dir}config.sub"; then + ac_config_sub="$SHELL ${ac_aux_dir}config.sub" +fi +if test -f "$ac_aux_dir/configure"; then + ac_configure="$SHELL ${ac_aux_dir}configure" +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' + and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + +# Check for stale configure as early as possible. +for i in $srcdir/configure.ac $srcdir/m4/*.m4; do + if test "$i" -nt "$srcdir/configure"; then + as_fn_error $? "$i newer than configure, run autoreconf" "$LINENO" 5 + fi +done + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_config_headers="$ac_config_headers config.h" + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in cc gcc clang + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cc gcc clang +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + + +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion -version; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +printf %s "checking whether the C compiler works... " >&6; } +ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else $as_nop + ac_file='' +fi +if test -z "$ac_file" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +printf %s "checking for C compiler default output file name... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +printf "%s\n" "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +printf %s "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +printf "%s\n" "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +printf %s "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +printf "%s\n" "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +printf %s "checking for suffix of object files... " >&6; } +if test ${ac_cv_objext+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +printf "%s\n" "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+y} +ac_save_CFLAGS=$CFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +else $as_nop + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# XXX relax this after reimplementing logit() etc. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports C99-style variadic macros" >&5 +printf %s "checking if $CC supports C99-style variadic macros... " >&6; } + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int f(int a, int b, int c) { return a + b + c; } +#define F(a, ...) f(a, __VA_ARGS__) + +int +main (void) +{ +return F(1, 2, -3); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + as_fn_error $? "*** OpenSSH requires support for C99-style variadic macros" "$LINENO" 5 + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + + + + + # Make sure we can run config.sub. +$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +ac_header= ac_cache= +for ac_item in $ac_header_c_list +do + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item + fi +done + + + + + + + + +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : + +printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h + +fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +printf %s "checking whether byte ordering is bigendian... " >&6; } +if test ${ac_cv_c_bigendian+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main (void) +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main (void) +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_bigendian=yes +else $as_nop + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main (void) +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main (void) +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_bigendian=yes +else $as_nop + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes +then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +unsigned short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + unsigned short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + unsigned short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + unsigned short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main (void) +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main (void) +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_c_bigendian=no +else $as_nop + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +printf "%s\n" "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) + +printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error $? "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + + +# Checks for programs. +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$AWK" && break +done + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +printf %s "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test ${ac_cv_prog_CPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CC needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +printf "%s\n" "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + + # Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +printf %s "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test ${ac_cv_path_install+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + # Account for fact that we put trailing slashes in our PATH walk. +case $as_dir in #(( + ./ | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test ${ac_cv_path_install+y}; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +printf "%s\n" "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +printf %s "checking for grep that handles long lines and -e... " >&6; } +if test ${ac_cv_path_GREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +printf "%s\n" "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 +printf %s "checking for a race-free mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test ${ac_cv_path_mkdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue + case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir ('*'coreutils) '* | \ + 'BusyBox '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test ${ac_cv_path_mkdir+y}; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +printf "%s\n" "$MKDIR_P" >&6; } + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +# Extract the first word of "cat", so it can be a program name with args. +set dummy cat; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_CAT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $CAT in + [\\/]* | ?:[\\/]*) + ac_cv_path_CAT="$CAT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_CAT="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +CAT=$ac_cv_path_CAT +if test -n "$CAT"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CAT" >&5 +printf "%s\n" "$CAT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "kill", so it can be a program name with args. +set dummy kill; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_KILL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $KILL in + [\\/]* | ?:[\\/]*) + ac_cv_path_KILL="$KILL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_KILL="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +KILL=$ac_cv_path_KILL +if test -n "$KILL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $KILL" >&5 +printf "%s\n" "$KILL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "sed", so it can be a program name with args. +set dummy sed; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_SED+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $SED in + [\\/]* | ?:[\\/]*) + ac_cv_path_SED="$SED" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_SED="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +SED=$ac_cv_path_SED +if test -n "$SED"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SED" >&5 +printf "%s\n" "$SED" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "bash", so it can be a program name with args. +set dummy bash; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_TEST_MINUS_S_SH+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $TEST_MINUS_S_SH in + [\\/]* | ?:[\\/]*) + ac_cv_path_TEST_MINUS_S_SH="$TEST_MINUS_S_SH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_TEST_MINUS_S_SH="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +TEST_MINUS_S_SH=$ac_cv_path_TEST_MINUS_S_SH +if test -n "$TEST_MINUS_S_SH"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TEST_MINUS_S_SH" >&5 +printf "%s\n" "$TEST_MINUS_S_SH" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "ksh", so it can be a program name with args. +set dummy ksh; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_TEST_MINUS_S_SH+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $TEST_MINUS_S_SH in + [\\/]* | ?:[\\/]*) + ac_cv_path_TEST_MINUS_S_SH="$TEST_MINUS_S_SH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_TEST_MINUS_S_SH="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +TEST_MINUS_S_SH=$ac_cv_path_TEST_MINUS_S_SH +if test -n "$TEST_MINUS_S_SH"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TEST_MINUS_S_SH" >&5 +printf "%s\n" "$TEST_MINUS_S_SH" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "sh", so it can be a program name with args. +set dummy sh; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_TEST_MINUS_S_SH+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $TEST_MINUS_S_SH in + [\\/]* | ?:[\\/]*) + ac_cv_path_TEST_MINUS_S_SH="$TEST_MINUS_S_SH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_TEST_MINUS_S_SH="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +TEST_MINUS_S_SH=$ac_cv_path_TEST_MINUS_S_SH +if test -n "$TEST_MINUS_S_SH"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TEST_MINUS_S_SH" >&5 +printf "%s\n" "$TEST_MINUS_S_SH" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "bash", so it can be a program name with args. +set dummy bash; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_SH+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $SH in + [\\/]* | ?:[\\/]*) + ac_cv_path_SH="$SH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_SH="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +SH=$ac_cv_path_SH +if test -n "$SH"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SH" >&5 +printf "%s\n" "$SH" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "ksh", so it can be a program name with args. +set dummy ksh; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_SH+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $SH in + [\\/]* | ?:[\\/]*) + ac_cv_path_SH="$SH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_SH="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +SH=$ac_cv_path_SH +if test -n "$SH"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SH" >&5 +printf "%s\n" "$SH" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "sh", so it can be a program name with args. +set dummy sh; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_SH+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $SH in + [\\/]* | ?:[\\/]*) + ac_cv_path_SH="$SH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_SH="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +SH=$ac_cv_path_SH +if test -n "$SH"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $SH" >&5 +printf "%s\n" "$SH" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "groff", so it can be a program name with args. +set dummy groff; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_GROFF+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $GROFF in + [\\/]* | ?:[\\/]*) + ac_cv_path_GROFF="$GROFF" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_GROFF="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GROFF=$ac_cv_path_GROFF +if test -n "$GROFF"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GROFF" >&5 +printf "%s\n" "$GROFF" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +for ac_prog in nroff awf +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_NROFF+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $NROFF in + [\\/]* | ?:[\\/]*) + ac_cv_path_NROFF="$NROFF" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_NROFF="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +NROFF=$ac_cv_path_NROFF +if test -n "$NROFF"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NROFF" >&5 +printf "%s\n" "$NROFF" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$NROFF" && break +done + +# Extract the first word of "mandoc", so it can be a program name with args. +set dummy mandoc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_MANDOC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $MANDOC in + [\\/]* | ?:[\\/]*) + ac_cv_path_MANDOC="$MANDOC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_MANDOC="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +MANDOC=$ac_cv_path_MANDOC +if test -n "$MANDOC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANDOC" >&5 +printf "%s\n" "$MANDOC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_PKGCONFIG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $PKGCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_PKGCONFIG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKGCONFIG=$ac_cv_path_PKGCONFIG +if test -n "$PKGCONFIG"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5 +printf "%s\n" "$PKGCONFIG" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKGCONFIG"; then + ac_pt_PKGCONFIG=$PKGCONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_ac_pt_PKGCONFIG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $ac_pt_PKGCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKGCONFIG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG +if test -n "$ac_pt_PKGCONFIG"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5 +printf "%s\n" "$ac_pt_PKGCONFIG" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_pt_PKGCONFIG" = x; then + PKGCONFIG="no" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKGCONFIG=$ac_pt_PKGCONFIG + fi +else + PKGCONFIG="$ac_cv_path_PKGCONFIG" +fi + +TEST_SHELL=sh + + +if test "x$MANDOC" != "x" ; then + MANFMT="$MANDOC" +elif test "x$NROFF" != "x" ; then + MANFMT="$NROFF -mandoc" +elif test "x$GROFF" != "x" ; then + MANFMT="$GROFF -mandoc -Tascii" +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: no manpage formatter found" >&5 +printf "%s\n" "$as_me: WARNING: no manpage formatter found" >&2;} + MANFMT="false" +fi + + +# Extract the first word of "groupadd", so it can be a program name with args. +set dummy groupadd; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_PATH_GROUPADD_PROG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $PATH_GROUPADD_PROG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PATH_GROUPADD_PROG="$PATH_GROUPADD_PROG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /usr/sbin${PATH_SEPARATOR}/etc +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_PATH_GROUPADD_PROG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_PATH_GROUPADD_PROG" && ac_cv_path_PATH_GROUPADD_PROG="groupadd" + ;; +esac +fi +PATH_GROUPADD_PROG=$ac_cv_path_PATH_GROUPADD_PROG +if test -n "$PATH_GROUPADD_PROG"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PATH_GROUPADD_PROG" >&5 +printf "%s\n" "$PATH_GROUPADD_PROG" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "useradd", so it can be a program name with args. +set dummy useradd; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_PATH_USERADD_PROG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $PATH_USERADD_PROG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PATH_USERADD_PROG="$PATH_USERADD_PROG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /usr/sbin${PATH_SEPARATOR}/etc +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_PATH_USERADD_PROG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_PATH_USERADD_PROG" && ac_cv_path_PATH_USERADD_PROG="useradd" + ;; +esac +fi +PATH_USERADD_PROG=$ac_cv_path_PATH_USERADD_PROG +if test -n "$PATH_USERADD_PROG"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PATH_USERADD_PROG" >&5 +printf "%s\n" "$PATH_USERADD_PROG" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "pkgmk", so it can be a program name with args. +set dummy pkgmk; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_MAKE_PACKAGE_SUPPORTED+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$MAKE_PACKAGE_SUPPORTED"; then + ac_cv_prog_MAKE_PACKAGE_SUPPORTED="$MAKE_PACKAGE_SUPPORTED" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_MAKE_PACKAGE_SUPPORTED="yes" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_MAKE_PACKAGE_SUPPORTED" && ac_cv_prog_MAKE_PACKAGE_SUPPORTED="no" +fi +fi +MAKE_PACKAGE_SUPPORTED=$ac_cv_prog_MAKE_PACKAGE_SUPPORTED +if test -n "$MAKE_PACKAGE_SUPPORTED"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAKE_PACKAGE_SUPPORTED" >&5 +printf "%s\n" "$MAKE_PACKAGE_SUPPORTED" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +if test -x /sbin/sh; then + STARTUP_SCRIPT_SHELL=/sbin/sh + +else + STARTUP_SCRIPT_SHELL=/bin/sh + +fi + +# System features +# Check whether --enable-largefile was given. +if test ${enable_largefile+y} +then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +printf %s "checking for special C compiler options needed for large files... " >&6; } +if test ${ac_cv_sys_largefile_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO" +then : + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if test ${ac_cv_sys_file_offset_bits+y} +then : + printf %s "(cached) " >&6 +else $as_nop + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +printf %s "checking for _LARGE_FILES value needed for large files... " >&6; } +if test ${ac_cv_sys_large_files+y} +then : + printf %s "(cached) " >&6 +else $as_nop + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +printf "%s\n" "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h +;; +esac +rm -rf conftest* + fi +fi + + +if test -z "$AR" ; then + as_fn_error $? "*** 'ar' missing, please install or fix your \$PATH ***" "$LINENO" 5 +fi + +# Extract the first word of "passwd", so it can be a program name with args. +set dummy passwd; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_PATH_PASSWD_PROG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $PATH_PASSWD_PROG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PATH_PASSWD_PROG="$PATH_PASSWD_PROG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_PATH_PASSWD_PROG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PATH_PASSWD_PROG=$ac_cv_path_PATH_PASSWD_PROG +if test -n "$PATH_PASSWD_PROG"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PATH_PASSWD_PROG" >&5 +printf "%s\n" "$PATH_PASSWD_PROG" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +if test ! -z "$PATH_PASSWD_PROG" ; then + +printf "%s\n" "#define _PATH_PASSWD_PROG \"$PATH_PASSWD_PROG\"" >>confdefs.h + +fi + +LD="$CC" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +printf %s "checking for inline... " >&6; } +if test ${ac_cv_c_inline+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo (void) {return 0; } +$ac_kw foo_t foo (void) {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +printf "%s\n" "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5 +printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } +if test ${ac_cv_c_undeclared_builtin_options+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_CFLAGS=$CFLAGS + ac_cv_c_undeclared_builtin_options='cannot detect' + for ac_arg in '' -fno-builtin; do + CFLAGS="$ac_save_CFLAGS $ac_arg" + # This test program should *not* compile successfully. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +(void) strchr; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + # This test program should compile successfully. + # No library function is consistently available on + # freestanding implementations, so test against a dummy + # declaration. Include always-available headers on the + # off chance that they somehow elicit warnings. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +extern void ac_decl (int, char *); + +int +main (void) +{ +(void) ac_decl (0, (char *) 0); + (void) ac_decl; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + if test x"$ac_arg" = x +then : + ac_cv_c_undeclared_builtin_options='none needed' +else $as_nop + ac_cv_c_undeclared_builtin_options=$ac_arg +fi + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + CFLAGS=$ac_save_CFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 +printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } + case $ac_cv_c_undeclared_builtin_options in #( + 'cannot detect') : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot make $CC report undeclared builtins +See \`config.log' for more details" "$LINENO" 5; } ;; #( + 'none needed') : + ac_c_undeclared_builtin_options='' ;; #( + *) : + ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; +esac + +ac_fn_check_decl "$LINENO" "LLONG_MAX" "ac_cv_have_decl_LLONG_MAX" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_LLONG_MAX" = xyes +then : + have_llong_max=1 +fi +ac_fn_check_decl "$LINENO" "LONG_LONG_MAX" "ac_cv_have_decl_LONG_LONG_MAX" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_LONG_LONG_MAX" = xyes +then : + have_long_long_max=1 +fi +ac_fn_check_decl "$LINENO" "RLIMIT_NPROC" "ac_cv_have_decl_RLIMIT_NPROC" " + #include + #include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_RLIMIT_NPROC" = xyes +then : + +printf "%s\n" "#define HAVE_RLIMIT_NPROC /**/" >>confdefs.h + +fi +ac_fn_check_decl "$LINENO" "PR_SET_NO_NEW_PRIVS" "ac_cv_have_decl_PR_SET_NO_NEW_PRIVS" " + #include + #include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_PR_SET_NO_NEW_PRIVS" = xyes +then : + have_linux_no_new_privs=1 +fi + +openssl=yes +openssl_bin=openssl + +# Check whether --with-openssl was given. +if test ${with_openssl+y} +then : + withval=$with_openssl; if test "x$withval" = "xno" ; then + openssl=no + openssl_bin="" + fi + + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether OpenSSL will be used for cryptography" >&5 +printf %s "checking whether OpenSSL will be used for cryptography... " >&6; } +if test "x$openssl" = "xyes" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define WITH_OPENSSL 1" >>confdefs.h + +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + +use_stack_protector=1 +use_toolchain_hardening=1 +use_retpoline=1 + +# Check whether --with-stackprotect was given. +if test ${with_stackprotect+y} +then : + withval=$with_stackprotect; + if test "x$withval" = "xno"; then + use_stack_protector=0 + fi +fi + + +# Check whether --with-hardening was given. +if test ${with_hardening+y} +then : + withval=$with_hardening; + if test "x$withval" = "xno"; then + use_toolchain_hardening=0 + fi +fi + + +# Check whether --with-retpoline was given. +if test ${with_retpoline+y} +then : + withval=$with_retpoline; + if test "x$withval" = "xno"; then + use_retpoline=0 + fi +fi + + +# We use -Werror for the tests only so that we catch warnings like "this is +# on by default" for things like -fPIE. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports -Werror" >&5 +printf %s "checking if $CC supports -Werror... " >&6; } +saved_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Werror" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void) { return 0; } +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + WERROR="-Werror" +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + WERROR="" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +CFLAGS="$saved_CFLAGS" + +if test "$GCC" = "yes" || test "$GCC" = "egcs"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking gcc version" >&5 +printf %s "checking gcc version... " >&6; } + GCC_VER=`$CC -v 2>&1 | $AWK '/gcc version /{print $3}'` + case "$GCC_VER" in + 1.*) no_attrib_nonnull=1 ;; + 2.8* | 2.9*) + no_attrib_nonnull=1 + ;; + 2.*) no_attrib_nonnull=1 ;; + *) ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GCC_VER" >&5 +printf "%s\n" "$GCC_VER" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking clang version" >&5 +printf %s "checking clang version... " >&6; } + ver="`$CC -v 2>&1`" + if echo "$ver" | grep "Apple" >/dev/null; then + CLANG_VER=apple-`echo "$ver" | grep 'clang version' | \ + $SED 's/.*clang version //g' | $AWK '{print $1}'` + else + CLANG_VER=`echo "$ver" | grep 'clang version' | \ + $SED 's/.*clang version //g' | $AWK '{print $1}'` + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CLANG_VER" >&5 +printf "%s\n" "$CLANG_VER" >&6; } + + { + ossh_cache_var=ossh_cv_cflag__pipe + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -pipe" >&5 +printf %s "checking if $CC supports compile flag -pipe... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -pipe" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-pipe" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__Wunknown_warning_option + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Wunknown-warning-option" >&5 +printf %s "checking if $CC supports compile flag -Wunknown-warning-option... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Wunknown-warning-option" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wunknown-warning-option" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__Wno_error_format_truncation + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Wno-error=format-truncation" >&5 +printf %s "checking if $CC supports compile flag -Wno-error=format-truncation... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Wno-error=format-truncation" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wno-error=format-truncation" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__Qunused_arguments + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Qunused-arguments" >&5 +printf %s "checking if $CC supports compile flag -Qunused-arguments... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Qunused-arguments" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Qunused-arguments" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__Wall + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Wall" >&5 +printf %s "checking if $CC supports compile flag -Wall... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Wall" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wall" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__Wextra + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Wextra" >&5 +printf %s "checking if $CC supports compile flag -Wextra... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Wextra" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wextra" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__Wpointer_arith + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Wpointer-arith" >&5 +printf %s "checking if $CC supports compile flag -Wpointer-arith... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Wpointer-arith" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wpointer-arith" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__Wuninitialized + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Wuninitialized" >&5 +printf %s "checking if $CC supports compile flag -Wuninitialized... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Wuninitialized" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wuninitialized" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__Wsign_compare + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Wsign-compare" >&5 +printf %s "checking if $CC supports compile flag -Wsign-compare... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Wsign-compare" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wsign-compare" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__Wformat_security + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Wformat-security" >&5 +printf %s "checking if $CC supports compile flag -Wformat-security... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Wformat-security" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wformat-security" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__Wsizeof_pointer_memaccess + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Wsizeof-pointer-memaccess" >&5 +printf %s "checking if $CC supports compile flag -Wsizeof-pointer-memaccess... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Wsizeof-pointer-memaccess" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wsizeof-pointer-memaccess" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__Wpointer_sign + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Wpointer-sign" >&5 +printf %s "checking if $CC supports compile flag -Wpointer-sign... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Wpointer-sign" + _define_flag="-Wno-pointer-sign" + test "x$_define_flag" = "x" && _define_flag="-Wpointer-sign" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__Wunused_parameter + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Wunused-parameter" >&5 +printf %s "checking if $CC supports compile flag -Wunused-parameter... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Wunused-parameter" + _define_flag="-Wno-unused-parameter" + test "x$_define_flag" = "x" && _define_flag="-Wunused-parameter" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__Wunused_result + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Wunused-result" >&5 +printf %s "checking if $CC supports compile flag -Wunused-result... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Wunused-result" + _define_flag="-Wno-unused-result" + test "x$_define_flag" = "x" && _define_flag="-Wunused-result" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__Wimplicit_fallthrough + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Wimplicit-fallthrough" >&5 +printf %s "checking if $CC supports compile flag -Wimplicit-fallthrough... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Wimplicit-fallthrough" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wimplicit-fallthrough" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__Wmisleading_indentation + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Wmisleading-indentation" >&5 +printf %s "checking if $CC supports compile flag -Wmisleading-indentation... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Wmisleading-indentation" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wmisleading-indentation" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__Wbitwise_instead_of_logical + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Wbitwise-instead-of-logical" >&5 +printf %s "checking if $CC supports compile flag -Wbitwise-instead-of-logical... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Wbitwise-instead-of-logical" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wbitwise-instead-of-logical" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_cflag__fno_strict_aliasing + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -fno-strict-aliasing" >&5 +printf %s "checking if $CC supports compile flag -fno-strict-aliasing... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -fno-strict-aliasing" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-fno-strict-aliasing" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + if test "x$use_toolchain_hardening" = "x1"; then + { + ossh_cache_var=ossh_cv_cflag__D_FORTIFY_SOURCE_2 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -D_FORTIFY_SOURCE=2" >&5 +printf %s "checking if $CC supports compile flag -D_FORTIFY_SOURCE=2... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -D_FORTIFY_SOURCE=2" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-D_FORTIFY_SOURCE=2" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_ldflag__Wl__z_relro + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $LD supports link flag -Wl,-z,relro" >&5 +printf %s "checking if $LD supports link flag -Wl,-z,relro... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $WERROR -Wl,-z,relro" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wl,-z,relro" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + LDFLAGS="$saved_LDFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + LDFLAGS="$saved_LDFLAGS $_define_flag" + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + LDFLAGS="$saved_LDFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + LDFLAGS="$saved_LDFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + LDFLAGS="$saved_LDFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_ldflag__Wl__z_now + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $LD supports link flag -Wl,-z,now" >&5 +printf %s "checking if $LD supports link flag -Wl,-z,now... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $WERROR -Wl,-z,now" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wl,-z,now" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + LDFLAGS="$saved_LDFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + LDFLAGS="$saved_LDFLAGS $_define_flag" + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + LDFLAGS="$saved_LDFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + LDFLAGS="$saved_LDFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + LDFLAGS="$saved_LDFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_ldflag__Wl__z_noexecstack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $LD supports link flag -Wl,-z,noexecstack" >&5 +printf %s "checking if $LD supports link flag -Wl,-z,noexecstack... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $WERROR -Wl,-z,noexecstack" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wl,-z,noexecstack" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + LDFLAGS="$saved_LDFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + LDFLAGS="$saved_LDFLAGS $_define_flag" + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + LDFLAGS="$saved_LDFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + LDFLAGS="$saved_LDFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + LDFLAGS="$saved_LDFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + # NB. -ftrapv expects certain support functions to be present in + # the compiler library (libgcc or similar) to detect integer operations + # that can overflow. We must check that the result of enabling it + # actually links. The test program compiled/linked includes a number + # of integer operations that should exercise this. + { + ossh_cache_var=ossh_cv_cflag__ftrapv + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -ftrapv and linking succeeds" >&5 +printf %s "checking if $CC supports compile flag -ftrapv and linking succeeds... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -ftrapv" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-ftrapv" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + # clang 15 seems to have a bug in -fzero-call-used-regs=all. See + # https://bugzilla.mindrot.org/show_bug.cgi?id=3475 and + # https://github.com/llvm/llvm-project/issues/59242 + # clang 17 has a different bug that causes an ICE when using this + # flag at all (https://bugzilla.mindrot.org/show_bug.cgi?id=3629) + case "$CLANG_VER" in + apple-15*) { + ossh_cache_var=ossh_cv_cflag__fzero_call_used_regs_used + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -fzero-call-used-regs=used and linking succeeds" >&5 +printf %s "checking if $CC supports compile flag -fzero-call-used-regs=used and linking succeeds... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -fzero-call-used-regs=used" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-fzero-call-used-regs=used" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} ;; + 17*) ;; + *) { + ossh_cache_var=ossh_cv_cflag__fzero_call_used_regs_used + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -fzero-call-used-regs=used and linking succeeds" >&5 +printf %s "checking if $CC supports compile flag -fzero-call-used-regs=used and linking succeeds... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -fzero-call-used-regs=used" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-fzero-call-used-regs=used" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} ;; + esac + { + ossh_cache_var=ossh_cv_cflag__ftrivial_auto_var_init_zero + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -ftrivial-auto-var-init=zero" >&5 +printf %s "checking if $CC supports compile flag -ftrivial-auto-var-init=zero... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -ftrivial-auto-var-init=zero" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-ftrivial-auto-var-init=zero" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + fi + if test "x$use_retpoline" = "x1"; then + { + ossh_cache_var=ossh_cv_cflag__mretpoline + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -mretpoline" >&5 +printf %s "checking if $CC supports compile flag -mretpoline... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -mretpoline" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-mretpoline" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} # clang + { + ossh_cache_var=ossh_cv_ldflag__Wl__z_retpolineplt + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $LD supports link flag -Wl,-z,retpolineplt" >&5 +printf %s "checking if $LD supports link flag -Wl,-z,retpolineplt... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $WERROR -Wl,-z,retpolineplt" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wl,-z,retpolineplt" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + LDFLAGS="$saved_LDFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + LDFLAGS="$saved_LDFLAGS $_define_flag" + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + LDFLAGS="$saved_LDFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + LDFLAGS="$saved_LDFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + LDFLAGS="$saved_LDFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fno-builtin-memset" >&5 +printf %s "checking if $CC accepts -fno-builtin-memset... " >&6; } + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-builtin-memset" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + char b[10]; memset(b, 0, sizeof(b)); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + + # -fstack-protector-all doesn't always work for some GCC versions + # and/or platforms, so we test if we can. If it's not supported + # on a given platform gcc will emit a warning so we use -Werror. + if test "x$use_stack_protector" = "x1"; then + for t in -fstack-protector-strong -fstack-protector-all \ + -fstack-protector; do + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports $t" >&5 +printf %s "checking if $CC supports $t... " >&6; } + saved_CFLAGS="$CFLAGS" + saved_LDFLAGS="$LDFLAGS" + CFLAGS="$CFLAGS $t -Werror" + LDFLAGS="$LDFLAGS $t -Werror" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + int func (int t) {char b[100]; snprintf(b,sizeof b,"%d",t); return t;} + +int +main (void) +{ + + char x[256]; + snprintf(x, sizeof(x), "XXX%d", func(1)); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + CFLAGS="$saved_CFLAGS $t" + LDFLAGS="$saved_LDFLAGS $t" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $t works" >&5 +printf %s "checking if $t works... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: cannot test" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: cannot test" >&2;} + break + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + int func (int t) {char b[100]; snprintf(b,sizeof b,"%d",t); return t;} + +int +main (void) +{ + + char x[256]; + snprintf(x, sizeof(x), "XXX%d", func(1)); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + break +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$saved_CFLAGS" + LDFLAGS="$saved_LDFLAGS" + done + fi + + if test -z "$have_llong_max"; then + # retry LLONG_MAX with -std=gnu99, needed on some Linuxes + unset ac_cv_have_decl_LLONG_MAX + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -std=gnu99" + ac_fn_check_decl "$LINENO" "LLONG_MAX" "ac_cv_have_decl_LLONG_MAX" "#include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_LLONG_MAX" = xyes +then : + have_llong_max=1 +else $as_nop + CFLAGS="$saved_CFLAGS" +fi + fi +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if compiler allows __attribute__ on return types" >&5 +printf %s "checking if compiler allows __attribute__ on return types... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +__attribute__((__unused__)) static void foo(void){return;} +int +main (void) +{ + exit(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +printf "%s\n" "#define NO_ATTRIBUTE_ON_RETURN_TYPE 1" >>confdefs.h + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if compiler allows __attribute__ prototype args" >&5 +printf %s "checking if compiler allows __attribute__ prototype args... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +typedef void foo(const char *, ...) __attribute__((format(printf, 1, 2))); +int +main (void) +{ + exit(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +printf "%s\n" "#define NO_ATTRIBUTE_ON_PROTOTYPE_ARGS 1" >>confdefs.h + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if compiler supports variable length arrays" >&5 +printf %s "checking if compiler supports variable length arrays... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + int i; for (i=0; i<3; i++){int a[i]; a[i-1]=0;} exit(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define VARIABLE_LENGTH_ARRAYS 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if compiler accepts variable declarations after code" >&5 +printf %s "checking if compiler accepts variable declarations after code... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + int a; a = 1; int b = 1; exit(a-b); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define VARIABLE_DECLARATION_AFTER_CODE 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +saved_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Werror" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if compiler supports __nonstring__ attribute on char arrays" >&5 +printf %s "checking if compiler supports __nonstring__ attribute on char arrays... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + char __attribute__ ((__nonstring__)) h[5] = "hello"; return h[0]!='h'; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define HAVE_ATTRIBUTE__NONSTRING__ 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +CFLAGS="$saved_CFLAGS" + +if test "x$no_attrib_nonnull" != "x1" ; then + +printf "%s\n" "#define HAVE_ATTRIBUTE__NONNULL__ 1" >>confdefs.h + +fi + + +# Check whether --with-rpath was given. +if test ${with_rpath+y} +then : + withval=$with_rpath; + if test "x$withval" = "xno" ; then + rpath_opt="" + elif test "x$withval" = "xyes" ; then + rpath_opt="-R" + else + rpath_opt="$withval" + fi + + +fi + + +# Allow user to specify flags + +# Check whether --with-cflags was given. +if test ${with_cflags+y} +then : + withval=$with_cflags; + if test -n "$withval" && test "x$withval" != "xno" && \ + test "x${withval}" != "xyes"; then + CFLAGS="$CFLAGS $withval" + fi + + +fi + + + +# Check whether --with-cflags-after was given. +if test ${with_cflags_after+y} +then : + withval=$with_cflags_after; + if test -n "$withval" && test "x$withval" != "xno" && \ + test "x${withval}" != "xyes"; then + CFLAGS_AFTER="$withval" + fi + + +fi + + +# Check whether --with-cppflags was given. +if test ${with_cppflags+y} +then : + withval=$with_cppflags; + if test -n "$withval" && test "x$withval" != "xno" && \ + test "x${withval}" != "xyes"; then + CPPFLAGS="$CPPFLAGS $withval" + fi + + +fi + + +# Check whether --with-ldflags was given. +if test ${with_ldflags+y} +then : + withval=$with_ldflags; + if test -n "$withval" && test "x$withval" != "xno" && \ + test "x${withval}" != "xyes"; then + LDFLAGS="$LDFLAGS $withval" + fi + + +fi + + +# Check whether --with-ldflags-after was given. +if test ${with_ldflags_after+y} +then : + withval=$with_ldflags_after; + if test -n "$withval" && test "x$withval" != "xno" && \ + test "x${withval}" != "xyes"; then + LDFLAGS_AFTER="$withval" + fi + + +fi + + +# Check whether --with-libs was given. +if test ${with_libs+y} +then : + withval=$with_libs; + if test -n "$withval" && test "x$withval" != "xno" && \ + test "x${withval}" != "xyes"; then + LIBS="$LIBS $withval" + fi + + +fi + + +# Check whether --with-Werror was given. +if test ${with_Werror+y} +then : + withval=$with_Werror; + if test -n "$withval" && test "x$withval" != "xno"; then + werror_flags="-Werror" + if test "x${withval}" != "xyes"; then + werror_flags="$withval" + fi + fi + + +fi + + +if test "x$ac_cv_header_sys_stat_h" != "xyes"; then + unset ac_cv_header_sys_stat_h + ac_fn_c_check_header_compile "$LINENO" "sys/stat.h" "ac_cv_header_sys_stat_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_stat_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_STAT_H 1" >>confdefs.h + +fi + +fi + +ac_fn_c_check_header_compile "$LINENO" "blf.h" "ac_cv_header_blf_h" "$ac_includes_default" +if test "x$ac_cv_header_blf_h" = xyes +then : + printf "%s\n" "#define HAVE_BLF_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "bstring.h" "ac_cv_header_bstring_h" "$ac_includes_default" +if test "x$ac_cv_header_bstring_h" = xyes +then : + printf "%s\n" "#define HAVE_BSTRING_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "crypt.h" "ac_cv_header_crypt_h" "$ac_includes_default" +if test "x$ac_cv_header_crypt_h" = xyes +then : + printf "%s\n" "#define HAVE_CRYPT_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "crypto/sha2.h" "ac_cv_header_crypto_sha2_h" "$ac_includes_default" +if test "x$ac_cv_header_crypto_sha2_h" = xyes +then : + printf "%s\n" "#define HAVE_CRYPTO_SHA2_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "$ac_includes_default" +if test "x$ac_cv_header_dirent_h" = xyes +then : + printf "%s\n" "#define HAVE_DIRENT_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "elf.h" "ac_cv_header_elf_h" "$ac_includes_default" +if test "x$ac_cv_header_elf_h" = xyes +then : + printf "%s\n" "#define HAVE_ELF_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "err.h" "ac_cv_header_err_h" "$ac_includes_default" +if test "x$ac_cv_header_err_h" = xyes +then : + printf "%s\n" "#define HAVE_ERR_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "features.h" "ac_cv_header_features_h" "$ac_includes_default" +if test "x$ac_cv_header_features_h" = xyes +then : + printf "%s\n" "#define HAVE_FEATURES_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default" +if test "x$ac_cv_header_fcntl_h" = xyes +then : + printf "%s\n" "#define HAVE_FCNTL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "floatingpoint.h" "ac_cv_header_floatingpoint_h" "$ac_includes_default" +if test "x$ac_cv_header_floatingpoint_h" = xyes +then : + printf "%s\n" "#define HAVE_FLOATINGPOINT_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "fnmatch.h" "ac_cv_header_fnmatch_h" "$ac_includes_default" +if test "x$ac_cv_header_fnmatch_h" = xyes +then : + printf "%s\n" "#define HAVE_FNMATCH_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default" +if test "x$ac_cv_header_getopt_h" = xyes +then : + printf "%s\n" "#define HAVE_GETOPT_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "ia.h" "ac_cv_header_ia_h" "$ac_includes_default" +if test "x$ac_cv_header_ia_h" = xyes +then : + printf "%s\n" "#define HAVE_IA_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "iaf.h" "ac_cv_header_iaf_h" "$ac_includes_default" +if test "x$ac_cv_header_iaf_h" = xyes +then : + printf "%s\n" "#define HAVE_IAF_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "inttypes.h" "ac_cv_header_inttypes_h" "$ac_includes_default" +if test "x$ac_cv_header_inttypes_h" = xyes +then : + printf "%s\n" "#define HAVE_INTTYPES_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "langinfo.h" "ac_cv_header_langinfo_h" "$ac_includes_default" +if test "x$ac_cv_header_langinfo_h" = xyes +then : + printf "%s\n" "#define HAVE_LANGINFO_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" +if test "x$ac_cv_header_limits_h" = xyes +then : + printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" +if test "x$ac_cv_header_locale_h" = xyes +then : + printf "%s\n" "#define HAVE_LOCALE_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "login.h" "ac_cv_header_login_h" "$ac_includes_default" +if test "x$ac_cv_header_login_h" = xyes +then : + printf "%s\n" "#define HAVE_LOGIN_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "maillock.h" "ac_cv_header_maillock_h" "$ac_includes_default" +if test "x$ac_cv_header_maillock_h" = xyes +then : + printf "%s\n" "#define HAVE_MAILLOCK_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "ndir.h" "ac_cv_header_ndir_h" "$ac_includes_default" +if test "x$ac_cv_header_ndir_h" = xyes +then : + printf "%s\n" "#define HAVE_NDIR_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "net/if_tun.h" "ac_cv_header_net_if_tun_h" "$ac_includes_default" +if test "x$ac_cv_header_net_if_tun_h" = xyes +then : + printf "%s\n" "#define HAVE_NET_IF_TUN_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "netdb.h" "ac_cv_header_netdb_h" "$ac_includes_default" +if test "x$ac_cv_header_netdb_h" = xyes +then : + printf "%s\n" "#define HAVE_NETDB_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "pam/pam_appl.h" "ac_cv_header_pam_pam_appl_h" "$ac_includes_default" +if test "x$ac_cv_header_pam_pam_appl_h" = xyes +then : + printf "%s\n" "#define HAVE_PAM_PAM_APPL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "pty.h" "ac_cv_header_pty_h" "$ac_includes_default" +if test "x$ac_cv_header_pty_h" = xyes +then : + printf "%s\n" "#define HAVE_PTY_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "readpassphrase.h" "ac_cv_header_readpassphrase_h" "$ac_includes_default" +if test "x$ac_cv_header_readpassphrase_h" = xyes +then : + printf "%s\n" "#define HAVE_READPASSPHRASE_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "rpc/types.h" "ac_cv_header_rpc_types_h" "$ac_includes_default" +if test "x$ac_cv_header_rpc_types_h" = xyes +then : + printf "%s\n" "#define HAVE_RPC_TYPES_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "security/pam_appl.h" "ac_cv_header_security_pam_appl_h" "$ac_includes_default" +if test "x$ac_cv_header_security_pam_appl_h" = xyes +then : + printf "%s\n" "#define HAVE_SECURITY_PAM_APPL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sha2.h" "ac_cv_header_sha2_h" "$ac_includes_default" +if test "x$ac_cv_header_sha2_h" = xyes +then : + printf "%s\n" "#define HAVE_SHA2_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "shadow.h" "ac_cv_header_shadow_h" "$ac_includes_default" +if test "x$ac_cv_header_shadow_h" = xyes +then : + printf "%s\n" "#define HAVE_SHADOW_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "stddef.h" "ac_cv_header_stddef_h" "$ac_includes_default" +if test "x$ac_cv_header_stddef_h" = xyes +then : + printf "%s\n" "#define HAVE_STDDEF_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" +if test "x$ac_cv_header_string_h" = xyes +then : + printf "%s\n" "#define HAVE_STRING_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default" +if test "x$ac_cv_header_strings_h" = xyes +then : + printf "%s\n" "#define HAVE_STRINGS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/bitypes.h" "ac_cv_header_sys_bitypes_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_bitypes_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_BITYPES_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/byteorder.h" "ac_cv_header_sys_byteorder_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_byteorder_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_BYTEORDER_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/bsdtty.h" "ac_cv_header_sys_bsdtty_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_bsdtty_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_BSDTTY_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/cdefs.h" "ac_cv_header_sys_cdefs_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_cdefs_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_CDEFS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/dir.h" "ac_cv_header_sys_dir_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_dir_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_DIR_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/file.h" "ac_cv_header_sys_file_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_file_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_FILE_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_mman_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_MMAN_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/label.h" "ac_cv_header_sys_label_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_label_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_LABEL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/ndir.h" "ac_cv_header_sys_ndir_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ndir_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_NDIR_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_param_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PARAM_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/poll.h" "ac_cv_header_sys_poll_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_poll_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_POLL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/prctl.h" "ac_cv_header_sys_prctl_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_prctl_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PRCTL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/procctl.h" "ac_cv_header_sys_procctl_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_procctl_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PROCCTL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/pstat.h" "ac_cv_header_sys_pstat_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_pstat_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PSTAT_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/ptrace.h" "ac_cv_header_sys_ptrace_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ptrace_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PTRACE_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/random.h" "ac_cv_header_sys_random_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_random_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_RANDOM_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_select_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SELECT_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/stream.h" "ac_cv_header_sys_stream_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_stream_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_STREAM_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/stropts.h" "ac_cv_header_sys_stropts_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_stropts_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_STROPTS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/strtio.h" "ac_cv_header_sys_strtio_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_strtio_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_STRTIO_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/statvfs.h" "ac_cv_header_sys_statvfs_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_statvfs_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_STATVFS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/sysmacros.h" "ac_cv_header_sys_sysmacros_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_sysmacros_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SYSMACROS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/timers.h" "ac_cv_header_sys_timers_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_timers_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TIMERS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/vfs.h" "ac_cv_header_sys_vfs_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_vfs_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_VFS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "tmpdir.h" "ac_cv_header_tmpdir_h" "$ac_includes_default" +if test "x$ac_cv_header_tmpdir_h" = xyes +then : + printf "%s\n" "#define HAVE_TMPDIR_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "ttyent.h" "ac_cv_header_ttyent_h" "$ac_includes_default" +if test "x$ac_cv_header_ttyent_h" = xyes +then : + printf "%s\n" "#define HAVE_TTYENT_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "ucred.h" "ac_cv_header_ucred_h" "$ac_includes_default" +if test "x$ac_cv_header_ucred_h" = xyes +then : + printf "%s\n" "#define HAVE_UCRED_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" +if test "x$ac_cv_header_unistd_h" = xyes +then : + printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "usersec.h" "ac_cv_header_usersec_h" "$ac_includes_default" +if test "x$ac_cv_header_usersec_h" = xyes +then : + printf "%s\n" "#define HAVE_USERSEC_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "utime.h" "ac_cv_header_utime_h" "$ac_includes_default" +if test "x$ac_cv_header_utime_h" = xyes +then : + printf "%s\n" "#define HAVE_UTIME_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "utmp.h" "ac_cv_header_utmp_h" "$ac_includes_default" +if test "x$ac_cv_header_utmp_h" = xyes +then : + printf "%s\n" "#define HAVE_UTMP_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "utmpx.h" "ac_cv_header_utmpx_h" "$ac_includes_default" +if test "x$ac_cv_header_utmpx_h" = xyes +then : + printf "%s\n" "#define HAVE_UTMPX_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "vis.h" "ac_cv_header_vis_h" "$ac_includes_default" +if test "x$ac_cv_header_vis_h" = xyes +then : + printf "%s\n" "#define HAVE_VIS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "wchar.h" "ac_cv_header_wchar_h" "$ac_includes_default" +if test "x$ac_cv_header_wchar_h" = xyes +then : + printf "%s\n" "#define HAVE_WCHAR_H 1" >>confdefs.h + +fi + + +# Create replacement header files for common headers that are missing on this +# platform. Usually these are just empty, but in some cases they'll include +# the equivalent file. This avoids having to wrap those includes in +# '#ifdef HAVE_FOO_H'. If we create any such headers, add the path to includes. +COMPATINCLUDESDIR="openbsd-compat/include" +COMPATINCLUDES="" + for ac_header in endian.h ifaddrs.h libgen.h paths.h netgroup.h nlist.h poll.h stdint.h sys/mman.h sys/stat.h sys/statvfs.h sys/time.h sys/un.h time.h util.h +do : + as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes" +then : + cat >>confdefs.h <<_ACEOF +#define `printf "%s\n" "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + + # Remove any old shims. + rm -f "$COMPATINCLUDESDIR/$ac_header" + +else $as_nop + + COMPATINCLUDES="$COMPATINCLUDESDIR" + header="$COMPATINCLUDES/$ac_header" + dir=`dirname "$header"` + mkdir -p "$dir" + case "$ac_header" in + poll.h) echo '#ifdef HAVE_SYS_POLL_H' + echo '#include ' + echo '#endif' ;; + *) ;; + esac >"$header" + +fi + +done + +for include in sys/queue.h sys/tree.h; do + COMPATINCLUDES="$COMPATINCLUDESDIR" + header="$COMPATINCLUDES/$include" + dir=`dirname "$header"` + mkdir -p "$dir" + case "$include" in + sys/queue.h) + echo '#include "openbsd-compat/sys-queue.h"' + ;; + sys/tree.h) + echo '#include "openbsd-compat/sys-tree.h"' + ;; + esac >"$header" +done + +ac_fn_check_decl "$LINENO" "le32toh" "ac_cv_have_decl_le32toh" " +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_ENDIAN_H +# include +#endif + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_le32toh" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_LE32TOH $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "le64toh" "ac_cv_have_decl_le64toh" " +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_ENDIAN_H +# include +#endif + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_le64toh" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_LE64TOH $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "htole64" "ac_cv_have_decl_htole64" " +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_ENDIAN_H +# include +#endif + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_htole64" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_HTOLE64 $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "htobe32" "ac_cv_have_decl_htobe32" " +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_ENDIAN_H +# include +#endif + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_htobe32" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_HTOBE32 $ac_have_decl" >>confdefs.h + + +# On some platforms (eg SunOS4) sys/audit.h requires sys/[time|types|label.h] +# to be included first. +ac_fn_c_check_header_compile "$LINENO" "sys/audit.h" "ac_cv_header_sys_audit_h" " +#ifdef HAVE_SYS_TIME_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_LABEL_H +# include +#endif + +" +if test "x$ac_cv_header_sys_audit_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_AUDIT_H 1" >>confdefs.h + +fi + + +# sys/capsicum.h requires sys/types.h +ac_fn_c_check_header_compile "$LINENO" "sys/capsicum.h" "ac_cv_header_sys_capsicum_h" " +#ifdef HAVE_SYS_TYPES_H +# include +#endif + +" +if test "x$ac_cv_header_sys_capsicum_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_CAPSICUM_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "capsicum_helpers.h" "ac_cv_header_capsicum_helpers_h" " +#ifdef HAVE_SYS_TYPES_H +# include +#endif + +" +if test "x$ac_cv_header_capsicum_helpers_h" = xyes +then : + printf "%s\n" "#define HAVE_CAPSICUM_HELPERS_H 1" >>confdefs.h + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for caph_cache_tzdata" >&5 +printf %s "checking for caph_cache_tzdata... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ +caph_cache_tzdata(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define HAVE_CAPH_CACHE_TZDATA 1" >>confdefs.h + + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +# net/route.h requires sys/socket.h and sys/types.h. +# sys/sysctl.h also requires sys/param.h +ac_fn_c_check_header_compile "$LINENO" "net/route.h" "ac_cv_header_net_route_h" " +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#include +#include + +" +if test "x$ac_cv_header_net_route_h" = xyes +then : + printf "%s\n" "#define HAVE_NET_ROUTE_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/sysctl.h" "ac_cv_header_sys_sysctl_h" " +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#include +#include + +" +if test "x$ac_cv_header_sys_sysctl_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SYSCTL_H 1" >>confdefs.h + +fi + + +# lastlog.h requires sys/time.h to be included first on Solaris +ac_fn_c_check_header_compile "$LINENO" "lastlog.h" "ac_cv_header_lastlog_h" " +#ifdef HAVE_SYS_TIME_H +# include +#endif + +" +if test "x$ac_cv_header_lastlog_h" = xyes +then : + printf "%s\n" "#define HAVE_LASTLOG_H 1" >>confdefs.h + +fi + + +# sys/ptms.h requires sys/stream.h to be included first on Solaris +ac_fn_c_check_header_compile "$LINENO" "sys/ptms.h" "ac_cv_header_sys_ptms_h" " +#ifdef HAVE_SYS_STREAM_H +# include +#endif + +" +if test "x$ac_cv_header_sys_ptms_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PTMS_H 1" >>confdefs.h + +fi + + +# login_cap.h requires sys/types.h on NetBSD +ac_fn_c_check_header_compile "$LINENO" "login_cap.h" "ac_cv_header_login_cap_h" " +#include + +" +if test "x$ac_cv_header_login_cap_h" = xyes +then : + printf "%s\n" "#define HAVE_LOGIN_CAP_H 1" >>confdefs.h + +fi + + +# older BSDs need sys/param.h before sys/mount.h +ac_fn_c_check_header_compile "$LINENO" "sys/mount.h" "ac_cv_header_sys_mount_h" " +#include + +" +if test "x$ac_cv_header_sys_mount_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_MOUNT_H 1" >>confdefs.h + +fi + + +# Android requires sys/socket.h to be included before sys/un.h +ac_fn_c_check_header_compile "$LINENO" "sys/un.h" "ac_cv_header_sys_un_h" " +#include +#include + +" +if test "x$ac_cv_header_sys_un_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_UN_H 1" >>confdefs.h + +fi + + +# Messages for features tested for in target-specific section +SIA_MSG="no" +SPC_MSG="no" +SP_MSG="no" +SPP_MSG="no" + +# Support for Solaris/Illumos privileges (this test is used by both +# the --with-solaris-privs option and --with-sandbox=solaris). +SOLARIS_PRIVS="no" + +# Default shared library extension +SHLIBEXT=".so" + +# See OpenBSD section in $host case below. +need_pledge_inet="" + +# Check for some target-specific stuff +case "$host" in +*-*-aix*) + # Some versions of VAC won't allow macro redefinitions at + # -qlanglevel=ansi, and autoconf 2.60 sometimes insists on using that + # particularly with older versions of vac or xlc. + # It also throws errors about null macro arguments, but these are + # not fatal. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if compiler allows macro redefinitions" >&5 +printf %s "checking if compiler allows macro redefinitions... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#define testmacro foo +#define testmacro bar +int +main (void) +{ + exit(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + CC="`echo $CC | sed 's/-qlanglvl\=ansi//g'`" + CFLAGS="`echo $CFLAGS | sed 's/-qlanglvl\=ansi//g'`" + CPPFLAGS="`echo $CPPFLAGS | sed 's/-qlanglvl\=ansi//g'`" + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to specify blibpath for linker ($LD)" >&5 +printf %s "checking how to specify blibpath for linker ($LD)... " >&6; } + if (test -z "$blibpath"); then + blibpath="/usr/lib:/lib" + fi + saved_LDFLAGS="$LDFLAGS" + if test "$GCC" = "yes"; then + flags="-Wl,-blibpath: -Wl,-rpath, -blibpath:" + else + flags="-blibpath: -Wl,-blibpath: -Wl,-rpath," + fi + for tryflags in $flags ;do + if (test -z "$blibflags"); then + LDFLAGS="$saved_LDFLAGS $tryflags$blibpath" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + blibflags=$tryflags +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + fi + done + if (test -z "$blibflags"); then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +printf "%s\n" "not found" >&6; } + as_fn_error $? "*** must be able to specify blibpath on AIX - check config.log" "$LINENO" 5 + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $blibflags" >&5 +printf "%s\n" "$blibflags" >&6; } + fi + LDFLAGS="$saved_LDFLAGS" + ac_fn_c_check_func "$LINENO" "authenticate" "ac_cv_func_authenticate" +if test "x$ac_cv_func_authenticate" = xyes +then : + +printf "%s\n" "#define WITH_AIXAUTHENTICATE 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for authenticate in -ls" >&5 +printf %s "checking for authenticate in -ls... " >&6; } +if test ${ac_cv_lib_s_authenticate+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ls $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char authenticate (); +int +main (void) +{ +return authenticate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_s_authenticate=yes +else $as_nop + ac_cv_lib_s_authenticate=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_s_authenticate" >&5 +printf "%s\n" "$ac_cv_lib_s_authenticate" >&6; } +if test "x$ac_cv_lib_s_authenticate" = xyes +then : + printf "%s\n" "#define WITH_AIXAUTHENTICATE 1" >>confdefs.h + + LIBS="$LIBS -ls" + +fi + + +fi + + ac_fn_check_decl "$LINENO" "authenticate" "ac_cv_have_decl_authenticate" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_authenticate" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_AUTHENTICATE $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "loginrestrictions" "ac_cv_have_decl_loginrestrictions" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_loginrestrictions" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_LOGINRESTRICTIONS $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "loginsuccess" "ac_cv_have_decl_loginsuccess" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_loginsuccess" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_LOGINSUCCESS $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "passwdexpired" "ac_cv_have_decl_passwdexpired" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_passwdexpired" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_PASSWDEXPIRED $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "setauthdb" "ac_cv_have_decl_setauthdb" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_setauthdb" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_SETAUTHDB $ac_have_decl" >>confdefs.h + + ac_fn_check_decl "$LINENO" "loginfailed" "ac_cv_have_decl_loginfailed" "#include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_loginfailed" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_LOGINFAILED $ac_have_decl" >>confdefs.h +if test $ac_have_decl = 1 +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if loginfailed takes 4 arguments" >&5 +printf %s "checking if loginfailed takes 4 arguments... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + (void)loginfailed("user","host","tty",0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define AIX_LOGINFAILED_4ARG 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + ac_fn_c_check_func "$LINENO" "getgrset" "ac_cv_func_getgrset" +if test "x$ac_cv_func_getgrset" = xyes +then : + printf "%s\n" "#define HAVE_GETGRSET 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setauthdb" "ac_cv_func_setauthdb" +if test "x$ac_cv_func_setauthdb" = xyes +then : + printf "%s\n" "#define HAVE_SETAUTHDB 1" >>confdefs.h + +fi + + ac_fn_check_decl "$LINENO" "F_CLOSEM" "ac_cv_have_decl_F_CLOSEM" " #include + #include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_F_CLOSEM" = xyes +then : + +printf "%s\n" "#define HAVE_FCNTL_CLOSEM 1" >>confdefs.h + +fi + check_for_aix_broken_getaddrinfo=1 + +printf "%s\n" "#define SETEUID_BREAKS_SETUID 1" >>confdefs.h + + +printf "%s\n" "#define BROKEN_SETREUID 1" >>confdefs.h + + +printf "%s\n" "#define BROKEN_SETREGID 1" >>confdefs.h + + +printf "%s\n" "#define DISABLE_LASTLOG 1" >>confdefs.h + + +printf "%s\n" "#define LOGIN_NEEDS_UTMPX 1" >>confdefs.h + + +printf "%s\n" "#define SPT_TYPE SPT_REUSEARGV" >>confdefs.h + + +printf "%s\n" "#define PTY_ZEROREAD 1" >>confdefs.h + + +printf "%s\n" "#define PLATFORM_SYS_DIR_UID 2" >>confdefs.h + + +printf "%s\n" "#define BROKEN_STRNDUP 1" >>confdefs.h + + +printf "%s\n" "#define BROKEN_STRNLEN 1" >>confdefs.h + + ;; +*-*-android*) + +printf "%s\n" "#define DISABLE_UTMP 1" >>confdefs.h + + +printf "%s\n" "#define DISABLE_WTMP 1" >>confdefs.h + + ;; +*-*-cygwin*) + LIBS="$LIBS /usr/lib/textreadmode.o" + +printf "%s\n" "#define HAVE_CYGWIN 1" >>confdefs.h + + +printf "%s\n" "#define USE_PIPES 1" >>confdefs.h + + +printf "%s\n" "#define NO_UID_RESTORATION_TEST 1" >>confdefs.h + + +printf "%s\n" "#define DISABLE_SHADOW 1" >>confdefs.h + + +printf "%s\n" "#define NO_X11_UNIX_SOCKETS 1" >>confdefs.h + + +printf "%s\n" "#define DISABLE_FD_PASSING 1" >>confdefs.h + + +printf "%s\n" "#define SSH_IOBUFSZ 65535" >>confdefs.h + + +printf "%s\n" "#define FILESYSTEM_NO_BACKSLASH 1" >>confdefs.h + + # Cygwin defines optargs, optargs as declspec(dllimport) for historical + # reasons which cause compile warnings, so we disable those warnings. + { + ossh_cache_var=ossh_cv_cflag__Wno_attributes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -Wno-attributes" >&5 +printf %s "checking if $CC supports compile flag -Wno-attributes... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -Wno-attributes" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-Wno-attributes" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + SHLIBEXT=".dll" + ;; +*-*-dgux*) + +printf "%s\n" "#define IP_TOS_IS_BROKEN 1" >>confdefs.h + + printf "%s\n" "#define SETEUID_BREAKS_SETUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREGID 1" >>confdefs.h + + ;; +*-*-darwin*) + use_pie=auto + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we have working getaddrinfo" >&5 +printf %s "checking if we have working getaddrinfo... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: assume it is working" >&5 +printf "%s\n" "assume it is working" >&6; } +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +int main(void) { if (NSVersionOfRunTimeLibrary("System") >= (60 << 16)) + exit(0); + else + exit(1); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: working" >&5 +printf "%s\n" "working" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: buggy" >&5 +printf "%s\n" "buggy" >&6; } + +printf "%s\n" "#define BROKEN_GETADDRINFO 1" >>confdefs.h + + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + printf "%s\n" "#define SETEUID_BREAKS_SETUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREGID 1" >>confdefs.h + + broken_glob=yes # OS X glob does not do what we expect + +printf "%s\n" "#define BIND_8_COMPAT 1" >>confdefs.h + + +printf "%s\n" "#define SSH_TUN_FREEBSD 1" >>confdefs.h + + +printf "%s\n" "#define SSH_TUN_COMPAT_AF 1" >>confdefs.h + + +printf "%s\n" "#define SSH_TUN_PREPEND_AF 1" >>confdefs.h + + + ac_fn_check_decl "$LINENO" "AU_IPv4" "ac_cv_have_decl_AU_IPv4" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_AU_IPv4" = xyes +then : + +else $as_nop + +printf "%s\n" "#define AU_IPv4 0" >>confdefs.h + + #include + +printf "%s\n" "#define LASTLOG_WRITE_PUTUTXLINE 1" >>confdefs.h + + +fi + +printf "%s\n" "#define SPT_TYPE SPT_REUSEARGV" >>confdefs.h + + ac_fn_c_check_func "$LINENO" "sandbox_init" "ac_cv_func_sandbox_init" +if test "x$ac_cv_func_sandbox_init" = xyes +then : + printf "%s\n" "#define HAVE_SANDBOX_INIT 1" >>confdefs.h + +fi + + ac_fn_c_check_header_compile "$LINENO" "sandbox.h" "ac_cv_header_sandbox_h" "$ac_includes_default" +if test "x$ac_cv_header_sandbox_h" = xyes +then : + printf "%s\n" "#define HAVE_SANDBOX_H 1" >>confdefs.h + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sandbox_apply in -lsandbox" >&5 +printf %s "checking for sandbox_apply in -lsandbox... " >&6; } +if test ${ac_cv_lib_sandbox_sandbox_apply+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsandbox $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char sandbox_apply (); +int +main (void) +{ +return sandbox_apply (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_sandbox_sandbox_apply=yes +else $as_nop + ac_cv_lib_sandbox_sandbox_apply=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sandbox_sandbox_apply" >&5 +printf "%s\n" "$ac_cv_lib_sandbox_sandbox_apply" >&6; } +if test "x$ac_cv_lib_sandbox_sandbox_apply" = xyes +then : + + SSHDLIBS="$SSHDLIBS -lsandbox" + +fi + + # proc_pidinfo()-based closefrom() replacement. + ac_fn_c_check_header_compile "$LINENO" "libproc.h" "ac_cv_header_libproc_h" "$ac_includes_default" +if test "x$ac_cv_header_libproc_h" = xyes +then : + printf "%s\n" "#define HAVE_LIBPROC_H 1" >>confdefs.h + +fi + + ac_fn_c_check_func "$LINENO" "proc_pidinfo" "ac_cv_func_proc_pidinfo" +if test "x$ac_cv_func_proc_pidinfo" = xyes +then : + printf "%s\n" "#define HAVE_PROC_PIDINFO 1" >>confdefs.h + +fi + + # poll(2) is broken for character-special devices (at least). + # cf. Apple bug 3710161 (not public, but searchable) + +printf "%s\n" "#define BROKEN_POLL 1" >>confdefs.h + + SHLIBEXT=".dylib" + ;; +*-*-dragonfly*) + SSHDLIBS="$SSHDLIBS" + TEST_MALLOC_OPTIONS="AFGJPRX" + ;; +*-*-haiku*) + LIBS="$LIBS -lbsd " + CFLAGS="$CFLAGS -D_BSD_SOURCE" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for socket in -lnetwork" >&5 +printf %s "checking for socket in -lnetwork... " >&6; } +if test ${ac_cv_lib_network_socket+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnetwork $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char socket (); +int +main (void) +{ +return socket (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_network_socket=yes +else $as_nop + ac_cv_lib_network_socket=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_socket" >&5 +printf "%s\n" "$ac_cv_lib_network_socket" >&6; } +if test "x$ac_cv_lib_network_socket" = xyes +then : + printf "%s\n" "#define HAVE_LIBNETWORK 1" >>confdefs.h + + LIBS="-lnetwork $LIBS" + +fi + + printf "%s\n" "#define HAVE_U_INT64_T 1" >>confdefs.h + + +printf "%s\n" "#define DISABLE_UTMPX 1" >>confdefs.h + + MANTYPE=man + ;; +*-*-hpux*) + # first we define all of the options common to all HP-UX releases + CPPFLAGS="$CPPFLAGS -D_HPUX_SOURCE -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED=1" + IPADDR_IN_DISPLAY=yes + printf "%s\n" "#define USE_PIPES 1" >>confdefs.h + + printf "%s\n" "#define LOGIN_NEEDS_UTMPX 1" >>confdefs.h + + +printf "%s\n" "#define LOCKED_PASSWD_STRING \"*\"" >>confdefs.h + + printf "%s\n" "#define SPT_TYPE SPT_PSTAT" >>confdefs.h + + +printf "%s\n" "#define PLATFORM_SYS_DIR_UID 2" >>confdefs.h + + maildir="/var/mail" + LIBS="$LIBS -lsec" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for t_error in -lxnet" >&5 +printf %s "checking for t_error in -lxnet... " >&6; } +if test ${ac_cv_lib_xnet_t_error+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lxnet $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char t_error (); +int +main (void) +{ +return t_error (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_xnet_t_error=yes +else $as_nop + ac_cv_lib_xnet_t_error=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_xnet_t_error" >&5 +printf "%s\n" "$ac_cv_lib_xnet_t_error" >&6; } +if test "x$ac_cv_lib_xnet_t_error" = xyes +then : + printf "%s\n" "#define HAVE_LIBXNET 1" >>confdefs.h + + LIBS="-lxnet $LIBS" + +else $as_nop + as_fn_error $? "*** -lxnet needed on HP-UX - check config.log ***" "$LINENO" 5 +fi + + + # next, we define all of the options specific to major releases + case "$host" in + *-*-hpux10*) + if test -z "$GCC"; then + CFLAGS="$CFLAGS -Ae" + fi + +printf "%s\n" "#define BROKEN_GETLINE 1" >>confdefs.h + + ;; + *-*-hpux11*) + +printf "%s\n" "#define PAM_SUN_CODEBASE 1" >>confdefs.h + + +printf "%s\n" "#define DISABLE_UTMP 1" >>confdefs.h + + +printf "%s\n" "#define USE_BTMP 1" >>confdefs.h + + check_for_hpux_broken_getaddrinfo=1 + check_for_conflicting_getspnam=1 + ;; + esac + + # lastly, we define options specific to minor releases + case "$host" in + *-*-hpux10.26) + +printf "%s\n" "#define HAVE_SECUREWARE 1" >>confdefs.h + + disable_ptmx_check=yes + LIBS="$LIBS -lsecpw" + ;; + esac + ;; +*-*-irix5*) + PATH="$PATH:/usr/etc" + +printf "%s\n" "#define BROKEN_INET_NTOA 1" >>confdefs.h + + printf "%s\n" "#define SETEUID_BREAKS_SETUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREGID 1" >>confdefs.h + + +printf "%s\n" "#define WITH_ABBREV_NO_TTY 1" >>confdefs.h + + printf "%s\n" "#define LOCKED_PASSWD_STRING \"*LK*\"" >>confdefs.h + + ;; +*-*-irix6*) + PATH="$PATH:/usr/etc" + +printf "%s\n" "#define WITH_IRIX_ARRAY 1" >>confdefs.h + + +printf "%s\n" "#define WITH_IRIX_PROJECT 1" >>confdefs.h + + +printf "%s\n" "#define WITH_IRIX_AUDIT 1" >>confdefs.h + + ac_fn_c_check_func "$LINENO" "jlimit_startjob" "ac_cv_func_jlimit_startjob" +if test "x$ac_cv_func_jlimit_startjob" = xyes +then : + +printf "%s\n" "#define WITH_IRIX_JOBS 1" >>confdefs.h + +fi + + printf "%s\n" "#define BROKEN_INET_NTOA 1" >>confdefs.h + + printf "%s\n" "#define SETEUID_BREAKS_SETUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREGID 1" >>confdefs.h + + +printf "%s\n" "#define BROKEN_UPDWTMPX 1" >>confdefs.h + + printf "%s\n" "#define WITH_ABBREV_NO_TTY 1" >>confdefs.h + + printf "%s\n" "#define LOCKED_PASSWD_STRING \"*LK*\"" >>confdefs.h + + ;; +*-*-k*bsd*-gnu | *-*-kopensolaris*-gnu) + printf "%s\n" "#define PAM_TTY_KLUDGE 1" >>confdefs.h + + printf "%s\n" "#define LOCKED_PASSWD_PREFIX \"!\"" >>confdefs.h + + printf "%s\n" "#define SPT_TYPE SPT_REUSEARGV" >>confdefs.h + + +printf "%s\n" "#define _PATH_BTMP \"/var/log/btmp\"" >>confdefs.h + + +printf "%s\n" "#define USE_BTMP 1" >>confdefs.h + + ;; +*-*-linux*) + no_dev_ptmx=1 + use_pie=auto + check_for_openpty_ctty_bug=1 + CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_GNU_SOURCE" + +printf "%s\n" "#define BROKEN_CLOSEFROM 1" >>confdefs.h + + +printf "%s\n" "#define PAM_TTY_KLUDGE 1" >>confdefs.h + + +printf "%s\n" "#define LOCKED_PASSWD_PREFIX \"!\"" >>confdefs.h + + printf "%s\n" "#define SPT_TYPE SPT_REUSEARGV" >>confdefs.h + + +printf "%s\n" "#define LINK_OPNOTSUPP_ERRNO EPERM" >>confdefs.h + + +printf "%s\n" "#define _PATH_BTMP \"/var/log/btmp\"" >>confdefs.h + + printf "%s\n" "#define USE_BTMP 1" >>confdefs.h + + +printf "%s\n" "#define LINUX_OOM_ADJUST 1" >>confdefs.h + + +# Check whether --with-linux-memlock-onfault was given. +if test ${with_linux_memlock_onfault+y} +then : + withval=$with_linux_memlock_onfault; + if test "x$withval" != "xno" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for MCL_ONFAULT" >&5 +printf %s "checking for MCL_ONFAULT... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + mlockall(MCL_FUTURE | MCL_ONFAULT); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: supported" >&5 +printf "%s\n" "supported" >&6; } + +printf "%s\n" "#define LINUX_MEMLOCK_ONFAULT 1" >>confdefs.h + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not supported" >&5 +printf "%s\n" "not supported" >&6; } + as_fn_error $? "MCL_ONFAULT is not available on your system" "$LINENO" 5 + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +fi + + + +printf "%s\n" "#define SYSTEMD_NOTIFY 1" >>confdefs.h + + inet6_default_4in6=yes + case `uname -r` in + 1.*|2.0.*) + +printf "%s\n" "#define BROKEN_CMSG_TYPE 1" >>confdefs.h + + ;; + esac + # tun(4) forwarding compat code + ac_fn_c_check_header_compile "$LINENO" "linux/if_tun.h" "ac_cv_header_linux_if_tun_h" "$ac_includes_default" +if test "x$ac_cv_header_linux_if_tun_h" = xyes +then : + printf "%s\n" "#define HAVE_LINUX_IF_TUN_H 1" >>confdefs.h + +fi + + if test "x$ac_cv_header_linux_if_tun_h" = "xyes" ; then + +printf "%s\n" "#define SSH_TUN_LINUX 1" >>confdefs.h + + +printf "%s\n" "#define SSH_TUN_COMPAT_AF 1" >>confdefs.h + + +printf "%s\n" "#define SSH_TUN_PREPEND_AF 1" >>confdefs.h + + fi + ac_fn_c_check_header_compile "$LINENO" "linux/if.h" "ac_cv_header_linux_if_h" " +#ifdef HAVE_SYS_TYPES_H +# include +#endif + +" +if test "x$ac_cv_header_linux_if_h" = xyes +then : + +printf "%s\n" "#define SYS_RDOMAIN_LINUX 1" >>confdefs.h + +fi + + ac_fn_c_check_header_compile "$LINENO" "linux/seccomp.h" "ac_cv_header_linux_seccomp_h" "#include +" +if test "x$ac_cv_header_linux_seccomp_h" = xyes +then : + printf "%s\n" "#define HAVE_LINUX_SECCOMP_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "linux/filter.h" "ac_cv_header_linux_filter_h" "#include +" +if test "x$ac_cv_header_linux_filter_h" = xyes +then : + printf "%s\n" "#define HAVE_LINUX_FILTER_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "linux/audit.h" "ac_cv_header_linux_audit_h" "#include +" +if test "x$ac_cv_header_linux_audit_h" = xyes +then : + printf "%s\n" "#define HAVE_LINUX_AUDIT_H 1" >>confdefs.h + +fi + + # Obtain MIPS ABI + case "$host" in + mips*) + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#if _MIPS_SIM != _ABIO32 +#error +#endif + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + mips_abi="o32" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#if _MIPS_SIM != _ABIN32 +#error +#endif + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + mips_abi="n32" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#if _MIPS_SIM != _ABI64 +#error +#endif + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + mips_abi="n64" +else $as_nop + as_fn_error $? "unknown MIPS ABI" "$LINENO" 5 + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for seccomp architecture" >&5 +printf %s "checking for seccomp architecture... " >&6; } + seccomp_audit_arch= + case "$host" in + x86_64-*) + seccomp_audit_arch=AUDIT_ARCH_X86_64 + ;; + i*86-*) + seccomp_audit_arch=AUDIT_ARCH_I386 + ;; + arm*-*) + seccomp_audit_arch=AUDIT_ARCH_ARM + ;; + aarch64*-*) + seccomp_audit_arch=AUDIT_ARCH_AARCH64 + ;; + s390x-*) + seccomp_audit_arch=AUDIT_ARCH_S390X + ;; + s390-*) + seccomp_audit_arch=AUDIT_ARCH_S390 + ;; + powerpc-*) + seccomp_audit_arch=AUDIT_ARCH_PPC + ;; + powerpc64-*) + seccomp_audit_arch=AUDIT_ARCH_PPC64 + ;; + powerpc64le-*) + seccomp_audit_arch=AUDIT_ARCH_PPC64LE + ;; + mips-*) + seccomp_audit_arch=AUDIT_ARCH_MIPS + ;; + mipsel-*) + seccomp_audit_arch=AUDIT_ARCH_MIPSEL + ;; + mips64-*) + case "$mips_abi" in + "n32") + seccomp_audit_arch=AUDIT_ARCH_MIPS64N32 + ;; + "n64") + seccomp_audit_arch=AUDIT_ARCH_MIPS64 + ;; + esac + ;; + mips64el-*) + case "$mips_abi" in + "n32") + seccomp_audit_arch=AUDIT_ARCH_MIPSEL64N32 + ;; + "n64") + seccomp_audit_arch=AUDIT_ARCH_MIPSEL64 + ;; + esac + ;; + riscv64-*) + seccomp_audit_arch=AUDIT_ARCH_RISCV64 + ;; + esac + if test "x$seccomp_audit_arch" != "x" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: \"$seccomp_audit_arch\"" >&5 +printf "%s\n" "\"$seccomp_audit_arch\"" >&6; } + +printf "%s\n" "#define SECCOMP_AUDIT_ARCH $seccomp_audit_arch" >>confdefs.h + + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: architecture not supported" >&5 +printf "%s\n" "architecture not supported" >&6; } + fi + ;; +*-*-minix) + printf "%s\n" "#define SETEUID_BREAKS_SETUID 1" >>confdefs.h + + # poll(2) seems to choke on /dev/null; "Bad file descriptor" + +printf "%s\n" "#define BROKEN_POLL 1" >>confdefs.h + + ;; +mips-sony-bsd|mips-sony-newsos4) + +printf "%s\n" "#define NEED_SETPGRP 1" >>confdefs.h + + SONY=1 + ;; +*-*-netbsd*) + if test "x$withval" != "xno" ; then + rpath_opt="-R" + fi + CPPFLAGS="$CPPFLAGS -D_OPENBSD_SOURCE" + +printf "%s\n" "#define SSH_TUN_FREEBSD 1" >>confdefs.h + + ac_fn_c_check_header_compile "$LINENO" "net/if_tap.h" "ac_cv_header_net_if_tap_h" "$ac_includes_default" +if test "x$ac_cv_header_net_if_tap_h" = xyes +then : + +else $as_nop + +printf "%s\n" "#define SSH_TUN_NO_L2 1" >>confdefs.h + +fi + + +printf "%s\n" "#define SSH_TUN_PREPEND_AF 1" >>confdefs.h + + TEST_MALLOC_OPTIONS="AJRX" + +printf "%s\n" "#define BROKEN_READ_COMPARISON 1" >>confdefs.h + + ;; +*-*-freebsd*) + +printf "%s\n" "#define LOCKED_PASSWD_PREFIX \"*LOCKED*\"" >>confdefs.h + + +printf "%s\n" "#define SSH_TUN_FREEBSD 1" >>confdefs.h + + +printf "%s\n" "#define SSH_TUN_COMPAT_AF 1" >>confdefs.h + + ac_fn_c_check_header_compile "$LINENO" "net/if_tap.h" "ac_cv_header_net_if_tap_h" "$ac_includes_default" +if test "x$ac_cv_header_net_if_tap_h" = xyes +then : + +else $as_nop + +printf "%s\n" "#define SSH_TUN_NO_L2 1" >>confdefs.h + +fi + + broken_glob=yes # FreeBSD glob does not do what we need + TEST_MALLOC_OPTIONS="AJRX" + # Preauth crypto occasionally uses file descriptors for crypto offload + # and will crash if they cannot be opened. + +printf "%s\n" "#define SANDBOX_SKIP_RLIMIT_NOFILE 1" >>confdefs.h + + case "$host" in + *-*-freebsd9.*|*-*-freebsd10.*) + # Capsicum on 9 and 10 do not allow ppoll() so don't auto-enable. + disable_capsicum=yes + esac + ;; +*-*-bsdi*) + printf "%s\n" "#define SETEUID_BREAKS_SETUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREGID 1" >>confdefs.h + + ;; +*-next-*) + conf_lastlog_location="/usr/adm/lastlog" + conf_utmp_location=/etc/utmp + conf_wtmp_location=/usr/adm/wtmp + maildir=/usr/spool/mail + +printf "%s\n" "#define HAVE_NEXT 1" >>confdefs.h + + printf "%s\n" "#define USE_PIPES 1" >>confdefs.h + + +printf "%s\n" "#define BROKEN_SAVED_UIDS 1" >>confdefs.h + + ;; +*-*-openbsd*) + use_pie=auto + +printf "%s\n" "#define HAVE_ATTRIBUTE__SENTINEL__ 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_ATTRIBUTE__BOUNDED__ 1" >>confdefs.h + + +printf "%s\n" "#define SSH_TUN_OPENBSD 1" >>confdefs.h + + +printf "%s\n" "#define SYSLOG_R_SAFE_IN_SIGHAND 1" >>confdefs.h + + TEST_MALLOC_OPTIONS="SJRU" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pledge(2) allows IP_TOS" >&5 +printf %s "checking whether pledge(2) allows IP_TOS... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: cannot test" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: cannot test" >&2;} +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include + +int +main (void) +{ + +int s, one = 1; +if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) + err(1, "socket"); +if (pledge("stdio", NULL) == -1) + err(1, "pledge"); +if (setsockopt(s, IPPROTO_IP, IP_TOS, &one, sizeof(one)) == -1) + err(1, "setsockopt"); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + need_pledge_inet=1 + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + ;; +*-*-solaris*) + if test "x$withval" != "xno" ; then + rpath_opt="-R" + fi + printf "%s\n" "#define PAM_SUN_CODEBASE 1" >>confdefs.h + + printf "%s\n" "#define LOGIN_NEEDS_UTMPX 1" >>confdefs.h + + printf "%s\n" "#define PAM_TTY_KLUDGE 1" >>confdefs.h + + printf "%s\n" "#define LOCKED_PASSWD_STRING \"*LK*\"" >>confdefs.h + + # Pushing STREAMS modules will cause sshd to acquire a controlling tty. + +printf "%s\n" "#define SSHD_ACQUIRES_CTTY 1" >>confdefs.h + + +printf "%s\n" "#define PASSWD_NEEDS_USERNAME 1" >>confdefs.h + + +printf "%s\n" "#define BROKEN_TCGETATTR_ICANON 1" >>confdefs.h + + external_path_file=/etc/default/login + # hardwire lastlog location (can't detect it on some versions) + conf_lastlog_location="/var/adm/lastlog" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for obsolete utmp and wtmp in solaris2.x" >&5 +printf %s "checking for obsolete utmp and wtmp in solaris2.x... " >&6; } + sol2ver=`echo "$host"| sed -e 's/.*[0-9]\.//'` + if test "$sol2ver" -ge 8; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + printf "%s\n" "#define DISABLE_UTMP 1" >>confdefs.h + + +printf "%s\n" "#define DISABLE_WTMP 1" >>confdefs.h + + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + ac_fn_c_check_func "$LINENO" "setpflags" "ac_cv_func_setpflags" +if test "x$ac_cv_func_setpflags" = xyes +then : + printf "%s\n" "#define HAVE_SETPFLAGS 1" >>confdefs.h + +fi + + ac_fn_c_check_func "$LINENO" "setppriv" "ac_cv_func_setppriv" +if test "x$ac_cv_func_setppriv" = xyes +then : + printf "%s\n" "#define HAVE_SETPPRIV 1" >>confdefs.h + +fi + + ac_fn_c_check_func "$LINENO" "priv_basicset" "ac_cv_func_priv_basicset" +if test "x$ac_cv_func_priv_basicset" = xyes +then : + printf "%s\n" "#define HAVE_PRIV_BASICSET 1" >>confdefs.h + +fi + + ac_fn_c_check_header_compile "$LINENO" "priv.h" "ac_cv_header_priv_h" "$ac_includes_default" +if test "x$ac_cv_header_priv_h" = xyes +then : + printf "%s\n" "#define HAVE_PRIV_H 1" >>confdefs.h + +fi + + +# Check whether --with-solaris-contracts was given. +if test ${with_solaris_contracts+y} +then : + withval=$with_solaris_contracts; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ct_tmpl_activate in -lcontract" >&5 +printf %s "checking for ct_tmpl_activate in -lcontract... " >&6; } +if test ${ac_cv_lib_contract_ct_tmpl_activate+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcontract $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char ct_tmpl_activate (); +int +main (void) +{ +return ct_tmpl_activate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_contract_ct_tmpl_activate=yes +else $as_nop + ac_cv_lib_contract_ct_tmpl_activate=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_contract_ct_tmpl_activate" >&5 +printf "%s\n" "$ac_cv_lib_contract_ct_tmpl_activate" >&6; } +if test "x$ac_cv_lib_contract_ct_tmpl_activate" = xyes +then : + +printf "%s\n" "#define USE_SOLARIS_PROCESS_CONTRACTS 1" >>confdefs.h + + LIBS="$LIBS -lcontract" + SPC_MSG="yes" +fi + + +fi + + +# Check whether --with-solaris-projects was given. +if test ${with_solaris_projects+y} +then : + withval=$with_solaris_projects; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for setproject in -lproject" >&5 +printf %s "checking for setproject in -lproject... " >&6; } +if test ${ac_cv_lib_project_setproject+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lproject $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char setproject (); +int +main (void) +{ +return setproject (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_project_setproject=yes +else $as_nop + ac_cv_lib_project_setproject=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_project_setproject" >&5 +printf "%s\n" "$ac_cv_lib_project_setproject" >&6; } +if test "x$ac_cv_lib_project_setproject" = xyes +then : + +printf "%s\n" "#define USE_SOLARIS_PROJECTS 1" >>confdefs.h + + LIBS="$LIBS -lproject" + SP_MSG="yes" +fi + + +fi + + +# Check whether --with-solaris-privs was given. +if test ${with_solaris_privs+y} +then : + withval=$with_solaris_privs; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Solaris/Illumos privilege support" >&5 +printf %s "checking for Solaris/Illumos privilege support... " >&6; } + if test "x$ac_cv_func_setppriv" = "xyes" -a \ + "x$ac_cv_header_priv_h" = "xyes" ; then + SOLARIS_PRIVS=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: found" >&5 +printf "%s\n" "found" >&6; } + +printf "%s\n" "#define NO_UID_RESTORATION_TEST 1" >>confdefs.h + + +printf "%s\n" "#define USE_SOLARIS_PRIVS 1" >>confdefs.h + + SPP_MSG="yes" + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +printf "%s\n" "not found" >&6; } + as_fn_error $? "*** must have support for Solaris privileges to use --with-solaris-privs" "$LINENO" 5 + fi + +fi + + TEST_SHELL=$SHELL # let configure find us a capable shell + ;; +*-*-sunos4*) + CPPFLAGS="$CPPFLAGS -DSUNOS4" + ac_fn_c_check_func "$LINENO" "getpwanam" "ac_cv_func_getpwanam" +if test "x$ac_cv_func_getpwanam" = xyes +then : + printf "%s\n" "#define HAVE_GETPWANAM 1" >>confdefs.h + +fi + + printf "%s\n" "#define PAM_SUN_CODEBASE 1" >>confdefs.h + + conf_utmp_location=/etc/utmp + conf_wtmp_location=/var/adm/wtmp + conf_lastlog_location=/var/adm/lastlog + printf "%s\n" "#define USE_PIPES 1" >>confdefs.h + + +printf "%s\n" "#define DISABLE_UTMPX 1" >>confdefs.h + + ;; +*-ncr-sysv*) + LIBS="$LIBS -lc89" + printf "%s\n" "#define USE_PIPES 1" >>confdefs.h + + printf "%s\n" "#define SSHD_ACQUIRES_CTTY 1" >>confdefs.h + + printf "%s\n" "#define SETEUID_BREAKS_SETUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREGID 1" >>confdefs.h + + ;; +*-sni-sysv*) + # /usr/ucblib MUST NOT be searched on ReliantUNIX + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlsym in -ldl" >&5 +printf %s "checking for dlsym in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlsym+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlsym (); +int +main (void) +{ +return dlsym (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlsym=yes +else $as_nop + ac_cv_lib_dl_dlsym=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlsym" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlsym" >&6; } +if test "x$ac_cv_lib_dl_dlsym" = xyes +then : + printf "%s\n" "#define HAVE_LIBDL 1" >>confdefs.h + + LIBS="-ldl $LIBS" + +fi + + # -lresolv needs to be at the end of LIBS or DNS lookups break + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for res_query in -lresolv" >&5 +printf %s "checking for res_query in -lresolv... " >&6; } +if test ${ac_cv_lib_resolv_res_query+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lresolv $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char res_query (); +int +main (void) +{ +return res_query (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_resolv_res_query=yes +else $as_nop + ac_cv_lib_resolv_res_query=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_res_query" >&5 +printf "%s\n" "$ac_cv_lib_resolv_res_query" >&6; } +if test "x$ac_cv_lib_resolv_res_query" = xyes +then : + LIBS="$LIBS -lresolv" +fi + + IPADDR_IN_DISPLAY=yes + printf "%s\n" "#define USE_PIPES 1" >>confdefs.h + + printf "%s\n" "#define IP_TOS_IS_BROKEN 1" >>confdefs.h + + printf "%s\n" "#define SETEUID_BREAKS_SETUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREGID 1" >>confdefs.h + + printf "%s\n" "#define SSHD_ACQUIRES_CTTY 1" >>confdefs.h + + external_path_file=/etc/default/login + # /usr/ucblib/libucb.a no longer needed on ReliantUNIX + # Attention: always take care to bind libsocket and libnsl before libc, + # otherwise you will find lots of "SIOCGPGRP errno 22" on syslog + ;; +# UnixWare 1.x, UnixWare 2.x, and others based on code from Univel. +*-*-sysv4.2*) + printf "%s\n" "#define USE_PIPES 1" >>confdefs.h + + printf "%s\n" "#define SETEUID_BREAKS_SETUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREGID 1" >>confdefs.h + + +printf "%s\n" "#define PASSWD_NEEDS_USERNAME 1" >>confdefs.h + + printf "%s\n" "#define LOCKED_PASSWD_STRING \"*LK*\"" >>confdefs.h + + TEST_SHELL=$SHELL # let configure find us a capable shell + ;; +# UnixWare 7.x, OpenUNIX 8 +*-*-sysv5*) + CPPFLAGS="$CPPFLAGS -Dvsnprintf=_xvsnprintf -Dsnprintf=_xsnprintf" + +printf "%s\n" "#define UNIXWARE_LONG_PASSWORDS 1" >>confdefs.h + + printf "%s\n" "#define USE_PIPES 1" >>confdefs.h + + printf "%s\n" "#define SETEUID_BREAKS_SETUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_GETADDRINFO 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREGID 1" >>confdefs.h + + printf "%s\n" "#define PASSWD_NEEDS_USERNAME 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_TCGETATTR_ICANON 1" >>confdefs.h + + TEST_SHELL=$SHELL # let configure find us a capable shell + case "$host" in + *-*-sysv5SCO_SV*) # SCO OpenServer 6.x + maildir=/var/spool/mail + printf "%s\n" "#define BROKEN_UPDWTMPX 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getluid in -lprot" >&5 +printf %s "checking for getluid in -lprot... " >&6; } +if test ${ac_cv_lib_prot_getluid+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lprot $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char getluid (); +int +main (void) +{ +return getluid (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_prot_getluid=yes +else $as_nop + ac_cv_lib_prot_getluid=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_prot_getluid" >&5 +printf "%s\n" "$ac_cv_lib_prot_getluid" >&6; } +if test "x$ac_cv_lib_prot_getluid" = xyes +then : + LIBS="$LIBS -lprot" + ac_fn_c_check_func "$LINENO" "getluid" "ac_cv_func_getluid" +if test "x$ac_cv_func_getluid" = xyes +then : + printf "%s\n" "#define HAVE_GETLUID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setluid" "ac_cv_func_setluid" +if test "x$ac_cv_func_setluid" = xyes +then : + printf "%s\n" "#define HAVE_SETLUID 1" >>confdefs.h + +fi + + +fi + + ;; + *) printf "%s\n" "#define LOCKED_PASSWD_STRING \"*LK*\"" >>confdefs.h + + ;; + esac + ;; +*-*-sysv*) + ;; +# SCO UNIX and OEM versions of SCO UNIX +*-*-sco3.2v4*) + as_fn_error $? "\"This Platform is no longer supported.\"" "$LINENO" 5 + ;; +# SCO OpenServer 5.x +*-*-sco3.2v5*) + if test -z "$GCC"; then + CFLAGS="$CFLAGS -belf" + fi + LIBS="$LIBS -lprot -lx -ltinfo -lm" + no_dev_ptmx=1 + printf "%s\n" "#define USE_PIPES 1" >>confdefs.h + + printf "%s\n" "#define HAVE_SECUREWARE 1" >>confdefs.h + + printf "%s\n" "#define DISABLE_SHADOW 1" >>confdefs.h + + printf "%s\n" "#define DISABLE_FD_PASSING 1" >>confdefs.h + + printf "%s\n" "#define SETEUID_BREAKS_SETUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_GETADDRINFO 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREGID 1" >>confdefs.h + + printf "%s\n" "#define WITH_ABBREV_NO_TTY 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_UPDWTMPX 1" >>confdefs.h + + printf "%s\n" "#define PASSWD_NEEDS_USERNAME 1" >>confdefs.h + + ac_fn_c_check_func "$LINENO" "getluid" "ac_cv_func_getluid" +if test "x$ac_cv_func_getluid" = xyes +then : + printf "%s\n" "#define HAVE_GETLUID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setluid" "ac_cv_func_setluid" +if test "x$ac_cv_func_setluid" = xyes +then : + printf "%s\n" "#define HAVE_SETLUID 1" >>confdefs.h + +fi + + MANTYPE=man + TEST_SHELL=$SHELL # let configure find us a capable shell + SKIP_DISABLE_LASTLOG_DEFINE=yes + ;; +*-dec-osf*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Digital Unix SIA" >&5 +printf %s "checking for Digital Unix SIA... " >&6; } + no_osfsia="" + +# Check whether --with-osfsia was given. +if test ${with_osfsia+y} +then : + withval=$with_osfsia; + if test "x$withval" = "xno" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 +printf "%s\n" "disabled" >&6; } + no_osfsia=1 + fi + +fi + + if test -z "$no_osfsia" ; then + if test -f /etc/sia/matrix.conf; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define HAVE_OSF_SIA 1" >>confdefs.h + + +printf "%s\n" "#define DISABLE_LOGIN 1" >>confdefs.h + + printf "%s\n" "#define DISABLE_FD_PASSING 1" >>confdefs.h + + LIBS="$LIBS -lsecurity -ldb -lm -laud" + SIA_MSG="yes" + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +printf "%s\n" "#define LOCKED_PASSWD_SUBSTR \"Nologin\"" >>confdefs.h + + fi + fi + printf "%s\n" "#define BROKEN_GETADDRINFO 1" >>confdefs.h + + printf "%s\n" "#define SETEUID_BREAKS_SETUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREUID 1" >>confdefs.h + + printf "%s\n" "#define BROKEN_SETREGID 1" >>confdefs.h + + +printf "%s\n" "#define BROKEN_READV_COMPARISON 1" >>confdefs.h + + ;; + +*-*-nto-qnx*) + printf "%s\n" "#define USE_PIPES 1" >>confdefs.h + + printf "%s\n" "#define NO_X11_UNIX_SOCKETS 1" >>confdefs.h + + printf "%s\n" "#define DISABLE_LASTLOG 1" >>confdefs.h + + printf "%s\n" "#define SSHD_ACQUIRES_CTTY 1" >>confdefs.h + + +printf "%s\n" "#define BROKEN_SHADOW_EXPIRE 1" >>confdefs.h + + enable_etc_default_login=no # has incompatible /etc/default/login + case "$host" in + *-*-nto-qnx6*) + printf "%s\n" "#define DISABLE_FD_PASSING 1" >>confdefs.h + + ;; + esac + ;; + +*-*-ultrix*) + +printf "%s\n" "#define BROKEN_GETGROUPS 1" >>confdefs.h + + +printf "%s\n" "#define NEED_SETPGRP 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_SYS_SYSLOG_H 1" >>confdefs.h + + +printf "%s\n" "#define DISABLE_UTMPX 1" >>confdefs.h + + # DISABLE_FD_PASSING so that we call setpgrp as root, otherwise we + # don't get a controlling tty. + +printf "%s\n" "#define DISABLE_FD_PASSING 1" >>confdefs.h + + # On Ultrix some headers are not protected against multiple includes, + # so we create wrappers and put it where the compiler will find it. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: creating compat wrappers for headers" >&5 +printf "%s\n" "$as_me: WARNING: creating compat wrappers for headers" >&2;} + mkdir -p netinet + for header in netinet/ip.h netdb.h resolv.h; do + name=`echo $header | tr 'a-z/.' 'A-Z__'` + cat >$header <>confdefs.h + + ;; +*-*-gnu*) + CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_GNU_SOURCE" + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking compiler and flags for sanity" >&5 +printf %s "checking compiler and flags for sanity... " >&6; } +if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: not checking compiler sanity" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: not checking compiler sanity" >&2;} + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + exit(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + as_fn_error $? "*** compiler cannot create working executables, check config.log ***" "$LINENO" 5 + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +if test -z "$need_pledge_inet" ; then + printf "%s\n" "#define PLEDGE_EXTRA_INET /**/" >>confdefs.h + +else + +printf "%s\n" "#define PLEDGE_EXTRA_INET \"inet \"" >>confdefs.h + +fi + +# Checks for libraries. +ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" +if test "x$ac_cv_func_setsockopt" = xyes +then : + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for setsockopt in -lsocket" >&5 +printf %s "checking for setsockopt in -lsocket... " >&6; } +if test ${ac_cv_lib_socket_setsockopt+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char setsockopt (); +int +main (void) +{ +return setsockopt (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_socket_setsockopt=yes +else $as_nop + ac_cv_lib_socket_setsockopt=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_setsockopt" >&5 +printf "%s\n" "$ac_cv_lib_socket_setsockopt" >&6; } +if test "x$ac_cv_lib_socket_setsockopt" = xyes +then : + printf "%s\n" "#define HAVE_LIBSOCKET 1" >>confdefs.h + + LIBS="-lsocket $LIBS" + +fi + +fi + + + + for ac_func in dirname +do : + ac_fn_c_check_func "$LINENO" "dirname" "ac_cv_func_dirname" +if test "x$ac_cv_func_dirname" = xyes +then : + printf "%s\n" "#define HAVE_DIRNAME 1" >>confdefs.h + ac_fn_c_check_header_compile "$LINENO" "libgen.h" "ac_cv_header_libgen_h" "$ac_includes_default" +if test "x$ac_cv_header_libgen_h" = xyes +then : + printf "%s\n" "#define HAVE_LIBGEN_H 1" >>confdefs.h + +fi + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dirname in -lgen" >&5 +printf %s "checking for dirname in -lgen... " >&6; } +if test ${ac_cv_lib_gen_dirname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgen $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dirname (); +int +main (void) +{ +return dirname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_gen_dirname=yes +else $as_nop + ac_cv_lib_gen_dirname=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gen_dirname" >&5 +printf "%s\n" "$ac_cv_lib_gen_dirname" >&6; } +if test "x$ac_cv_lib_gen_dirname" = xyes +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for broken dirname" >&5 +printf %s "checking for broken dirname... " >&6; } +if test ${ac_cv_have_broken_dirname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + save_LIBS="$LIBS" + LIBS="$LIBS -lgen" + if test "$cross_compiling" = yes +then : + ac_cv_have_broken_dirname="no" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +int main(int argc, char **argv) { + char *s, buf[32]; + + strncpy(buf,"/etc", 32); + s = dirname(buf); + if (!s || strncmp(s, "/", 32) != 0) { + exit(1); + } else { + exit(0); + } +} + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_have_broken_dirname="no" +else $as_nop + ac_cv_have_broken_dirname="yes" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS="$save_LIBS" + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_broken_dirname" >&5 +printf "%s\n" "$ac_cv_have_broken_dirname" >&6; } + if test "x$ac_cv_have_broken_dirname" = "xno" ; then + LIBS="$LIBS -lgen" + printf "%s\n" "#define HAVE_DIRNAME 1" >>confdefs.h + + ac_fn_c_check_header_compile "$LINENO" "libgen.h" "ac_cv_header_libgen_h" "$ac_includes_default" +if test "x$ac_cv_header_libgen_h" = xyes +then : + printf "%s\n" "#define HAVE_LIBGEN_H 1" >>confdefs.h + +fi + + fi + +fi + + +fi + +done + +ac_fn_c_check_func "$LINENO" "getspnam" "ac_cv_func_getspnam" +if test "x$ac_cv_func_getspnam" = xyes +then : + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getspnam in -lgen" >&5 +printf %s "checking for getspnam in -lgen... " >&6; } +if test ${ac_cv_lib_gen_getspnam+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgen $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char getspnam (); +int +main (void) +{ +return getspnam (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_gen_getspnam=yes +else $as_nop + ac_cv_lib_gen_getspnam=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gen_getspnam" >&5 +printf "%s\n" "$ac_cv_lib_gen_getspnam" >&6; } +if test "x$ac_cv_lib_gen_getspnam" = xyes +then : + LIBS="$LIBS -lgen" +fi + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing basename" >&5 +printf %s "checking for library containing basename... " >&6; } +if test ${ac_cv_search_basename+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char basename (); +int +main (void) +{ +return basename (); + ; + return 0; +} +_ACEOF +for ac_lib in '' gen +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_basename=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_basename+y} +then : + break +fi +done +if test ${ac_cv_search_basename+y} +then : + +else $as_nop + ac_cv_search_basename=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_basename" >&5 +printf "%s\n" "$ac_cv_search_basename" >&6; } +ac_res=$ac_cv_search_basename +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +printf "%s\n" "#define HAVE_BASENAME 1" >>confdefs.h + +fi + + +ac_fn_c_check_func "$LINENO" "sqrt" "ac_cv_func_sqrt" +if test "x$ac_cv_func_sqrt" = xyes +then : + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqrt in -lm" >&5 +printf %s "checking for sqrt in -lm... " >&6; } +if test ${ac_cv_lib_m_sqrt+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char sqrt (); +int +main (void) +{ +return sqrt (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_m_sqrt=yes +else $as_nop + ac_cv_lib_m_sqrt=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sqrt" >&5 +printf "%s\n" "$ac_cv_lib_m_sqrt" >&6; } +if test "x$ac_cv_lib_m_sqrt" = xyes +then : + TESTLIBS="$TESTLIBS -lm" +fi + +fi + + + +zlib=yes + +# Check whether --with-zlib was given. +if test ${with_zlib+y} +then : + withval=$with_zlib; if test "x$withval" = "xno" ; then + zlib=no + elif test "x$withval" != "xyes"; then + if test -d "$withval/lib"; then + if test -n "${rpath_opt}"; then + LDFLAGS="-L${withval}/lib ${rpath_opt}${withval}/lib ${LDFLAGS}" + else + LDFLAGS="-L${withval}/lib ${LDFLAGS}" + fi + else + if test -n "${rpath_opt}"; then + LDFLAGS="-L${withval} ${rpath_opt}${withval} ${LDFLAGS}" + else + LDFLAGS="-L${withval} ${LDFLAGS}" + fi + fi + if test -d "$withval/include"; then + CPPFLAGS="-I${withval}/include ${CPPFLAGS}" + else + CPPFLAGS="-I${withval} ${CPPFLAGS}" + fi + fi + +fi + + +# These libraries are needed for anything that links in the channel code. +CHANNELLIBS="" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for zlib" >&5 +printf %s "checking for zlib... " >&6; } +if test "x${zlib}" = "xno"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +else + saved_LIBS="$LIBS" + CHANNELLIBS="$CHANNELLIBS -lz" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define WITH_ZLIB 1" >>confdefs.h + + ac_fn_c_check_header_compile "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = xyes +then : + +else $as_nop + as_fn_error $? "*** zlib.h missing - please install first or check config.log ***" "$LINENO" 5 +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for deflate in -lz" >&5 +printf %s "checking for deflate in -lz... " >&6; } +if test ${ac_cv_lib_z_deflate+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char deflate (); +int +main (void) +{ +return deflate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_z_deflate=yes +else $as_nop + ac_cv_lib_z_deflate=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_deflate" >&5 +printf "%s\n" "$ac_cv_lib_z_deflate" >&6; } +if test "x$ac_cv_lib_z_deflate" = xyes +then : + printf "%s\n" "#define HAVE_LIBZ 1" >>confdefs.h + + LIBS="-lz $LIBS" + +else $as_nop + + saved_CPPFLAGS="$CPPFLAGS" + saved_LDFLAGS="$LDFLAGS" + if test -n "${rpath_opt}"; then + LDFLAGS="-L/usr/local/lib ${rpath_opt}/usr/local/lib ${saved_LDFLAGS}" + else + LDFLAGS="-L/usr/local/lib ${saved_LDFLAGS}" + fi + CPPFLAGS="-I/usr/local/include ${saved_CPPFLAGS}" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char deflate (); +int +main (void) +{ +return deflate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + printf "%s\n" "#define HAVE_LIBZ 1" >>confdefs.h + +else $as_nop + + as_fn_error $? "*** zlib missing - please install first or check config.log ***" "$LINENO" 5 + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + + +fi + + + +# Check whether --with-zlib-version-check was given. +if test ${with_zlib_version_check+y} +then : + withval=$with_zlib_version_check; if test "x$withval" = "xno" ; then + zlib_check_nonfatal=1 + fi + + +fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for possibly buggy zlib" >&5 +printf %s "checking for possibly buggy zlib... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: not checking zlib version" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: not checking zlib version" >&2;} + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +int +main (void) +{ + + int a=0, b=0, c=0, d=0, n, v; + n = sscanf(ZLIB_VERSION, "%d.%d.%d.%d", &a, &b, &c, &d); + if (n < 1) + exit(1); + v = a*1000000 + b*10000 + c*100 + d; + fprintf(stderr, "found zlib version %s (%d)\n", ZLIB_VERSION, v); + + /* 1.1.4 is OK */ + if (a == 1 && b == 1 && c >= 4) + exit(0); + + /* 1.2.3 and up are OK */ + if (v >= 1020300) + exit(0); + + exit(2); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + if test -z "$zlib_check_nonfatal" ; then + as_fn_error $? "*** zlib too old - check config.log *** +Your reported zlib version has known security problems. It's possible your +vendor has fixed these problems without changing the version number. If you +are sure this is the case, you can disable the check by running +\"./configure --without-zlib-version-check\". +If you are in doubt, upgrade zlib to version 1.2.3 or greater. +See http://www.gzip.org/zlib/ for details." "$LINENO" 5 + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: zlib version may have security problems" >&5 +printf "%s\n" "$as_me: WARNING: zlib version may have security problems" >&2;} + fi + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS="$saved_LIBS" +fi + +ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp" +if test "x$ac_cv_func_strcasecmp" = xyes +then : + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for strcasecmp in -lresolv" >&5 +printf %s "checking for strcasecmp in -lresolv... " >&6; } +if test ${ac_cv_lib_resolv_strcasecmp+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lresolv $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char strcasecmp (); +int +main (void) +{ +return strcasecmp (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_resolv_strcasecmp=yes +else $as_nop + ac_cv_lib_resolv_strcasecmp=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_strcasecmp" >&5 +printf "%s\n" "$ac_cv_lib_resolv_strcasecmp" >&6; } +if test "x$ac_cv_lib_resolv_strcasecmp" = xyes +then : + LIBS="$LIBS -lresolv" +fi + + +fi + + + for ac_func in utimes +do : + ac_fn_c_check_func "$LINENO" "utimes" "ac_cv_func_utimes" +if test "x$ac_cv_func_utimes" = xyes +then : + printf "%s\n" "#define HAVE_UTIMES 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for utimes in -lc89" >&5 +printf %s "checking for utimes in -lc89... " >&6; } +if test ${ac_cv_lib_c89_utimes+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc89 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char utimes (); +int +main (void) +{ +return utimes (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_c89_utimes=yes +else $as_nop + ac_cv_lib_c89_utimes=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c89_utimes" >&5 +printf "%s\n" "$ac_cv_lib_c89_utimes" >&6; } +if test "x$ac_cv_lib_c89_utimes" = xyes +then : + printf "%s\n" "#define HAVE_UTIMES 1" >>confdefs.h + + LIBS="$LIBS -lc89" +fi + + +fi + +done + +ac_fn_c_check_header_compile "$LINENO" "bsd/libutil.h" "ac_cv_header_bsd_libutil_h" "$ac_includes_default" +if test "x$ac_cv_header_bsd_libutil_h" = xyes +then : + printf "%s\n" "#define HAVE_BSD_LIBUTIL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "libutil.h" "ac_cv_header_libutil_h" "$ac_includes_default" +if test "x$ac_cv_header_libutil_h" = xyes +then : + printf "%s\n" "#define HAVE_LIBUTIL_H 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing fmt_scaled" >&5 +printf %s "checking for library containing fmt_scaled... " >&6; } +if test ${ac_cv_search_fmt_scaled+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char fmt_scaled (); +int +main (void) +{ +return fmt_scaled (); + ; + return 0; +} +_ACEOF +for ac_lib in '' util bsd +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_fmt_scaled=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_fmt_scaled+y} +then : + break +fi +done +if test ${ac_cv_search_fmt_scaled+y} +then : + +else $as_nop + ac_cv_search_fmt_scaled=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_fmt_scaled" >&5 +printf "%s\n" "$ac_cv_search_fmt_scaled" >&6; } +ac_res=$ac_cv_search_fmt_scaled +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing scan_scaled" >&5 +printf %s "checking for library containing scan_scaled... " >&6; } +if test ${ac_cv_search_scan_scaled+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char scan_scaled (); +int +main (void) +{ +return scan_scaled (); + ; + return 0; +} +_ACEOF +for ac_lib in '' util bsd +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_scan_scaled=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_scan_scaled+y} +then : + break +fi +done +if test ${ac_cv_search_scan_scaled+y} +then : + +else $as_nop + ac_cv_search_scan_scaled=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_scan_scaled" >&5 +printf "%s\n" "$ac_cv_search_scan_scaled" >&6; } +ac_res=$ac_cv_search_scan_scaled +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing login" >&5 +printf %s "checking for library containing login... " >&6; } +if test ${ac_cv_search_login+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char login (); +int +main (void) +{ +return login (); + ; + return 0; +} +_ACEOF +for ac_lib in '' util bsd +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_login=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_login+y} +then : + break +fi +done +if test ${ac_cv_search_login+y} +then : + +else $as_nop + ac_cv_search_login=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_login" >&5 +printf "%s\n" "$ac_cv_search_login" >&6; } +ac_res=$ac_cv_search_login +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing logout" >&5 +printf %s "checking for library containing logout... " >&6; } +if test ${ac_cv_search_logout+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char logout (); +int +main (void) +{ +return logout (); + ; + return 0; +} +_ACEOF +for ac_lib in '' util bsd +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_logout=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_logout+y} +then : + break +fi +done +if test ${ac_cv_search_logout+y} +then : + +else $as_nop + ac_cv_search_logout=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_logout" >&5 +printf "%s\n" "$ac_cv_search_logout" >&6; } +ac_res=$ac_cv_search_logout +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing logwtmp" >&5 +printf %s "checking for library containing logwtmp... " >&6; } +if test ${ac_cv_search_logwtmp+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char logwtmp (); +int +main (void) +{ +return logwtmp (); + ; + return 0; +} +_ACEOF +for ac_lib in '' util bsd +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_logwtmp=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_logwtmp+y} +then : + break +fi +done +if test ${ac_cv_search_logwtmp+y} +then : + +else $as_nop + ac_cv_search_logwtmp=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_logwtmp" >&5 +printf "%s\n" "$ac_cv_search_logwtmp" >&6; } +ac_res=$ac_cv_search_logwtmp +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing openpty" >&5 +printf %s "checking for library containing openpty... " >&6; } +if test ${ac_cv_search_openpty+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char openpty (); +int +main (void) +{ +return openpty (); + ; + return 0; +} +_ACEOF +for ac_lib in '' util bsd +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_openpty=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_openpty+y} +then : + break +fi +done +if test ${ac_cv_search_openpty+y} +then : + +else $as_nop + ac_cv_search_openpty=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_openpty" >&5 +printf "%s\n" "$ac_cv_search_openpty" >&6; } +ac_res=$ac_cv_search_openpty +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing updwtmp" >&5 +printf %s "checking for library containing updwtmp... " >&6; } +if test ${ac_cv_search_updwtmp+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char updwtmp (); +int +main (void) +{ +return updwtmp (); + ; + return 0; +} +_ACEOF +for ac_lib in '' util bsd +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_updwtmp=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_updwtmp+y} +then : + break +fi +done +if test ${ac_cv_search_updwtmp+y} +then : + +else $as_nop + ac_cv_search_updwtmp=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_updwtmp" >&5 +printf "%s\n" "$ac_cv_search_updwtmp" >&6; } +ac_res=$ac_cv_search_updwtmp +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +ac_fn_c_check_func "$LINENO" "fmt_scaled" "ac_cv_func_fmt_scaled" +if test "x$ac_cv_func_fmt_scaled" = xyes +then : + printf "%s\n" "#define HAVE_FMT_SCALED 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "scan_scaled" "ac_cv_func_scan_scaled" +if test "x$ac_cv_func_scan_scaled" = xyes +then : + printf "%s\n" "#define HAVE_SCAN_SCALED 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "login" "ac_cv_func_login" +if test "x$ac_cv_func_login" = xyes +then : + printf "%s\n" "#define HAVE_LOGIN 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "logout" "ac_cv_func_logout" +if test "x$ac_cv_func_logout" = xyes +then : + printf "%s\n" "#define HAVE_LOGOUT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "openpty" "ac_cv_func_openpty" +if test "x$ac_cv_func_openpty" = xyes +then : + printf "%s\n" "#define HAVE_OPENPTY 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "updwtmp" "ac_cv_func_updwtmp" +if test "x$ac_cv_func_updwtmp" = xyes +then : + printf "%s\n" "#define HAVE_UPDWTMP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "logwtmp" "ac_cv_func_logwtmp" +if test "x$ac_cv_func_logwtmp" = xyes +then : + printf "%s\n" "#define HAVE_LOGWTMP 1" >>confdefs.h + +fi + + +# On some platforms, inet_ntop and gethostbyname may be found in libresolv +# or libnsl. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing inet_ntop" >&5 +printf %s "checking for library containing inet_ntop... " >&6; } +if test ${ac_cv_search_inet_ntop+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char inet_ntop (); +int +main (void) +{ +return inet_ntop (); + ; + return 0; +} +_ACEOF +for ac_lib in '' resolv nsl +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_inet_ntop=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_inet_ntop+y} +then : + break +fi +done +if test ${ac_cv_search_inet_ntop+y} +then : + +else $as_nop + ac_cv_search_inet_ntop=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop" >&5 +printf "%s\n" "$ac_cv_search_inet_ntop" >&6; } +ac_res=$ac_cv_search_inet_ntop +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 +printf %s "checking for library containing gethostbyname... " >&6; } +if test ${ac_cv_search_gethostbyname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +int +main (void) +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +for ac_lib in '' resolv nsl +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_gethostbyname=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_gethostbyname+y} +then : + break +fi +done +if test ${ac_cv_search_gethostbyname+y} +then : + +else $as_nop + ac_cv_search_gethostbyname=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 +printf "%s\n" "$ac_cv_search_gethostbyname" >&6; } +ac_res=$ac_cv_search_gethostbyname +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +# Some Linux distribtions ship the BSD libc hashing functions in +# separate libraries. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing SHA256Update" >&5 +printf %s "checking for library containing SHA256Update... " >&6; } +if test ${ac_cv_search_SHA256Update+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char SHA256Update (); +int +main (void) +{ +return SHA256Update (); + ; + return 0; +} +_ACEOF +for ac_lib in '' md bsd +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_SHA256Update=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_SHA256Update+y} +then : + break +fi +done +if test ${ac_cv_search_SHA256Update+y} +then : + +else $as_nop + ac_cv_search_SHA256Update=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_SHA256Update" >&5 +printf "%s\n" "$ac_cv_search_SHA256Update" >&6; } +ac_res=$ac_cv_search_SHA256Update +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +# "Particular Function Checks" +# see https://www.gnu.org/software/autoconf/manual/autoconf-2.69/html_node/Particular-Functions.html + + for ac_func in strftime +do : + ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" +if test "x$ac_cv_func_strftime" = xyes +then : + printf "%s\n" "#define HAVE_STRFTIME 1" >>confdefs.h + +else $as_nop + # strftime is in -lintl on SCO UNIX. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 +printf %s "checking for strftime in -lintl... " >&6; } +if test ${ac_cv_lib_intl_strftime+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char strftime (); +int +main (void) +{ +return strftime (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_intl_strftime=yes +else $as_nop + ac_cv_lib_intl_strftime=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 +printf "%s\n" "$ac_cv_lib_intl_strftime" >&6; } +if test "x$ac_cv_lib_intl_strftime" = xyes +then : + printf "%s\n" "#define HAVE_STRFTIME 1" >>confdefs.h + +LIBS="-lintl $LIBS" +fi + +fi + +done +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 +printf %s "checking for GNU libc compatible malloc... " >&6; } +if test ${ac_cv_func_malloc_0_nonnull+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + case "$host_os" in # (( + # Guess yes on platforms where we know the result. + *-gnu* | freebsd* | netbsd* | openbsd* | bitrig* \ + | hpux* | solaris* | cygwin* | mingw* | msys* ) + ac_cv_func_malloc_0_nonnull=yes ;; + # If we don't know, assume the worst. + *) ac_cv_func_malloc_0_nonnull=no ;; + esac +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main (void) +{ +void *p = malloc (0); + int result = !p; + free (p); + return result; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_func_malloc_0_nonnull=yes +else $as_nop + ac_cv_func_malloc_0_nonnull=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 +printf "%s\n" "$ac_cv_func_malloc_0_nonnull" >&6; } +if test $ac_cv_func_malloc_0_nonnull = yes +then : + +printf "%s\n" "#define HAVE_MALLOC 1" >>confdefs.h + +else $as_nop + printf "%s\n" "#define HAVE_MALLOC 0" >>confdefs.h + + case " $LIBOBJS " in + *" malloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS malloc.$ac_objext" + ;; +esac + + +printf "%s\n" "#define malloc rpl_malloc" >>confdefs.h + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5 +printf %s "checking for GNU libc compatible realloc... " >&6; } +if test ${ac_cv_func_realloc_0_nonnull+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + case "$host_os" in # (( + # Guess yes on platforms where we know the result. + *-gnu* | freebsd* | netbsd* | openbsd* | bitrig* \ + | hpux* | solaris* | cygwin* | mingw* | msys* ) + ac_cv_func_realloc_0_nonnull=yes ;; + # If we don't know, assume the worst. + *) ac_cv_func_realloc_0_nonnull=no ;; + esac +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main (void) +{ +void *p = realloc (0, 0); + int result = !p; + free (p); + return result; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_func_realloc_0_nonnull=yes +else $as_nop + ac_cv_func_realloc_0_nonnull=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5 +printf "%s\n" "$ac_cv_func_realloc_0_nonnull" >&6; } +if test $ac_cv_func_realloc_0_nonnull = yes +then : + +printf "%s\n" "#define HAVE_REALLOC 1" >>confdefs.h + +else $as_nop + printf "%s\n" "#define HAVE_REALLOC 0" >>confdefs.h + + case " $LIBOBJS " in + *" realloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS realloc.$ac_objext" + ;; +esac + + +printf "%s\n" "#define realloc rpl_realloc" >>confdefs.h + +fi + + +# autoconf doesn't have AC_FUNC_CALLOC so fake it if malloc returns NULL; +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if calloc(0, N) returns non-null" >&5 +printf %s "checking if calloc(0, N) returns non-null... " >&6; } +if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: assuming same as malloc" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: assuming same as malloc" >&2;} + func_calloc_0_nonnull="$ac_cv_func_malloc_0_nonnull" + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + void *p = calloc(0, 1); exit(p == NULL); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + func_calloc_0_nonnull=yes +else $as_nop + func_calloc_0_nonnull=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $func_calloc_0_nonnull" >&5 +printf "%s\n" "$func_calloc_0_nonnull" >&6; } + +if test "x$func_calloc_0_nonnull" = "xyes"; then + +printf "%s\n" "#define HAVE_CALLOC 1" >>confdefs.h + +else + +printf "%s\n" "#define HAVE_CALLOC 0" >>confdefs.h + + +printf "%s\n" "#define calloc rpl_calloc" >>confdefs.h + +fi + + + for ac_func in glob +do : + ac_fn_c_check_func "$LINENO" "glob" "ac_cv_func_glob" +if test "x$ac_cv_func_glob" = xyes +then : + printf "%s\n" "#define HAVE_GLOB 1" >>confdefs.h + for ac_header in glob.h +do : + ac_fn_c_check_header_compile "$LINENO" "glob.h" "ac_cv_header_glob_h" "$ac_includes_default" +if test "x$ac_cv_header_glob_h" = xyes +then : + printf "%s\n" "#define HAVE_GLOB_H 1" >>confdefs.h + use_system_glob=yes +else $as_nop + use_system_glob=no +fi + +done + +else $as_nop + use_system_glob=no + +fi + +done + +# Check for ALTDIRFUNC glob() extension +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GLOB_ALTDIRFUNC support" >&5 +printf %s "checking for GLOB_ALTDIRFUNC support... " >&6; } + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #ifdef GLOB_ALTDIRFUNC + FOUNDIT + #endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "FOUNDIT" >/dev/null 2>&1 +then : + + +printf "%s\n" "#define GLOB_HAS_ALTDIRFUNC 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + use_system_glob=no + + +fi +rm -rf conftest* + + +# Check for g.gl_matchc glob() extension +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gl_matchc field in glob_t" >&5 +printf %s "checking for gl_matchc field in glob_t... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + glob_t g; g.gl_matchc = 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + +printf "%s\n" "#define GLOB_HAS_GL_MATCHC 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + use_system_glob=no + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +# Check for g.gl_statv glob() extension +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gl_statv and GLOB_KEEPSTAT extensions for glob" >&5 +printf %s "checking for gl_statv and GLOB_KEEPSTAT extensions for glob... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + +#ifndef GLOB_KEEPSTAT +#error "glob does not support GLOB_KEEPSTAT extension" +#endif +glob_t g; +g.gl_statv = NULL; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + +printf "%s\n" "#define GLOB_HAS_GL_STATV 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + use_system_glob=no + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +ac_fn_check_decl "$LINENO" "GLOB_NOMATCH" "ac_cv_have_decl_GLOB_NOMATCH" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_GLOB_NOMATCH" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_GLOB_NOMATCH $ac_have_decl" >>confdefs.h +if test $ac_have_decl = 1 +then : + +else $as_nop + use_system_glob=no +fi + + +if test "x$broken_glob" = "xyes"; then + +printf "%s\n" "#define BROKEN_GLOB 1" >>confdefs.h + + use_system_glob=no +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can use the system glob" >&5 +printf %s "checking if we can use the system glob... " >&6; } +if test "x$use_system_glob" = "xyes" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + # Remove any old shims. + rm -f "$COMPATINCLUDESDIR/glob.h" +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + COMPATINCLUDES="$COMPATINCLUDESDIR" + mkdir -p "$COMPATINCLUDES" + echo '#include "openbsd-compat/glob.h"' >$COMPATINCLUDES/glob.h +fi + +ac_fn_check_decl "$LINENO" "VIS_ALL" "ac_cv_have_decl_VIS_ALL" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_VIS_ALL" = xyes +then : + +else $as_nop + +printf "%s\n" "#define BROKEN_STRNVIS 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether struct dirent allocates space for d_name" >&5 +printf %s "checking whether struct dirent allocates space for d_name... " >&6; } +if test "$cross_compiling" = yes +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: assuming BROKEN_ONE_BYTE_DIRENT_D_NAME" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: assuming BROKEN_ONE_BYTE_DIRENT_D_NAME" >&2;} + printf "%s\n" "#define BROKEN_ONE_BYTE_DIRENT_D_NAME 1" >>confdefs.h + + + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +int +main (void) +{ + + struct dirent d; + exit(sizeof(d.d_name)<=sizeof(char)); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +printf "%s\n" "#define BROKEN_ONE_BYTE_DIRENT_D_NAME 1" >>confdefs.h + + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +ac_fn_c_check_member "$LINENO" "struct dirent" "d_type" "ac_cv_member_struct_dirent_d_type" " +#ifdef HAVE_DIRENT_H +#include +#endif + +" +if test "x$ac_cv_member_struct_dirent_d_type" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_TYPE 1" >>confdefs.h + + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for /proc/pid/fd directory" >&5 +printf %s "checking for /proc/pid/fd directory... " >&6; } +if test -d "/proc/$$/fd" ; then + +printf "%s\n" "#define HAVE_PROC_PID 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + +# Check whether user wants to use ldns +LDNS_MSG="no" + +# Check whether --with-ldns was given. +if test ${with_ldns+y} +then : + withval=$with_ldns; + ldns="" + if test "x$withval" = "xyes" ; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ldns-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}ldns-config; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_LDNSCONFIG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $LDNSCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_LDNSCONFIG="$LDNSCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_LDNSCONFIG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +LDNSCONFIG=$ac_cv_path_LDNSCONFIG +if test -n "$LDNSCONFIG"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LDNSCONFIG" >&5 +printf "%s\n" "$LDNSCONFIG" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_LDNSCONFIG"; then + ac_pt_LDNSCONFIG=$LDNSCONFIG + # Extract the first word of "ldns-config", so it can be a program name with args. +set dummy ldns-config; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_ac_pt_LDNSCONFIG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $ac_pt_LDNSCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_LDNSCONFIG="$ac_pt_LDNSCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_LDNSCONFIG="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_LDNSCONFIG=$ac_cv_path_ac_pt_LDNSCONFIG +if test -n "$ac_pt_LDNSCONFIG"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_LDNSCONFIG" >&5 +printf "%s\n" "$ac_pt_LDNSCONFIG" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_pt_LDNSCONFIG" = x; then + LDNSCONFIG="no" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LDNSCONFIG=$ac_pt_LDNSCONFIG + fi +else + LDNSCONFIG="$ac_cv_path_LDNSCONFIG" +fi + + if test "x$LDNSCONFIG" = "xno"; then + LIBS="-lldns $LIBS" + ldns=yes + else + LIBS="$LIBS `$LDNSCONFIG --libs`" + CPPFLAGS="$CPPFLAGS `$LDNSCONFIG --cflags`" + ldns=yes + fi + elif test "x$withval" != "xno" ; then + CPPFLAGS="$CPPFLAGS -I${withval}/include" + LDFLAGS="$LDFLAGS -L${withval}/lib" + LIBS="-lldns $LIBS" + ldns=yes + fi + + # Verify that it works. + if test "x$ldns" = "xyes" ; then + +printf "%s\n" "#define HAVE_LDNS 1" >>confdefs.h + + LDNS_MSG="yes" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ldns support" >&5 +printf %s "checking for ldns support... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#ifdef HAVE_STDINT_H +# include +#endif +#include +int main(void) { ldns_status status = ldns_verify_trusted(NULL, NULL, NULL, NULL); status=LDNS_STATUS_OK; exit(0); } + + +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + as_fn_error $? "** Incomplete or missing ldns libraries." "$LINENO" 5 + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + fi + +fi + + +# Check whether user wants libedit support +LIBEDIT_MSG="no" + +# Check whether --with-libedit was given. +if test ${with_libedit+y} +then : + withval=$with_libedit; if test "x$withval" != "xno" ; then + if test "x$withval" = "xyes" ; then + if test "x$PKGCONFIG" != "xno"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $PKGCONFIG knows about libedit" >&5 +printf %s "checking if $PKGCONFIG knows about libedit... " >&6; } + if "$PKGCONFIG" libedit; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + use_pkgconfig_for_libedit=yes + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + fi + else + CPPFLAGS="$CPPFLAGS -I${withval}/include" + if test -n "${rpath_opt}"; then + LDFLAGS="-L${withval}/lib ${rpath_opt}${withval}/lib ${LDFLAGS}" + else + LDFLAGS="-L${withval}/lib ${LDFLAGS}" + fi + fi + if test "x$use_pkgconfig_for_libedit" = "xyes"; then + LIBEDIT=`$PKGCONFIG --libs libedit` + CPPFLAGS="$CPPFLAGS `$PKGCONFIG --cflags libedit`" + else + LIBEDIT="-ledit -lcurses" + fi + OTHERLIBS=`echo $LIBEDIT | sed 's/-ledit//'` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for el_init in -ledit" >&5 +printf %s "checking for el_init in -ledit... " >&6; } +if test ${ac_cv_lib_edit_el_init+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ledit $OTHERLIBS + $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char el_init (); +int +main (void) +{ +return el_init (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_edit_el_init=yes +else $as_nop + ac_cv_lib_edit_el_init=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_edit_el_init" >&5 +printf "%s\n" "$ac_cv_lib_edit_el_init" >&6; } +if test "x$ac_cv_lib_edit_el_init" = xyes +then : + +printf "%s\n" "#define USE_LIBEDIT 1" >>confdefs.h + + LIBEDIT_MSG="yes" + + +else $as_nop + as_fn_error $? "libedit not found" "$LINENO" 5 +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libedit version is compatible" >&5 +printf %s "checking if libedit version is compatible... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main (void) +{ + + int i = H_SETSIZE; + el_init("", NULL, NULL, NULL); + exit(0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + as_fn_error $? "libedit version is not compatible" "$LINENO" 5 + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + +fi + + +# Check whether user wants wtmpdb support +WTMPDB_MSG="no" + +# Check whether --with-wtmpdb was given. +if test ${with_wtmpdb+y} +then : + withval=$with_wtmpdb; if test "x$withval" != "xno" ; then + if test "x$withval" = "xyes" ; then + if test "x$PKGCONFIG" != "xno"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $PKGCONFIG knows about wtmpdb" >&5 +printf %s "checking if $PKGCONFIG knows about wtmpdb... " >&6; } + if "$PKGCONFIG" libwtmpdb; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + use_pkgconfig_for_libwtmpdb=yes + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + fi + else + CPPFLAGS="$CPPFLAGS -I${withval}/include" + if test -n "${rpath_opt}"; then + LDFLAGS="-L${withval}/lib ${rpath_opt}${withval}/lib ${LDFLAGS}" + else + LDFLAGS="-L${withval}/lib ${LDFLAGS}" + fi + fi + if test "x$use_pkgconfig_for_libwtmpdb" = "xyes"; then + LIBWTMPDB=`$PKGCONFIG --libs libwtmpdb` + CPPFLAGS="$CPPFLAGS `$PKGCONFIG --cflags libwtmpdb`" + else + LIBWTMPDB="-lwtmpdb" + fi + OTHERLIBS=`echo $LIBWTMPDB | sed 's/-lwtmpdb//'` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wtmpdb_login in -lwtmpdb" >&5 +printf %s "checking for wtmpdb_login in -lwtmpdb... " >&6; } +if test ${ac_cv_lib_wtmpdb_wtmpdb_login+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lwtmpdb $OTHERLIBS + $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char wtmpdb_login (); +int +main (void) +{ +return wtmpdb_login (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_wtmpdb_wtmpdb_login=yes +else $as_nop + ac_cv_lib_wtmpdb_wtmpdb_login=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_wtmpdb_wtmpdb_login" >&5 +printf "%s\n" "$ac_cv_lib_wtmpdb_wtmpdb_login" >&6; } +if test "x$ac_cv_lib_wtmpdb_wtmpdb_login" = xyes +then : + +printf "%s\n" "#define USE_WTMPDB 1" >>confdefs.h + + WTMPDB_MSG="yes" + + +else $as_nop + as_fn_error $? "libwtmpdb not found" "$LINENO" 5 +fi + + fi + +fi + + + +AUDIT_MODULE=none + +# Check whether --with-audit was given. +if test ${with_audit+y} +then : + withval=$with_audit; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for supported audit module" >&5 +printf %s "checking for supported audit module... " >&6; } + case "$withval" in + bsm) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: bsm" >&5 +printf "%s\n" "bsm" >&6; } + AUDIT_MODULE=bsm + for ac_header in bsm/audit.h +do : + ac_fn_c_check_header_compile "$LINENO" "bsm/audit.h" "ac_cv_header_bsm_audit_h" " +#ifdef HAVE_TIME_H +# include +#endif + + +" +if test "x$ac_cv_header_bsm_audit_h" = xyes +then : + printf "%s\n" "#define HAVE_BSM_AUDIT_H 1" >>confdefs.h + +else $as_nop + as_fn_error $? "BSM enabled and bsm/audit.h not found" "$LINENO" 5 +fi + +done + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getaudit in -lbsm" >&5 +printf %s "checking for getaudit in -lbsm... " >&6; } +if test ${ac_cv_lib_bsm_getaudit+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char getaudit (); +int +main (void) +{ +return getaudit (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_bsm_getaudit=yes +else $as_nop + ac_cv_lib_bsm_getaudit=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsm_getaudit" >&5 +printf "%s\n" "$ac_cv_lib_bsm_getaudit" >&6; } +if test "x$ac_cv_lib_bsm_getaudit" = xyes +then : + printf "%s\n" "#define HAVE_LIBBSM 1" >>confdefs.h + + LIBS="-lbsm $LIBS" + +else $as_nop + as_fn_error $? "BSM enabled and required library not found" "$LINENO" 5 +fi + + + for ac_func in getaudit +do : + ac_fn_c_check_func "$LINENO" "getaudit" "ac_cv_func_getaudit" +if test "x$ac_cv_func_getaudit" = xyes +then : + printf "%s\n" "#define HAVE_GETAUDIT 1" >>confdefs.h + +else $as_nop + as_fn_error $? "BSM enabled and required function not found" "$LINENO" 5 +fi + +done + # These are optional + ac_fn_c_check_func "$LINENO" "getaudit_addr" "ac_cv_func_getaudit_addr" +if test "x$ac_cv_func_getaudit_addr" = xyes +then : + printf "%s\n" "#define HAVE_GETAUDIT_ADDR 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "aug_get_machine" "ac_cv_func_aug_get_machine" +if test "x$ac_cv_func_aug_get_machine" = xyes +then : + printf "%s\n" "#define HAVE_AUG_GET_MACHINE 1" >>confdefs.h + +fi + + +printf "%s\n" "#define USE_BSM_AUDIT 1" >>confdefs.h + + if test "$sol2ver" -ge 11; then + SSHDLIBS="$SSHDLIBS -lscf" + +printf "%s\n" "#define BROKEN_BSM_API 1" >>confdefs.h + + fi + ;; + linux) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: linux" >&5 +printf "%s\n" "linux" >&6; } + AUDIT_MODULE=linux + ac_fn_c_check_header_compile "$LINENO" "libaudit.h" "ac_cv_header_libaudit_h" "$ac_includes_default" +if test "x$ac_cv_header_libaudit_h" = xyes +then : + printf "%s\n" "#define HAVE_LIBAUDIT_H 1" >>confdefs.h + +fi + + SSHDLIBS="$SSHDLIBS -laudit" + +printf "%s\n" "#define USE_LINUX_AUDIT 1" >>confdefs.h + + ;; + debug) + AUDIT_MODULE=debug + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: debug" >&5 +printf "%s\n" "debug" >&6; } + +printf "%s\n" "#define SSH_AUDIT_EVENTS 1" >>confdefs.h + + ;; + no) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + as_fn_error $? "Unknown audit module $withval" "$LINENO" 5 + ;; + esac + +fi + + + +# Check whether --with-pie was given. +if test ${with_pie+y} +then : + withval=$with_pie; + if test "x$withval" = "xno"; then + use_pie=no + fi + if test "x$withval" = "xyes"; then + use_pie=yes + fi + + +fi + +if test "x$use_pie" = "x"; then + use_pie=no +fi +if test "x$use_toolchain_hardening" != "x1" && test "x$use_pie" = "xauto"; then + # Turn off automatic PIE when toolchain hardening is off. + use_pie=no +fi +if test "x$use_pie" = "xauto"; then + # Automatic PIE requires gcc >= 4.x + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gcc >= 4.x" >&5 +printf %s "checking for gcc >= 4.x... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#if !defined(__GNUC__) || __GNUC__ < 4 +#error gcc is too old +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + use_pie=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +if test "x$use_pie" != "xno"; then + SAVED_CFLAGS="$CFLAGS" + SAVED_LDFLAGS="$LDFLAGS" + { + ossh_cache_var=ossh_cv_cflag__fPIE + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports compile flag -fPIE" >&5 +printf %s "checking if $CC supports compile flag -fPIE... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $WERROR -fPIE" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-fPIE" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + CFLAGS="$saved_CFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + CFLAGS="$saved_CFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + CFLAGS="$saved_CFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + { + ossh_cache_var=ossh_cv_ldflag__pie + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $LD supports link flag -pie" >&5 +printf %s "checking if $LD supports link flag -pie... " >&6; } +if eval test \${$ossh_cache_var+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + saved_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $WERROR -pie" + _define_flag="" + test "x$_define_flag" = "x" && _define_flag="-pie" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + +if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null +then + eval "$ossh_cache_var=no" + LDFLAGS="$saved_LDFLAGS" +else + if test "$cross_compiling" = yes +then : + eval "$ossh_cache_var=yes" + LDFLAGS="$saved_LDFLAGS $_define_flag" + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +/* Trivial function to help test for -fzero-call-used-regs */ +int f(int n) {return rand() % n;} +char *f2(char *s, ...) { + char ret[64]; + va_list args; + va_start(args, s); + vsnprintf(ret, sizeof(ret), s, args); + va_end(args); + return strdup(ret); +} +int i; +double d; +const char *f3(int s) { + i = (int)d; + return s ? "good" : "gooder"; +} +int main(int argc, char **argv) { + char b[256], *cp; + const char *s; + /* Some math to catch -ftrapv problems in the toolchain */ + int i = 123 * argc, j = 456 + argc, k = 789 - argc; + float l = i * 2.1; + double m = l / 0.5; + long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + (void)argv; + f(1); + s = f3(f(2)); + snprintf(b, sizeof b, "%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, b, 0) == -1) exit(0); + cp = f2("%d %d %d %f %f %lld %lld %s\n", i,j,k,l,m,n,o,s); + if (write(1, cp, 0) == -1) exit(0); + free(cp); + /* + * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does + * not understand comments and we don't use the "fallthrough" attribute + * that it's looking for. + */ + switch(i){ + case 0: j += i; + /* FALLTHROUGH */ + default: j += k; + } + exit(0); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + eval "$ossh_cache_var=yes" + LDFLAGS="$saved_LDFLAGS $_define_flag" +else $as_nop + eval "$ossh_cache_var='no, fails at run time'" + LDFLAGS="$saved_LDFLAGS" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +else $as_nop + eval "$ossh_cache_var=no" + LDFLAGS="$saved_LDFLAGS" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +eval ac_res=\$$ossh_cache_var + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +} + # We use both -fPIE and -pie or neither. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether both -fPIE and -pie are supported" >&5 +printf %s "checking whether both -fPIE and -pie are supported... " >&6; } + if echo "x $CFLAGS" | grep ' -fPIE' >/dev/null 2>&1 && \ + echo "x $LDFLAGS" | grep ' -pie' >/dev/null 2>&1 ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + CFLAGS="$SAVED_CFLAGS" + LDFLAGS="$SAVED_LDFLAGS" + fi +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -fPIC is accepted" >&5 +printf %s "checking whether -fPIC is accepted... " >&6; } +SAVED_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -fPIC" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + exit(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + PICFLAG="-fPIC"; +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + PICFLAG=""; +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +CFLAGS="$SAVED_CFLAGS" + + +ac_fn_c_check_func "$LINENO" "auth_hostok" "ac_cv_func_auth_hostok" +if test "x$ac_cv_func_auth_hostok" = xyes +then : + printf "%s\n" "#define HAVE_AUTH_HOSTOK 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "auth_timeok" "ac_cv_func_auth_timeok" +if test "x$ac_cv_func_auth_timeok" = xyes +then : + printf "%s\n" "#define HAVE_AUTH_TIMEOK 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "Blowfish_initstate" "ac_cv_func_Blowfish_initstate" +if test "x$ac_cv_func_Blowfish_initstate" = xyes +then : + printf "%s\n" "#define HAVE_BLOWFISH_INITSTATE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "Blowfish_expandstate" "ac_cv_func_Blowfish_expandstate" +if test "x$ac_cv_func_Blowfish_expandstate" = xyes +then : + printf "%s\n" "#define HAVE_BLOWFISH_EXPANDSTATE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "Blowfish_expand0state" "ac_cv_func_Blowfish_expand0state" +if test "x$ac_cv_func_Blowfish_expand0state" = xyes +then : + printf "%s\n" "#define HAVE_BLOWFISH_EXPAND0STATE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "Blowfish_stream2word" "ac_cv_func_Blowfish_stream2word" +if test "x$ac_cv_func_Blowfish_stream2word" = xyes +then : + printf "%s\n" "#define HAVE_BLOWFISH_STREAM2WORD 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "SHA256Update" "ac_cv_func_SHA256Update" +if test "x$ac_cv_func_SHA256Update" = xyes +then : + printf "%s\n" "#define HAVE_SHA256UPDATE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "SHA384Update" "ac_cv_func_SHA384Update" +if test "x$ac_cv_func_SHA384Update" = xyes +then : + printf "%s\n" "#define HAVE_SHA384UPDATE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "SHA512Update" "ac_cv_func_SHA512Update" +if test "x$ac_cv_func_SHA512Update" = xyes +then : + printf "%s\n" "#define HAVE_SHA512UPDATE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "asprintf" "ac_cv_func_asprintf" +if test "x$ac_cv_func_asprintf" = xyes +then : + printf "%s\n" "#define HAVE_ASPRINTF 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "b64_ntop" "ac_cv_func_b64_ntop" +if test "x$ac_cv_func_b64_ntop" = xyes +then : + printf "%s\n" "#define HAVE_B64_NTOP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "__b64_ntop" "ac_cv_func___b64_ntop" +if test "x$ac_cv_func___b64_ntop" = xyes +then : + printf "%s\n" "#define HAVE___B64_NTOP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "b64_pton" "ac_cv_func_b64_pton" +if test "x$ac_cv_func_b64_pton" = xyes +then : + printf "%s\n" "#define HAVE_B64_PTON 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "__b64_pton" "ac_cv_func___b64_pton" +if test "x$ac_cv_func___b64_pton" = xyes +then : + printf "%s\n" "#define HAVE___B64_PTON 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "bcopy" "ac_cv_func_bcopy" +if test "x$ac_cv_func_bcopy" = xyes +then : + printf "%s\n" "#define HAVE_BCOPY 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "bcrypt_pbkdf" "ac_cv_func_bcrypt_pbkdf" +if test "x$ac_cv_func_bcrypt_pbkdf" = xyes +then : + printf "%s\n" "#define HAVE_BCRYPT_PBKDF 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "bindresvport_sa" "ac_cv_func_bindresvport_sa" +if test "x$ac_cv_func_bindresvport_sa" = xyes +then : + printf "%s\n" "#define HAVE_BINDRESVPORT_SA 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "blf_enc" "ac_cv_func_blf_enc" +if test "x$ac_cv_func_blf_enc" = xyes +then : + printf "%s\n" "#define HAVE_BLF_ENC 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "bzero" "ac_cv_func_bzero" +if test "x$ac_cv_func_bzero" = xyes +then : + printf "%s\n" "#define HAVE_BZERO 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "cap_rights_limit" "ac_cv_func_cap_rights_limit" +if test "x$ac_cv_func_cap_rights_limit" = xyes +then : + printf "%s\n" "#define HAVE_CAP_RIGHTS_LIMIT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "clock" "ac_cv_func_clock" +if test "x$ac_cv_func_clock" = xyes +then : + printf "%s\n" "#define HAVE_CLOCK 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "closefrom" "ac_cv_func_closefrom" +if test "x$ac_cv_func_closefrom" = xyes +then : + printf "%s\n" "#define HAVE_CLOSEFROM 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "close_range" "ac_cv_func_close_range" +if test "x$ac_cv_func_close_range" = xyes +then : + printf "%s\n" "#define HAVE_CLOSE_RANGE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "dirfd" "ac_cv_func_dirfd" +if test "x$ac_cv_func_dirfd" = xyes +then : + printf "%s\n" "#define HAVE_DIRFD 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "endgrent" "ac_cv_func_endgrent" +if test "x$ac_cv_func_endgrent" = xyes +then : + printf "%s\n" "#define HAVE_ENDGRENT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "err" "ac_cv_func_err" +if test "x$ac_cv_func_err" = xyes +then : + printf "%s\n" "#define HAVE_ERR 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "errx" "ac_cv_func_errx" +if test "x$ac_cv_func_errx" = xyes +then : + printf "%s\n" "#define HAVE_ERRX 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "explicit_bzero" "ac_cv_func_explicit_bzero" +if test "x$ac_cv_func_explicit_bzero" = xyes +then : + printf "%s\n" "#define HAVE_EXPLICIT_BZERO 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "explicit_memset" "ac_cv_func_explicit_memset" +if test "x$ac_cv_func_explicit_memset" = xyes +then : + printf "%s\n" "#define HAVE_EXPLICIT_MEMSET 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "fchmod" "ac_cv_func_fchmod" +if test "x$ac_cv_func_fchmod" = xyes +then : + printf "%s\n" "#define HAVE_FCHMOD 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "fchmodat" "ac_cv_func_fchmodat" +if test "x$ac_cv_func_fchmodat" = xyes +then : + printf "%s\n" "#define HAVE_FCHMODAT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "fchown" "ac_cv_func_fchown" +if test "x$ac_cv_func_fchown" = xyes +then : + printf "%s\n" "#define HAVE_FCHOWN 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "fchownat" "ac_cv_func_fchownat" +if test "x$ac_cv_func_fchownat" = xyes +then : + printf "%s\n" "#define HAVE_FCHOWNAT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "flock" "ac_cv_func_flock" +if test "x$ac_cv_func_flock" = xyes +then : + printf "%s\n" "#define HAVE_FLOCK 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "fnmatch" "ac_cv_func_fnmatch" +if test "x$ac_cv_func_fnmatch" = xyes +then : + printf "%s\n" "#define HAVE_FNMATCH 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "freeaddrinfo" "ac_cv_func_freeaddrinfo" +if test "x$ac_cv_func_freeaddrinfo" = xyes +then : + printf "%s\n" "#define HAVE_FREEADDRINFO 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "freezero" "ac_cv_func_freezero" +if test "x$ac_cv_func_freezero" = xyes +then : + printf "%s\n" "#define HAVE_FREEZERO 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "fstatat" "ac_cv_func_fstatat" +if test "x$ac_cv_func_fstatat" = xyes +then : + printf "%s\n" "#define HAVE_FSTATAT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "fstatfs" "ac_cv_func_fstatfs" +if test "x$ac_cv_func_fstatfs" = xyes +then : + printf "%s\n" "#define HAVE_FSTATFS 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "fstatvfs" "ac_cv_func_fstatvfs" +if test "x$ac_cv_func_fstatvfs" = xyes +then : + printf "%s\n" "#define HAVE_FSTATVFS 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "futimes" "ac_cv_func_futimes" +if test "x$ac_cv_func_futimes" = xyes +then : + printf "%s\n" "#define HAVE_FUTIMES 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo" +if test "x$ac_cv_func_getaddrinfo" = xyes +then : + printf "%s\n" "#define HAVE_GETADDRINFO 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd" +if test "x$ac_cv_func_getcwd" = xyes +then : + printf "%s\n" "#define HAVE_GETCWD 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getentropy" "ac_cv_func_getentropy" +if test "x$ac_cv_func_getentropy" = xyes +then : + printf "%s\n" "#define HAVE_GETENTROPY 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getgrouplist" "ac_cv_func_getgrouplist" +if test "x$ac_cv_func_getgrouplist" = xyes +then : + printf "%s\n" "#define HAVE_GETGROUPLIST 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getline" "ac_cv_func_getline" +if test "x$ac_cv_func_getline" = xyes +then : + printf "%s\n" "#define HAVE_GETLINE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getnameinfo" "ac_cv_func_getnameinfo" +if test "x$ac_cv_func_getnameinfo" = xyes +then : + printf "%s\n" "#define HAVE_GETNAMEINFO 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getopt" "ac_cv_func_getopt" +if test "x$ac_cv_func_getopt" = xyes +then : + printf "%s\n" "#define HAVE_GETOPT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getpeereid" "ac_cv_func_getpeereid" +if test "x$ac_cv_func_getpeereid" = xyes +then : + printf "%s\n" "#define HAVE_GETPEEREID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getpeerucred" "ac_cv_func_getpeerucred" +if test "x$ac_cv_func_getpeerucred" = xyes +then : + printf "%s\n" "#define HAVE_GETPEERUCRED 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getpgid" "ac_cv_func_getpgid" +if test "x$ac_cv_func_getpgid" = xyes +then : + printf "%s\n" "#define HAVE_GETPGID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "_getpty" "ac_cv_func__getpty" +if test "x$ac_cv_func__getpty" = xyes +then : + printf "%s\n" "#define HAVE__GETPTY 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getrlimit" "ac_cv_func_getrlimit" +if test "x$ac_cv_func_getrlimit" = xyes +then : + printf "%s\n" "#define HAVE_GETRLIMIT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getrandom" "ac_cv_func_getrandom" +if test "x$ac_cv_func_getrandom" = xyes +then : + printf "%s\n" "#define HAVE_GETRANDOM 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getsid" "ac_cv_func_getsid" +if test "x$ac_cv_func_getsid" = xyes +then : + printf "%s\n" "#define HAVE_GETSID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getttyent" "ac_cv_func_getttyent" +if test "x$ac_cv_func_getttyent" = xyes +then : + printf "%s\n" "#define HAVE_GETTTYENT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "group_from_gid" "ac_cv_func_group_from_gid" +if test "x$ac_cv_func_group_from_gid" = xyes +then : + printf "%s\n" "#define HAVE_GROUP_FROM_GID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "inet_aton" "ac_cv_func_inet_aton" +if test "x$ac_cv_func_inet_aton" = xyes +then : + printf "%s\n" "#define HAVE_INET_ATON 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "inet_ntoa" "ac_cv_func_inet_ntoa" +if test "x$ac_cv_func_inet_ntoa" = xyes +then : + printf "%s\n" "#define HAVE_INET_NTOA 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "inet_ntop" "ac_cv_func_inet_ntop" +if test "x$ac_cv_func_inet_ntop" = xyes +then : + printf "%s\n" "#define HAVE_INET_NTOP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "innetgr" "ac_cv_func_innetgr" +if test "x$ac_cv_func_innetgr" = xyes +then : + printf "%s\n" "#define HAVE_INNETGR 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "killpg" "ac_cv_func_killpg" +if test "x$ac_cv_func_killpg" = xyes +then : + printf "%s\n" "#define HAVE_KILLPG 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "llabs" "ac_cv_func_llabs" +if test "x$ac_cv_func_llabs" = xyes +then : + printf "%s\n" "#define HAVE_LLABS 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "localtime_r" "ac_cv_func_localtime_r" +if test "x$ac_cv_func_localtime_r" = xyes +then : + printf "%s\n" "#define HAVE_LOCALTIME_R 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "login_getcapbool" "ac_cv_func_login_getcapbool" +if test "x$ac_cv_func_login_getcapbool" = xyes +then : + printf "%s\n" "#define HAVE_LOGIN_GETCAPBOOL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "login_getpwclass" "ac_cv_func_login_getpwclass" +if test "x$ac_cv_func_login_getpwclass" = xyes +then : + printf "%s\n" "#define HAVE_LOGIN_GETPWCLASS 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "memmem" "ac_cv_func_memmem" +if test "x$ac_cv_func_memmem" = xyes +then : + printf "%s\n" "#define HAVE_MEMMEM 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove" +if test "x$ac_cv_func_memmove" = xyes +then : + printf "%s\n" "#define HAVE_MEMMOVE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "memset_s" "ac_cv_func_memset_s" +if test "x$ac_cv_func_memset_s" = xyes +then : + printf "%s\n" "#define HAVE_MEMSET_S 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "mkdtemp" "ac_cv_func_mkdtemp" +if test "x$ac_cv_func_mkdtemp" = xyes +then : + printf "%s\n" "#define HAVE_MKDTEMP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" +if test "x$ac_cv_func_mmap" = xyes +then : + printf "%s\n" "#define HAVE_MMAP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "ngetaddrinfo" "ac_cv_func_ngetaddrinfo" +if test "x$ac_cv_func_ngetaddrinfo" = xyes +then : + printf "%s\n" "#define HAVE_NGETADDRINFO 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "nlist" "ac_cv_func_nlist" +if test "x$ac_cv_func_nlist" = xyes +then : + printf "%s\n" "#define HAVE_NLIST 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "nsleep" "ac_cv_func_nsleep" +if test "x$ac_cv_func_nsleep" = xyes +then : + printf "%s\n" "#define HAVE_NSLEEP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "ogetaddrinfo" "ac_cv_func_ogetaddrinfo" +if test "x$ac_cv_func_ogetaddrinfo" = xyes +then : + printf "%s\n" "#define HAVE_OGETADDRINFO 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "openlog_r" "ac_cv_func_openlog_r" +if test "x$ac_cv_func_openlog_r" = xyes +then : + printf "%s\n" "#define HAVE_OPENLOG_R 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "pledge" "ac_cv_func_pledge" +if test "x$ac_cv_func_pledge" = xyes +then : + printf "%s\n" "#define HAVE_PLEDGE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "poll" "ac_cv_func_poll" +if test "x$ac_cv_func_poll" = xyes +then : + printf "%s\n" "#define HAVE_POLL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "ppoll" "ac_cv_func_ppoll" +if test "x$ac_cv_func_ppoll" = xyes +then : + printf "%s\n" "#define HAVE_PPOLL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "prctl" "ac_cv_func_prctl" +if test "x$ac_cv_func_prctl" = xyes +then : + printf "%s\n" "#define HAVE_PRCTL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "procctl" "ac_cv_func_procctl" +if test "x$ac_cv_func_procctl" = xyes +then : + printf "%s\n" "#define HAVE_PROCCTL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "pselect" "ac_cv_func_pselect" +if test "x$ac_cv_func_pselect" = xyes +then : + printf "%s\n" "#define HAVE_PSELECT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "pstat" "ac_cv_func_pstat" +if test "x$ac_cv_func_pstat" = xyes +then : + printf "%s\n" "#define HAVE_PSTAT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "raise" "ac_cv_func_raise" +if test "x$ac_cv_func_raise" = xyes +then : + printf "%s\n" "#define HAVE_RAISE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "readpassphrase" "ac_cv_func_readpassphrase" +if test "x$ac_cv_func_readpassphrase" = xyes +then : + printf "%s\n" "#define HAVE_READPASSPHRASE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "reallocarray" "ac_cv_func_reallocarray" +if test "x$ac_cv_func_reallocarray" = xyes +then : + printf "%s\n" "#define HAVE_REALLOCARRAY 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "realpath" "ac_cv_func_realpath" +if test "x$ac_cv_func_realpath" = xyes +then : + printf "%s\n" "#define HAVE_REALPATH 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "recvmsg" "ac_cv_func_recvmsg" +if test "x$ac_cv_func_recvmsg" = xyes +then : + printf "%s\n" "#define HAVE_RECVMSG 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "recallocarray" "ac_cv_func_recallocarray" +if test "x$ac_cv_func_recallocarray" = xyes +then : + printf "%s\n" "#define HAVE_RECALLOCARRAY 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "rresvport_af" "ac_cv_func_rresvport_af" +if test "x$ac_cv_func_rresvport_af" = xyes +then : + printf "%s\n" "#define HAVE_RRESVPORT_AF 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "sendmsg" "ac_cv_func_sendmsg" +if test "x$ac_cv_func_sendmsg" = xyes +then : + printf "%s\n" "#define HAVE_SENDMSG 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setdtablesize" "ac_cv_func_setdtablesize" +if test "x$ac_cv_func_setdtablesize" = xyes +then : + printf "%s\n" "#define HAVE_SETDTABLESIZE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setegid" "ac_cv_func_setegid" +if test "x$ac_cv_func_setegid" = xyes +then : + printf "%s\n" "#define HAVE_SETEGID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setenv" "ac_cv_func_setenv" +if test "x$ac_cv_func_setenv" = xyes +then : + printf "%s\n" "#define HAVE_SETENV 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "seteuid" "ac_cv_func_seteuid" +if test "x$ac_cv_func_seteuid" = xyes +then : + printf "%s\n" "#define HAVE_SETEUID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setgroupent" "ac_cv_func_setgroupent" +if test "x$ac_cv_func_setgroupent" = xyes +then : + printf "%s\n" "#define HAVE_SETGROUPENT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setgroups" "ac_cv_func_setgroups" +if test "x$ac_cv_func_setgroups" = xyes +then : + printf "%s\n" "#define HAVE_SETGROUPS 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setlinebuf" "ac_cv_func_setlinebuf" +if test "x$ac_cv_func_setlinebuf" = xyes +then : + printf "%s\n" "#define HAVE_SETLINEBUF 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setlogin" "ac_cv_func_setlogin" +if test "x$ac_cv_func_setlogin" = xyes +then : + printf "%s\n" "#define HAVE_SETLOGIN 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setpassent" "ac_cv_func_setpassent" +if test "x$ac_cv_func_setpassent" = xyes +then : + printf "%s\n" "#define HAVE_SETPASSENT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setpcred" "ac_cv_func_setpcred" +if test "x$ac_cv_func_setpcred" = xyes +then : + printf "%s\n" "#define HAVE_SETPCRED 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setproctitle" "ac_cv_func_setproctitle" +if test "x$ac_cv_func_setproctitle" = xyes +then : + printf "%s\n" "#define HAVE_SETPROCTITLE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setregid" "ac_cv_func_setregid" +if test "x$ac_cv_func_setregid" = xyes +then : + printf "%s\n" "#define HAVE_SETREGID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setreuid" "ac_cv_func_setreuid" +if test "x$ac_cv_func_setreuid" = xyes +then : + printf "%s\n" "#define HAVE_SETREUID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setrlimit" "ac_cv_func_setrlimit" +if test "x$ac_cv_func_setrlimit" = xyes +then : + printf "%s\n" "#define HAVE_SETRLIMIT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setsid" "ac_cv_func_setsid" +if test "x$ac_cv_func_setsid" = xyes +then : + printf "%s\n" "#define HAVE_SETSID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setvbuf" "ac_cv_func_setvbuf" +if test "x$ac_cv_func_setvbuf" = xyes +then : + printf "%s\n" "#define HAVE_SETVBUF 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "sigaction" "ac_cv_func_sigaction" +if test "x$ac_cv_func_sigaction" = xyes +then : + printf "%s\n" "#define HAVE_SIGACTION 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "sigvec" "ac_cv_func_sigvec" +if test "x$ac_cv_func_sigvec" = xyes +then : + printf "%s\n" "#define HAVE_SIGVEC 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf" +if test "x$ac_cv_func_snprintf" = xyes +then : + printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "socketpair" "ac_cv_func_socketpair" +if test "x$ac_cv_func_socketpair" = xyes +then : + printf "%s\n" "#define HAVE_SOCKETPAIR 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "statfs" "ac_cv_func_statfs" +if test "x$ac_cv_func_statfs" = xyes +then : + printf "%s\n" "#define HAVE_STATFS 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "statvfs" "ac_cv_func_statvfs" +if test "x$ac_cv_func_statvfs" = xyes +then : + printf "%s\n" "#define HAVE_STATVFS 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strcasestr" "ac_cv_func_strcasestr" +if test "x$ac_cv_func_strcasestr" = xyes +then : + printf "%s\n" "#define HAVE_STRCASESTR 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup" +if test "x$ac_cv_func_strdup" = xyes +then : + printf "%s\n" "#define HAVE_STRDUP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror" +if test "x$ac_cv_func_strerror" = xyes +then : + printf "%s\n" "#define HAVE_STRERROR 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strlcat" "ac_cv_func_strlcat" +if test "x$ac_cv_func_strlcat" = xyes +then : + printf "%s\n" "#define HAVE_STRLCAT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strlcpy" "ac_cv_func_strlcpy" +if test "x$ac_cv_func_strlcpy" = xyes +then : + printf "%s\n" "#define HAVE_STRLCPY 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strmode" "ac_cv_func_strmode" +if test "x$ac_cv_func_strmode" = xyes +then : + printf "%s\n" "#define HAVE_STRMODE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strndup" "ac_cv_func_strndup" +if test "x$ac_cv_func_strndup" = xyes +then : + printf "%s\n" "#define HAVE_STRNDUP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strnlen" "ac_cv_func_strnlen" +if test "x$ac_cv_func_strnlen" = xyes +then : + printf "%s\n" "#define HAVE_STRNLEN 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strnvis" "ac_cv_func_strnvis" +if test "x$ac_cv_func_strnvis" = xyes +then : + printf "%s\n" "#define HAVE_STRNVIS 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strptime" "ac_cv_func_strptime" +if test "x$ac_cv_func_strptime" = xyes +then : + printf "%s\n" "#define HAVE_STRPTIME 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strsignal" "ac_cv_func_strsignal" +if test "x$ac_cv_func_strsignal" = xyes +then : + printf "%s\n" "#define HAVE_STRSIGNAL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strtonum" "ac_cv_func_strtonum" +if test "x$ac_cv_func_strtonum" = xyes +then : + printf "%s\n" "#define HAVE_STRTONUM 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strtoll" "ac_cv_func_strtoll" +if test "x$ac_cv_func_strtoll" = xyes +then : + printf "%s\n" "#define HAVE_STRTOLL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strtoul" "ac_cv_func_strtoul" +if test "x$ac_cv_func_strtoul" = xyes +then : + printf "%s\n" "#define HAVE_STRTOUL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "strtoull" "ac_cv_func_strtoull" +if test "x$ac_cv_func_strtoull" = xyes +then : + printf "%s\n" "#define HAVE_STRTOULL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "sysconf" "ac_cv_func_sysconf" +if test "x$ac_cv_func_sysconf" = xyes +then : + printf "%s\n" "#define HAVE_SYSCONF 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "tcgetpgrp" "ac_cv_func_tcgetpgrp" +if test "x$ac_cv_func_tcgetpgrp" = xyes +then : + printf "%s\n" "#define HAVE_TCGETPGRP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "timegm" "ac_cv_func_timegm" +if test "x$ac_cv_func_timegm" = xyes +then : + printf "%s\n" "#define HAVE_TIMEGM 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "timingsafe_bcmp" "ac_cv_func_timingsafe_bcmp" +if test "x$ac_cv_func_timingsafe_bcmp" = xyes +then : + printf "%s\n" "#define HAVE_TIMINGSAFE_BCMP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "truncate" "ac_cv_func_truncate" +if test "x$ac_cv_func_truncate" = xyes +then : + printf "%s\n" "#define HAVE_TRUNCATE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "unlinkat" "ac_cv_func_unlinkat" +if test "x$ac_cv_func_unlinkat" = xyes +then : + printf "%s\n" "#define HAVE_UNLINKAT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "unsetenv" "ac_cv_func_unsetenv" +if test "x$ac_cv_func_unsetenv" = xyes +then : + printf "%s\n" "#define HAVE_UNSETENV 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "unveil" "ac_cv_func_unveil" +if test "x$ac_cv_func_unveil" = xyes +then : + printf "%s\n" "#define HAVE_UNVEIL 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "updwtmpx" "ac_cv_func_updwtmpx" +if test "x$ac_cv_func_updwtmpx" = xyes +then : + printf "%s\n" "#define HAVE_UPDWTMPX 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "utimensat" "ac_cv_func_utimensat" +if test "x$ac_cv_func_utimensat" = xyes +then : + printf "%s\n" "#define HAVE_UTIMENSAT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "user_from_uid" "ac_cv_func_user_from_uid" +if test "x$ac_cv_func_user_from_uid" = xyes +then : + printf "%s\n" "#define HAVE_USER_FROM_UID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "usleep" "ac_cv_func_usleep" +if test "x$ac_cv_func_usleep" = xyes +then : + printf "%s\n" "#define HAVE_USLEEP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf" +if test "x$ac_cv_func_vasprintf" = xyes +then : + printf "%s\n" "#define HAVE_VASPRINTF 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" +if test "x$ac_cv_func_vsnprintf" = xyes +then : + printf "%s\n" "#define HAVE_VSNPRINTF 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "waitpid" "ac_cv_func_waitpid" +if test "x$ac_cv_func_waitpid" = xyes +then : + printf "%s\n" "#define HAVE_WAITPID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "warn" "ac_cv_func_warn" +if test "x$ac_cv_func_warn" = xyes +then : + printf "%s\n" "#define HAVE_WARN 1" >>confdefs.h + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compiler supports __builtin_popcount" >&5 +printf %s "checking whether compiler supports __builtin_popcount... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main (void) +{ + int x = 123, y; + y = __builtin_popcount(123); + exit(y == 6 ? 0 : -1); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +printf "%s\n" "#define MISSING_BUILTIN_POPCOUNT 1" >>confdefs.h + + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +ac_fn_check_decl "$LINENO" "bzero" "ac_cv_have_decl_bzero" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_bzero" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_BZERO $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "memmem" "ac_cv_have_decl_memmem" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_memmem" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_MEMMEM $ac_have_decl" >>confdefs.h + + +ac_fn_c_check_func "$LINENO" "mblen" "ac_cv_func_mblen" +if test "x$ac_cv_func_mblen" = xyes +then : + printf "%s\n" "#define HAVE_MBLEN 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "mbtowc" "ac_cv_func_mbtowc" +if test "x$ac_cv_func_mbtowc" = xyes +then : + printf "%s\n" "#define HAVE_MBTOWC 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "nl_langinfo" "ac_cv_func_nl_langinfo" +if test "x$ac_cv_func_nl_langinfo" = xyes +then : + printf "%s\n" "#define HAVE_NL_LANGINFO 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "wcwidth" "ac_cv_func_wcwidth" +if test "x$ac_cv_func_wcwidth" = xyes +then : + printf "%s\n" "#define HAVE_WCWIDTH 1" >>confdefs.h + +fi + + +TEST_SSH_UTF8=${TEST_SSH_UTF8:=yes} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for utf8 locale support" >&5 +printf %s "checking for utf8 locale support... " >&6; } +if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: assuming yes" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: assuming yes" >&2;} + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main (void) +{ + + char *loc = setlocale(LC_CTYPE, "en_US.UTF-8"); + if (loc != NULL) + exit(0); + exit(1); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + TEST_SSH_UTF8=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + return (isblank('a')); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + +printf "%s\n" "#define HAVE_ISBLANK 1" >>confdefs.h + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +disable_pkcs11= +# Check whether --enable-pkcs11 was given. +if test ${enable_pkcs11+y} +then : + enableval=$enable_pkcs11; + if test "x$enableval" = "xno" ; then + disable_pkcs11=1 + fi + + +fi + + +disable_sk= +# Check whether --enable-security-key was given. +if test ${enable_security_key+y} +then : + enableval=$enable_security_key; + if test "x$enableval" = "xno" ; then + disable_sk=1 + fi + + +fi + +enable_sk_internal= + +# Check whether --with-security-key-builtin was given. +if test ${with_security_key_builtin+y} +then : + withval=$with_security_key_builtin; enable_sk_internal=$withval + +fi + + +enable_sk_standalone= + +# Check whether --with-security-key-standalone was given. +if test ${with_security_key_standalone+y} +then : + withval=$with_security_key_standalone; enable_sk_standalone=$withval + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 +printf %s "checking for library containing dlopen... " >&6; } +if test ${ac_cv_search_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +for ac_lib in '' dl +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_dlopen=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_dlopen+y} +then : + break +fi +done +if test ${ac_cv_search_dlopen+y} +then : + +else $as_nop + ac_cv_search_dlopen=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 +printf "%s\n" "$ac_cv_search_dlopen" >&6; } +ac_res=$ac_cv_search_dlopen +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes +then : + printf "%s\n" "#define HAVE_DLOPEN 1" >>confdefs.h + +fi + +ac_fn_check_decl "$LINENO" "RTLD_NOW" "ac_cv_have_decl_RTLD_NOW" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_RTLD_NOW" = xyes +then : + +fi + +# IRIX has a const char return value for gai_strerror() + + for ac_func in gai_strerror +do : + ac_fn_c_check_func "$LINENO" "gai_strerror" "ac_cv_func_gai_strerror" +if test "x$ac_cv_func_gai_strerror" = xyes +then : + printf "%s\n" "#define HAVE_GAI_STRERROR 1" >>confdefs.h + + printf "%s\n" "#define HAVE_GAI_STRERROR 1" >>confdefs.h + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +const char *gai_strerror(int); + +int +main (void) +{ + + char *str; + str = gai_strerror(0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + +printf "%s\n" "#define HAVE_CONST_GAI_STRERROR_PROTO 1" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing nanosleep" >&5 +printf %s "checking for library containing nanosleep... " >&6; } +if test ${ac_cv_search_nanosleep+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char nanosleep (); +int +main (void) +{ +return nanosleep (); + ; + return 0; +} +_ACEOF +for ac_lib in '' rt posix4 +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_nanosleep=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_nanosleep+y} +then : + break +fi +done +if test ${ac_cv_search_nanosleep+y} +then : + +else $as_nop + ac_cv_search_nanosleep=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_nanosleep" >&5 +printf "%s\n" "$ac_cv_search_nanosleep" >&6; } +ac_res=$ac_cv_search_nanosleep +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +printf "%s\n" "#define HAVE_NANOSLEEP 1" >>confdefs.h + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 +printf %s "checking for library containing clock_gettime... " >&6; } +if test ${ac_cv_search_clock_gettime+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char clock_gettime (); +int +main (void) +{ +return clock_gettime (); + ; + return 0; +} +_ACEOF +for ac_lib in '' rt +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_clock_gettime=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_clock_gettime+y} +then : + break +fi +done +if test ${ac_cv_search_clock_gettime+y} +then : + +else $as_nop + ac_cv_search_clock_gettime=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 +printf "%s\n" "$ac_cv_search_clock_gettime" >&6; } +ac_res=$ac_cv_search_clock_gettime +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +printf "%s\n" "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h + +fi + + +ac_fn_check_decl "$LINENO" "localtime_r" "ac_cv_have_decl_localtime_r" " #include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_localtime_r" = xyes +then : + +else $as_nop + saved_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -D_REENTRANT" + unset ac_cv_have_decl_localtime_r + ac_fn_check_decl "$LINENO" "localtime_r" "ac_cv_have_decl_localtime_r" " #include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_localtime_r" = xyes +then : + +else $as_nop + CPPFLAGS="$saved_CPPFLAGS" +fi + +fi + +ac_fn_check_decl "$LINENO" "strsep" "ac_cv_have_decl_strsep" " +#ifdef HAVE_STRING_H +# include +#endif + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_strsep" = xyes +then : + ac_fn_c_check_func "$LINENO" "strsep" "ac_cv_func_strsep" +if test "x$ac_cv_func_strsep" = xyes +then : + printf "%s\n" "#define HAVE_STRSEP 1" >>confdefs.h + +fi + +fi + +ac_fn_check_decl "$LINENO" "tcsendbreak" "ac_cv_have_decl_tcsendbreak" "#include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_tcsendbreak" = xyes +then : + printf "%s\n" "#define HAVE_TCSENDBREAK 1" >>confdefs.h + +else $as_nop + ac_fn_c_check_func "$LINENO" "tcsendbreak" "ac_cv_func_tcsendbreak" +if test "x$ac_cv_func_tcsendbreak" = xyes +then : + printf "%s\n" "#define HAVE_TCSENDBREAK 1" >>confdefs.h + +fi + +fi + +ac_fn_check_decl "$LINENO" "h_errno" "ac_cv_have_decl_h_errno" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_h_errno" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_H_ERRNO $ac_have_decl" >>confdefs.h + + +ac_fn_check_decl "$LINENO" "SHUT_RD" "ac_cv_have_decl_SHUT_RD" " +#include +#include +#include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_SHUT_RD" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_SHUT_RD $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "getpeereid" "ac_cv_have_decl_getpeereid" " +#include +#include +#include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_getpeereid" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_GETPEEREID $ac_have_decl" >>confdefs.h + + +ac_fn_check_decl "$LINENO" "O_NONBLOCK" "ac_cv_have_decl_O_NONBLOCK" " +#include +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef HAVE_FCNTL_H +# include +#endif + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_O_NONBLOCK" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_O_NONBLOCK $ac_have_decl" >>confdefs.h + + +ac_fn_check_decl "$LINENO" "ftruncate" "ac_cv_have_decl_ftruncate" " +#include +#include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_ftruncate" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_FTRUNCATE $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "getentropy" "ac_cv_have_decl_getentropy" " +#include +#include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_getentropy" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_GETENTROPY $ac_have_decl" >>confdefs.h + + +ac_fn_check_decl "$LINENO" "readv" "ac_cv_have_decl_readv" " +#include +#include +#include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_readv" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_READV $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "writev" "ac_cv_have_decl_writev" " +#include +#include +#include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_writev" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_WRITEV $ac_have_decl" >>confdefs.h + + +ac_fn_check_decl "$LINENO" "MAXSYMLINKS" "ac_cv_have_decl_MAXSYMLINKS" " +#include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_MAXSYMLINKS" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_MAXSYMLINKS $ac_have_decl" >>confdefs.h + + +ac_fn_check_decl "$LINENO" "offsetof" "ac_cv_have_decl_offsetof" " +#include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_offsetof" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_OFFSETOF $ac_have_decl" >>confdefs.h + + +ac_fn_check_decl "$LINENO" "INFINITY" "ac_cv_have_decl_INFINITY" "#include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_INFINITY" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_INFINITY $ac_have_decl" >>confdefs.h +if test $ac_have_decl = 1 +then : + +else $as_nop + ac_fn_check_decl "$LINENO" "__builtin_inff" "ac_cv_have_decl___builtin_inff" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl___builtin_inff" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL___BUILTIN_INFF $ac_have_decl" >>confdefs.h + +fi + + +# extra bits for select(2) +ac_fn_check_decl "$LINENO" "howmany" "ac_cv_have_decl_howmany" " +#include +#include +#ifdef HAVE_SYS_SYSMACROS_H +#include +#endif +#ifdef HAVE_SYS_SELECT_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_howmany" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_HOWMANY $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "NFDBITS" "ac_cv_have_decl_NFDBITS" " +#include +#include +#ifdef HAVE_SYS_SYSMACROS_H +#include +#endif +#ifdef HAVE_SYS_SELECT_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_NFDBITS" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_NFDBITS $ac_have_decl" >>confdefs.h + +ac_fn_c_check_type "$LINENO" "fd_mask" "ac_cv_type_fd_mask" " +#include +#include +#ifdef HAVE_SYS_SELECT_H +#include +#endif +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +" +if test "x$ac_cv_type_fd_mask" = xyes +then : + +printf "%s\n" "#define HAVE_FD_MASK 1" >>confdefs.h + + +fi + + + + for ac_func in setresuid +do : + ac_fn_c_check_func "$LINENO" "setresuid" "ac_cv_func_setresuid" +if test "x$ac_cv_func_setresuid" = xyes +then : + printf "%s\n" "#define HAVE_SETRESUID 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if setresuid seems to work" >&5 +printf %s "checking if setresuid seems to work... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: not checking setresuid" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: not checking setresuid" >&2;} + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +int +main (void) +{ + + errno=0; + setresuid(0,0,0); + if (errno==ENOSYS) + exit(1); + else + exit(0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + +printf "%s\n" "#define BROKEN_SETRESUID 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not implemented" >&5 +printf "%s\n" "not implemented" >&6; } +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi + +done + + + for ac_func in setresgid +do : + ac_fn_c_check_func "$LINENO" "setresgid" "ac_cv_func_setresgid" +if test "x$ac_cv_func_setresgid" = xyes +then : + printf "%s\n" "#define HAVE_SETRESGID 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if setresgid seems to work" >&5 +printf %s "checking if setresgid seems to work... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: not checking setresuid" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: not checking setresuid" >&2;} + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +int +main (void) +{ + + errno=0; + setresgid(0,0,0); + if (errno==ENOSYS) + exit(1); + else + exit(0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + +printf "%s\n" "#define BROKEN_SETRESGID 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not implemented" >&5 +printf "%s\n" "not implemented" >&6; } +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +fi + +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working fflush(NULL)" >&5 +printf %s "checking for working fflush(NULL)... " >&6; } +if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: assuming working" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: assuming working" >&2;} + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main (void) +{ +fflush(NULL); exit(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +printf "%s\n" "#define FFLUSH_NULL_BUG 1" >>confdefs.h + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +if test "x$ac_cv_func_gettimeofday" = xyes +then : + printf "%s\n" "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "time" "ac_cv_func_time" +if test "x$ac_cv_func_time" = xyes +then : + printf "%s\n" "#define HAVE_TIME 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "endutent" "ac_cv_func_endutent" +if test "x$ac_cv_func_endutent" = xyes +then : + printf "%s\n" "#define HAVE_ENDUTENT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getutent" "ac_cv_func_getutent" +if test "x$ac_cv_func_getutent" = xyes +then : + printf "%s\n" "#define HAVE_GETUTENT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getutid" "ac_cv_func_getutid" +if test "x$ac_cv_func_getutid" = xyes +then : + printf "%s\n" "#define HAVE_GETUTID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getutline" "ac_cv_func_getutline" +if test "x$ac_cv_func_getutline" = xyes +then : + printf "%s\n" "#define HAVE_GETUTLINE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "pututline" "ac_cv_func_pututline" +if test "x$ac_cv_func_pututline" = xyes +then : + printf "%s\n" "#define HAVE_PUTUTLINE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setutent" "ac_cv_func_setutent" +if test "x$ac_cv_func_setutent" = xyes +then : + printf "%s\n" "#define HAVE_SETUTENT 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "utmpname" "ac_cv_func_utmpname" +if test "x$ac_cv_func_utmpname" = xyes +then : + printf "%s\n" "#define HAVE_UTMPNAME 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "endutxent" "ac_cv_func_endutxent" +if test "x$ac_cv_func_endutxent" = xyes +then : + printf "%s\n" "#define HAVE_ENDUTXENT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getutxent" "ac_cv_func_getutxent" +if test "x$ac_cv_func_getutxent" = xyes +then : + printf "%s\n" "#define HAVE_GETUTXENT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getutxid" "ac_cv_func_getutxid" +if test "x$ac_cv_func_getutxid" = xyes +then : + printf "%s\n" "#define HAVE_GETUTXID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getutxline" "ac_cv_func_getutxline" +if test "x$ac_cv_func_getutxline" = xyes +then : + printf "%s\n" "#define HAVE_GETUTXLINE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "getutxuser" "ac_cv_func_getutxuser" +if test "x$ac_cv_func_getutxuser" = xyes +then : + printf "%s\n" "#define HAVE_GETUTXUSER 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "pututxline" "ac_cv_func_pututxline" +if test "x$ac_cv_func_pututxline" = xyes +then : + printf "%s\n" "#define HAVE_PUTUTXLINE 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "setutxdb" "ac_cv_func_setutxdb" +if test "x$ac_cv_func_setutxdb" = xyes +then : + printf "%s\n" "#define HAVE_SETUTXDB 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setutxent" "ac_cv_func_setutxent" +if test "x$ac_cv_func_setutxent" = xyes +then : + printf "%s\n" "#define HAVE_SETUTXENT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "utmpxname" "ac_cv_func_utmpxname" +if test "x$ac_cv_func_utmpxname" = xyes +then : + printf "%s\n" "#define HAVE_UTMPXNAME 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "getlastlogxbyname" "ac_cv_func_getlastlogxbyname" +if test "x$ac_cv_func_getlastlogxbyname" = xyes +then : + printf "%s\n" "#define HAVE_GETLASTLOGXBYNAME 1" >>confdefs.h + +fi + + +ac_fn_c_check_func "$LINENO" "daemon" "ac_cv_func_daemon" +if test "x$ac_cv_func_daemon" = xyes +then : + +printf "%s\n" "#define HAVE_DAEMON 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for daemon in -lbsd" >&5 +printf %s "checking for daemon in -lbsd... " >&6; } +if test ${ac_cv_lib_bsd_daemon+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char daemon (); +int +main (void) +{ +return daemon (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_bsd_daemon=yes +else $as_nop + ac_cv_lib_bsd_daemon=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_daemon" >&5 +printf "%s\n" "$ac_cv_lib_bsd_daemon" >&6; } +if test "x$ac_cv_lib_bsd_daemon" = xyes +then : + LIBS="$LIBS -lbsd"; printf "%s\n" "#define HAVE_DAEMON 1" >>confdefs.h + +fi + + +fi + + +ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" +if test "x$ac_cv_func_getpagesize" = xyes +then : + +printf "%s\n" "#define HAVE_GETPAGESIZE 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getpagesize in -lucb" >&5 +printf %s "checking for getpagesize in -lucb... " >&6; } +if test ${ac_cv_lib_ucb_getpagesize+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lucb $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char getpagesize (); +int +main (void) +{ +return getpagesize (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_ucb_getpagesize=yes +else $as_nop + ac_cv_lib_ucb_getpagesize=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ucb_getpagesize" >&5 +printf "%s\n" "$ac_cv_lib_ucb_getpagesize" >&6; } +if test "x$ac_cv_lib_ucb_getpagesize" = xyes +then : + LIBS="$LIBS -lucb"; printf "%s\n" "#define HAVE_GETPAGESIZE 1" >>confdefs.h + +fi + + +fi + + +# Check for broken snprintf +if test "x$ac_cv_func_snprintf" = "xyes" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf correctly terminates long strings" >&5 +printf %s "checking whether snprintf correctly terminates long strings... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: Assuming working snprintf()" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: Assuming working snprintf()" >&2;} + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main (void) +{ + + char b[5]; + snprintf(b,5,"123456789"); + exit(b[4]!='\0'); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +printf "%s\n" "#define BROKEN_SNPRINTF 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ****** Your snprintf() function is broken, complain to your vendor" >&5 +printf "%s\n" "$as_me: WARNING: ****** Your snprintf() function is broken, complain to your vendor" >&2;} + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +if test "x$ac_cv_func_snprintf" = "xyes" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf understands %zu" >&5 +printf %s "checking whether snprintf understands %zu... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: Assuming working snprintf()" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: Assuming working snprintf()" >&2;} + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include + +int +main (void) +{ + + size_t a = 1, b = 2; + char z[128]; + snprintf(z, sizeof z, "%zu%zu", a, b); + exit(strcmp(z, "12")); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +printf "%s\n" "#define BROKEN_SNPRINTF 1" >>confdefs.h + + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +# We depend on vsnprintf returning the right thing on overflow: the +# number of characters it tried to create (as per SUSv3) +if test "x$ac_cv_func_vsnprintf" = "xyes" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether vsnprintf returns correct values on overflow" >&5 +printf %s "checking whether vsnprintf returns correct values on overflow... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: Assuming working vsnprintf()" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: Assuming working vsnprintf()" >&2;} + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +int x_snprintf(char *str, size_t count, const char *fmt, ...) +{ + size_t ret; + va_list ap; + + va_start(ap, fmt); + ret = vsnprintf(str, count, fmt, ap); + va_end(ap); + return ret; +} + +int +main (void) +{ + +char x[1]; +if (x_snprintf(x, 1, "%s %d", "hello", 12345) != 11) + return 1; +if (x_snprintf(NULL, 0, "%s %d", "hello", 12345) != 11) + return 1; +return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +printf "%s\n" "#define BROKEN_SNPRINTF 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ****** Your vsnprintf() function is broken, complain to your vendor" >&5 +printf "%s\n" "$as_me: WARNING: ****** Your vsnprintf() function is broken, complain to your vendor" >&2;} + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +# On systems where [v]snprintf is broken, but is declared in stdio, +# check that the fmt argument is const char * or just char *. +# This is only useful for when BROKEN_SNPRINTF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf can declare const char *fmt" >&5 +printf %s "checking whether snprintf can declare const char *fmt... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef _FORTIFY_SOURCE +#undef _FORTIFY_SOURCE +#endif +#include +int snprintf(char *a, size_t b, const char *c, ...) { return 0; } + +int +main (void) +{ + + snprintf(0, 0, 0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define SNPRINTF_CONST const" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + printf "%s\n" "#define SNPRINTF_CONST /* not const */" >>confdefs.h + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +# Check for missing getpeereid (or equiv) support +NO_PEERCHECK="" +if test "x$ac_cv_func_getpeereid" != "xyes" -a "x$ac_cv_func_getpeerucred" != "xyes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether system supports SO_PEERCRED getsockopt" >&5 +printf %s "checking whether system supports SO_PEERCRED getsockopt... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +int +main (void) +{ +int i = SO_PEERCRED; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define HAVE_SO_PEERCRED 1" >>confdefs.h + + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + NO_PEERCHECK=1 + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +if test ! -z "$check_for_openpty_ctty_bug"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if openpty correctly handles controlling tty" >&5 +printf %s "checking if openpty correctly handles controlling tty... " >&6; } + if test "$cross_compiling" = yes +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cross-compiling, assuming yes" >&5 +printf "%s\n" "cross-compiling, assuming yes" >&6; } + + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#ifdef HAVE_PTY_H +# include +#endif +#include +#include +#include + +int +main (void) +{ + + pid_t pid; + int fd, ptyfd, ttyfd, status; + + pid = fork(); + if (pid < 0) { /* failed */ + exit(1); + } else if (pid > 0) { /* parent */ + waitpid(pid, &status, 0); + if (WIFEXITED(status)) + exit(WEXITSTATUS(status)); + else + exit(2); + } else { /* child */ + close(0); close(1); close(2); + setsid(); + openpty(&ptyfd, &ttyfd, NULL, NULL, NULL); + fd = open("/dev/tty", O_RDWR | O_NOCTTY); + if (fd >= 0) + exit(3); /* Acquired ctty: broken */ + else + exit(0); /* Did not acquire ctty: OK */ + } + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + printf "%s\n" "#define SSHD_ACQUIRES_CTTY 1" >>confdefs.h + + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +if test "x$ac_cv_func_getaddrinfo" = "xyes" && \ + test "x$check_for_hpux_broken_getaddrinfo" = "x1"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if getaddrinfo seems to work" >&5 +printf %s "checking if getaddrinfo seems to work... " >&6; } + if test "$cross_compiling" = yes +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cross-compiling, assuming yes" >&5 +printf "%s\n" "cross-compiling, assuming yes" >&6; } + + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +#include + +#define TEST_PORT "2222" + +int +main (void) +{ + + int err, sock; + struct addrinfo *gai_ai, *ai, hints; + char ntop[NI_MAXHOST], strport[NI_MAXSERV], *name = NULL; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_PASSIVE; + + err = getaddrinfo(name, TEST_PORT, &hints, &gai_ai); + if (err != 0) { + fprintf(stderr, "getaddrinfo failed (%s)", gai_strerror(err)); + exit(1); + } + + for (ai = gai_ai; ai != NULL; ai = ai->ai_next) { + if (ai->ai_family != AF_INET6) + continue; + + err = getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop, + sizeof(ntop), strport, sizeof(strport), + NI_NUMERICHOST|NI_NUMERICSERV); + + if (err != 0) { + if (err == EAI_SYSTEM) + perror("getnameinfo EAI_SYSTEM"); + else + fprintf(stderr, "getnameinfo failed: %s\n", + gai_strerror(err)); + exit(2); + } + + sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); + if (sock < 0) + perror("socket"); + if (bind(sock, ai->ai_addr, ai->ai_addrlen) < 0) { + if (errno == EBADF) + exit(3); + } + } + exit(0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + printf "%s\n" "#define BROKEN_GETADDRINFO 1" >>confdefs.h + + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +if test "x$ac_cv_func_getaddrinfo" = "xyes" && \ + test "x$check_for_aix_broken_getaddrinfo" = "x1"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if getaddrinfo seems to work" >&5 +printf %s "checking if getaddrinfo seems to work... " >&6; } + if test "$cross_compiling" = yes +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cross-compiling, assuming no" >&5 +printf "%s\n" "cross-compiling, assuming no" >&6; } + + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +#include + +#define TEST_PORT "2222" + +int +main (void) +{ + + int err, sock; + struct addrinfo *gai_ai, *ai, hints; + char ntop[NI_MAXHOST], strport[NI_MAXSERV], *name = NULL; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_PASSIVE; + + err = getaddrinfo(name, TEST_PORT, &hints, &gai_ai); + if (err != 0) { + fprintf(stderr, "getaddrinfo failed (%s)", gai_strerror(err)); + exit(1); + } + + for (ai = gai_ai; ai != NULL; ai = ai->ai_next) { + if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6) + continue; + + err = getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop, + sizeof(ntop), strport, sizeof(strport), + NI_NUMERICHOST|NI_NUMERICSERV); + + if (ai->ai_family == AF_INET && err != 0) { + perror("getnameinfo"); + exit(2); + } + } + exit(0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define AIX_GETNAMEINFO_HACK 1" >>confdefs.h + + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + printf "%s\n" "#define BROKEN_GETADDRINFO 1" >>confdefs.h + + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +if test "x$ac_cv_func_getaddrinfo" = "xyes"; then + ac_fn_check_decl "$LINENO" "AI_NUMERICSERV" "ac_cv_have_decl_AI_NUMERICSERV" "#include + #include + #include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_AI_NUMERICSERV" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_AI_NUMERICSERV $ac_have_decl" >>confdefs.h + +fi + +if test "x$check_for_conflicting_getspnam" = "x1"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for conflicting getspnam in shadow.h" >&5 +printf %s "checking for conflicting getspnam in shadow.h... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main (void) +{ + exit(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define GETSPNAM_CONFLICTING_DEFS 1" >>confdefs.h + + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +if test "x$ac_cv_func_strnvis" = "xyes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working strnvis" >&5 +printf %s "checking for working strnvis... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: assuming broken" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: assuming broken" >&2;} + +printf "%s\n" "#define BROKEN_STRNVIS 1" >>confdefs.h + + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +static void sighandler(int sig) { _exit(1); } + +int +main (void) +{ + + char dst[16]; + + signal(SIGSEGV, sighandler); + if (strnvis(dst, "src", 4, 0) && strcmp(dst, "src") == 0) + exit(0); + exit(1) + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +printf "%s\n" "#define BROKEN_STRNVIS 1" >>confdefs.h + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if SA_RESTARTed signals interrupt select()" >&5 +printf %s "checking if SA_RESTARTed signals interrupt select()... " >&6; } +if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: assuming yes" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: assuming yes" >&2;} + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef HAVE_SYS_SELECT +# include +#endif +#include +#include +#include +#include +#include +static void sighandler(int sig) { } + +int +main (void) +{ + + int r; + pid_t pid; + struct sigaction sa; + + sa.sa_handler = sighandler; + sa.sa_flags = SA_RESTART; + (void)sigaction(SIGTERM, &sa, NULL); + if ((pid = fork()) == 0) { /* child */ + pid = getppid(); + sleep(1); + kill(pid, SIGTERM); + sleep(1); + if (getppid() == pid) /* if parent did not exit, shoot it */ + kill(pid, SIGKILL); + exit(0); + } else { /* parent */ + r = select(0, NULL, NULL, NULL, NULL); + } + exit(r == -1 ? 0 : 1); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +printf "%s\n" "#define NO_SA_RESTART 1" >>confdefs.h + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + + + for ac_func in getpgrp +do : + ac_fn_c_check_func "$LINENO" "getpgrp" "ac_cv_func_getpgrp" +if test "x$ac_cv_func_getpgrp" = xyes +then : + printf "%s\n" "#define HAVE_GETPGRP 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if getpgrp accepts zero args" >&5 +printf %s "checking if getpgrp accepts zero args... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main (void) +{ + getpgrp(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define GETPGRP_VOID 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +printf "%s\n" "#define GETPGRP_VOID 0" >>confdefs.h + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi + +done + +# Search for OpenSSL +saved_CPPFLAGS="$CPPFLAGS" +saved_LDFLAGS="$LDFLAGS" +openssl_bin_PATH="$PATH" + +# Check whether --with-ssl-dir was given. +if test ${with_ssl_dir+y} +then : + withval=$with_ssl_dir; + if test "x$openssl" = "xno" ; then + as_fn_error $? "cannot use --with-ssl-dir when OpenSSL disabled" "$LINENO" 5 + fi + if test "x$withval" != "xno" ; then + case "$withval" in + # Relative paths + ./*|../*) withval="`pwd`/$withval" + esac + if test -d "$withval/lib"; then + libcrypto_path="${withval}/lib" + elif test -d "$withval/lib64"; then + libcrypto_path="$withval/lib64" + else + # Built but not installed + libcrypto_path="${withval}" + fi + if test -n "${rpath_opt}"; then + LDFLAGS="-L${libcrypto_path} ${rpath_opt}${libcrypto_path} ${LDFLAGS}" + else + LDFLAGS="-L${libcrypto_path} ${LDFLAGS}" + fi + if test -d "$withval/include"; then + CPPFLAGS="-I${withval}/include ${CPPFLAGS}" + else + CPPFLAGS="-I${withval} ${CPPFLAGS}" + fi + if test -x "${withval}/bin/openssl" && \ + "${withval}/bin/openssl" version >/dev/null 2>&1; then + openssl_bin_PATH="${withval}/bin${PATH_SEPARATOR}${PATH}" + elif test -x "${withval}/apps/openssl" && \ + "${withval}/apps/openssl" version >/dev/null 2>&1; then + openssl_bin_PATH="${withval}/apps${PATH_SEPARATOR}${PATH}" + fi + fi + + +fi + +for ac_prog in openssl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_openssl_bin+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $openssl_bin in + [\\/]* | ?:[\\/]*) + ac_cv_path_openssl_bin="$openssl_bin" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $openssl_bin_PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_openssl_bin="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +openssl_bin=$ac_cv_path_openssl_bin +if test -n "$openssl_bin"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $openssl_bin" >&5 +printf "%s\n" "$openssl_bin" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$openssl_bin" && break +done + +OPENSSL_BIN=${openssl_bin} + + + +# Check whether --with-openssl-header-check was given. +if test ${with_openssl_header_check+y} +then : + withval=$with_openssl_header_check; + if test "x$withval" = "xno" ; then + openssl_check_nonfatal=1 + fi + + +fi + + +openssl_engine=no + +# Check whether --with-ssl-engine was given. +if test ${with_ssl_engine+y} +then : + withval=$with_ssl_engine; + if test "x$withval" != "xno" ; then + if test "x$openssl" = "xno" ; then + as_fn_error $? "cannot use --with-ssl-engine when OpenSSL disabled" "$LINENO" 5 + fi + openssl_engine=yes + fi + + +fi + + +nocrypto_saved_LIBS="$LIBS" +if test "x$openssl" = "xyes" ; then + LIBS="-lcrypto $LIBS" + CHANNELLIBS="-lcrypto $CHANNELLIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char RAND_add (); +int +main (void) +{ +return RAND_add (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + +else $as_nop + + # As of early 2026, BoringSSL libcrypto needs -lstdc++ for + # destructors so try that before giving up. + LIBS="$LIBS -lstdc++" + CHANNELLIBS="$CHANNELLIBS -lstdc++" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char RAND_add (); +int +main (void) +{ +return RAND_add (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + +else $as_nop + + as_fn_error $? "*** working libcrypto not found, check config.log" "$LINENO" 5 + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + ac_fn_c_check_header_compile "$LINENO" "openssl/opensslv.h" "ac_cv_header_openssl_opensslv_h" "$ac_includes_default" +if test "x$ac_cv_header_openssl_opensslv_h" = xyes +then : + +else $as_nop + as_fn_error $? "*** OpenSSL headers missing - please install first or check config.log ***" "$LINENO" 5 +fi + + + # Determine OpenSSL header version + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking OpenSSL header version" >&5 +printf %s "checking OpenSSL header version... " >&6; } + if test "$cross_compiling" = yes +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: not checking" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: not checking" >&2;} + + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + #include + #include + #define DATA "conftest.sslincver" + +int +main (void) +{ + + FILE *fd; + int rc; + + fd = fopen(DATA,"w"); + if(fd == NULL) + exit(1); + + if ((rc = fprintf(fd, "%08lx (%s)\n", + (unsigned long)OPENSSL_VERSION_NUMBER, + OPENSSL_VERSION_TEXT)) < 0) + exit(1); + + exit(0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + + ssl_header_ver=`cat conftest.sslincver` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ssl_header_ver" >&5 +printf "%s\n" "$ssl_header_ver" >&6; } + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +printf "%s\n" "failed" >&6; } + as_fn_error $? "OpenSSL version test program failed." "$LINENO" 5 + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + + # Determining OpenSSL library version is version dependent. + ac_fn_c_check_func "$LINENO" "OpenSSL_version" "ac_cv_func_OpenSSL_version" +if test "x$ac_cv_func_OpenSSL_version" = xyes +then : + printf "%s\n" "#define HAVE_OPENSSL_VERSION 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "OpenSSL_version_num" "ac_cv_func_OpenSSL_version_num" +if test "x$ac_cv_func_OpenSSL_version_num" = xyes +then : + printf "%s\n" "#define HAVE_OPENSSL_VERSION_NUM 1" >>confdefs.h + +fi + + + # Determine OpenSSL library version + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking OpenSSL library version" >&5 +printf %s "checking OpenSSL library version... " >&6; } + if test "$cross_compiling" = yes +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: not checking" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: not checking" >&2;} + + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + #include + #include + #include + #define DATA "conftest.ssllibver" + +int +main (void) +{ + + FILE *f; + /* We need these legacy bits to warn for old libcrypto */ + #ifndef OPENSSL_VERSION + # define OPENSSL_VERSION SSLEAY_VERSION + #endif + #ifndef HAVE_OPENSSL_VERSION + # define OpenSSL_version SSLeay_version + #endif + #ifndef HAVE_OPENSSL_VERSION_NUM + # define OpenSSL_version_num SSLeay + #endif + if ((f = fopen(DATA, "w")) == NULL) + exit(1); + if (fprintf(f, "%08lx (%s)", + (unsigned long)OpenSSL_version_num(), + OpenSSL_version(OPENSSL_VERSION)) < 0) + exit(1); +#ifdef LIBRESSL_VERSION_NUMBER + if (fprintf(f, " libressl-%08lx", LIBRESSL_VERSION_NUMBER) < 0) + exit(1); +#endif + if (fputc('\n', f) == EOF || fclose(f) == EOF) + exit(1); + exit(0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + + sslver=`cat conftest.ssllibver` + ssl_showver=`echo "$sslver" | sed 's/ libressl-.*//'` + # Check version is supported. + case "$sslver" in + 100*|10100*) # 1.0.x, 1.1.0x + as_fn_error $? "OpenSSL >= 1.1.1 required (have \"$ssl_showver\")" "$LINENO" 5 + ;; + 101*) ;; # 1.1.x + 200*) # LibreSSL + lver=`echo "$sslver" | sed 's/.*libressl-//'` + case "$lver" in + 2*|300*) # 2.x, 3.0.0 + as_fn_error $? "LibreSSL >= 3.1.0 required (have \"$ssl_showver\")" "$LINENO" 5 + ;; + *) ;; # Assume all other versions are good. + esac + ;; + 30*|40*) + # OpenSSL 3 & 4; we use the 1.1x API + # https://openssl.org/policies/general/versioning-policy.html + CPPFLAGS="$CPPFLAGS -DOPENSSL_API_COMPAT=0x10100000L" + ;; + *) + as_fn_error $? "Unknown/unsupported OpenSSL version (\"$ssl_showver\")" "$LINENO" 5 + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ssl_showver" >&5 +printf "%s\n" "$ssl_showver" >&6; } + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +printf "%s\n" "not found" >&6; } + as_fn_error $? "OpenSSL library not found." "$LINENO" 5 + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + + case "$host" in + x86_64-*) + case "$sslver" in + 3000004*) + as_fn_error $? "OpenSSL 3.0.4 has a potential RCE in its RSA implementation (CVE-2022-2274)" "$LINENO" 5 + ;; + esac + esac + + # Sanity check OpenSSL headers + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether OpenSSL's headers match the library" >&5 +printf %s "checking whether OpenSSL's headers match the library... " >&6; } + if test "$cross_compiling" = yes +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: not checking" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: not checking" >&2;} + + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + #include + #include + +int +main (void) +{ + + exit(OpenSSL_version_num() == OPENSSL_VERSION_NUMBER ? 0 : 1); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + if test "x$openssl_check_nonfatal" = "x"; then + as_fn_error $? "Your OpenSSL headers do not match your + library. Check config.log for details. + If you are sure your installation is consistent, you can disable the check + by running \"./configure --without-openssl-header-check\". + Also see contrib/findssl.sh for help identifying header/library mismatches. + " "$LINENO" 5 + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Your OpenSSL headers do not match your + library. Check config.log for details. + Also see contrib/findssl.sh for help identifying header/library mismatches." >&5 +printf "%s\n" "$as_me: WARNING: Your OpenSSL headers do not match your + library. Check config.log for details. + Also see contrib/findssl.sh for help identifying header/library mismatches." >&2;} + fi + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if programs using OpenSSL functions will link" >&5 +printf %s "checking if programs using OpenSSL functions will link... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + LIBS="$LIBS -ldl" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if programs using OpenSSL need -ldl" >&5 +printf %s "checking if programs using OpenSSL need -ldl... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + CHANNELLIBS="$CHANNELLIBS -ldl" + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + + ac_fn_c_check_func "$LINENO" "BN_is_prime_ex" "ac_cv_func_BN_is_prime_ex" +if test "x$ac_cv_func_BN_is_prime_ex" = xyes +then : + printf "%s\n" "#define HAVE_BN_IS_PRIME_EX 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "DES_crypt" "ac_cv_func_DES_crypt" +if test "x$ac_cv_func_DES_crypt" = xyes +then : + printf "%s\n" "#define HAVE_DES_CRYPT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EVP_DigestSign" "ac_cv_func_EVP_DigestSign" +if test "x$ac_cv_func_EVP_DigestSign" = xyes +then : + printf "%s\n" "#define HAVE_EVP_DIGESTSIGN 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EVP_DigestVerify" "ac_cv_func_EVP_DigestVerify" +if test "x$ac_cv_func_EVP_DigestVerify" = xyes +then : + printf "%s\n" "#define HAVE_EVP_DIGESTVERIFY 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EVP_DigestFinal_ex" "ac_cv_func_EVP_DigestFinal_ex" +if test "x$ac_cv_func_EVP_DigestFinal_ex" = xyes +then : + printf "%s\n" "#define HAVE_EVP_DIGESTFINAL_EX 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EVP_DigestInit_ex" "ac_cv_func_EVP_DigestInit_ex" +if test "x$ac_cv_func_EVP_DigestInit_ex" = xyes +then : + printf "%s\n" "#define HAVE_EVP_DIGESTINIT_EX 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EVP_MD_CTX_cleanup" "ac_cv_func_EVP_MD_CTX_cleanup" +if test "x$ac_cv_func_EVP_MD_CTX_cleanup" = xyes +then : + printf "%s\n" "#define HAVE_EVP_MD_CTX_CLEANUP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EVP_MD_CTX_copy_ex" "ac_cv_func_EVP_MD_CTX_copy_ex" +if test "x$ac_cv_func_EVP_MD_CTX_copy_ex" = xyes +then : + printf "%s\n" "#define HAVE_EVP_MD_CTX_COPY_EX 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EVP_MD_CTX_init" "ac_cv_func_EVP_MD_CTX_init" +if test "x$ac_cv_func_EVP_MD_CTX_init" = xyes +then : + printf "%s\n" "#define HAVE_EVP_MD_CTX_INIT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "HMAC_CTX_init" "ac_cv_func_HMAC_CTX_init" +if test "x$ac_cv_func_HMAC_CTX_init" = xyes +then : + printf "%s\n" "#define HAVE_HMAC_CTX_INIT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "RSA_generate_key_ex" "ac_cv_func_RSA_generate_key_ex" +if test "x$ac_cv_func_RSA_generate_key_ex" = xyes +then : + printf "%s\n" "#define HAVE_RSA_GENERATE_KEY_EX 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "RSA_get_default_method" "ac_cv_func_RSA_get_default_method" +if test "x$ac_cv_func_RSA_get_default_method" = xyes +then : + printf "%s\n" "#define HAVE_RSA_GET_DEFAULT_METHOD 1" >>confdefs.h + +fi + + + # LibreSSL/OpenSSL API differences + ac_fn_c_check_func "$LINENO" "EC_POINT_get_affine_coordinates" "ac_cv_func_EC_POINT_get_affine_coordinates" +if test "x$ac_cv_func_EC_POINT_get_affine_coordinates" = xyes +then : + printf "%s\n" "#define HAVE_EC_POINT_GET_AFFINE_COORDINATES 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EC_POINT_get_affine_coordinates_GFp" "ac_cv_func_EC_POINT_get_affine_coordinates_GFp" +if test "x$ac_cv_func_EC_POINT_get_affine_coordinates_GFp" = xyes +then : + printf "%s\n" "#define HAVE_EC_POINT_GET_AFFINE_COORDINATES_GFP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EC_POINT_set_affine_coordinates" "ac_cv_func_EC_POINT_set_affine_coordinates" +if test "x$ac_cv_func_EC_POINT_set_affine_coordinates" = xyes +then : + printf "%s\n" "#define HAVE_EC_POINT_SET_AFFINE_COORDINATES 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EC_POINT_set_affine_coordinates_GFp" "ac_cv_func_EC_POINT_set_affine_coordinates_GFp" +if test "x$ac_cv_func_EC_POINT_set_affine_coordinates_GFp" = xyes +then : + printf "%s\n" "#define HAVE_EC_POINT_SET_AFFINE_COORDINATES_GFP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EVP_CIPHER_CTX_iv" "ac_cv_func_EVP_CIPHER_CTX_iv" +if test "x$ac_cv_func_EVP_CIPHER_CTX_iv" = xyes +then : + printf "%s\n" "#define HAVE_EVP_CIPHER_CTX_IV 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EVP_CIPHER_CTX_iv_noconst" "ac_cv_func_EVP_CIPHER_CTX_iv_noconst" +if test "x$ac_cv_func_EVP_CIPHER_CTX_iv_noconst" = xyes +then : + printf "%s\n" "#define HAVE_EVP_CIPHER_CTX_IV_NOCONST 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EVP_CIPHER_CTX_get_iv" "ac_cv_func_EVP_CIPHER_CTX_get_iv" +if test "x$ac_cv_func_EVP_CIPHER_CTX_get_iv" = xyes +then : + printf "%s\n" "#define HAVE_EVP_CIPHER_CTX_GET_IV 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EVP_CIPHER_CTX_get_updated_iv" "ac_cv_func_EVP_CIPHER_CTX_get_updated_iv" +if test "x$ac_cv_func_EVP_CIPHER_CTX_get_updated_iv" = xyes +then : + printf "%s\n" "#define HAVE_EVP_CIPHER_CTX_GET_UPDATED_IV 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EVP_CIPHER_CTX_set_iv" "ac_cv_func_EVP_CIPHER_CTX_set_iv" +if test "x$ac_cv_func_EVP_CIPHER_CTX_set_iv" = xyes +then : + printf "%s\n" "#define HAVE_EVP_CIPHER_CTX_SET_IV 1" >>confdefs.h + +fi + + + if test "x$openssl_engine" = "xyes" ; then + ac_fn_c_check_header_compile "$LINENO" "openssl/opensslconf.h" "ac_cv_header_openssl_opensslconf_h" "$ac_includes_default" +if test "x$ac_cv_header_openssl_opensslconf_h" = xyes +then : + printf "%s\n" "#define HAVE_OPENSSL_OPENSSLCONF_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "openssl/configuration.h" "ac_cv_header_openssl_configuration_h" "$ac_includes_default" +if test "x$ac_cv_header_openssl_configuration_h" = xyes +then : + printf "%s\n" "#define HAVE_OPENSSL_CONFIGURATION_H 1" >>confdefs.h + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OpenSSL ENGINE support" >&5 +printf %s "checking for OpenSSL ENGINE support... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #ifdef HAVE_OPENSSL_OPENSSLCONF_H + # include + #endif + #ifdef HAVE_OPENSSL_CONFIGURATION_H + # include + #endif + #include + +int +main (void) +{ + + #ifndef OPENSSL_NO_ENGINE + ENGINE_load_builtin_engines(); + ENGINE_register_all_complete(); + #else + #error "OPENSSL_NO_ENGINE" + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define USE_OPENSSL_ENGINE 1" >>confdefs.h + + +else $as_nop + as_fn_error $? "OpenSSL ENGINE support not found" "$LINENO" 5 + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if EVP_DigestUpdate returns an int" >&5 +printf %s "checking if EVP_DigestUpdate returns an int... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + #include + +int +main (void) +{ + + if(EVP_DigestUpdate(NULL, NULL,0)) + exit(0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +printf "%s\n" "#define OPENSSL_EVP_DIGESTUPDATE_VOID 1" >>confdefs.h + + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + + # Check for various EVP support in OpenSSL + ac_fn_c_check_func "$LINENO" "EVP_sha256" "ac_cv_func_EVP_sha256" +if test "x$ac_cv_func_EVP_sha256" = xyes +then : + printf "%s\n" "#define HAVE_EVP_SHA256 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EVP_sha384" "ac_cv_func_EVP_sha384" +if test "x$ac_cv_func_EVP_sha384" = xyes +then : + printf "%s\n" "#define HAVE_EVP_SHA384 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EVP_sha512" "ac_cv_func_EVP_sha512" +if test "x$ac_cv_func_EVP_sha512" = xyes +then : + printf "%s\n" "#define HAVE_EVP_SHA512 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EVP_chacha20" "ac_cv_func_EVP_chacha20" +if test "x$ac_cv_func_EVP_chacha20" = xyes +then : + printf "%s\n" "#define HAVE_EVP_CHACHA20 1" >>confdefs.h + +fi + + + # Check complete ECC support in OpenSSL + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether OpenSSL has NID_X9_62_prime256v1" >&5 +printf %s "checking whether OpenSSL has NID_X9_62_prime256v1... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + #include + #include + #include + #include + +int +main (void) +{ + + EC_KEY *e = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); + const EVP_MD *m = EVP_sha256(); /* We need this too */ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + enable_nistp256=1 +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether OpenSSL has NID_secp384r1" >&5 +printf %s "checking whether OpenSSL has NID_secp384r1... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + #include + #include + #include + #include + +int +main (void) +{ + + EC_KEY *e = EC_KEY_new_by_curve_name(NID_secp384r1); + const EVP_MD *m = EVP_sha384(); /* We need this too */ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + enable_nistp384=1 +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether OpenSSL has NID_secp521r1" >&5 +printf %s "checking whether OpenSSL has NID_secp521r1... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + #include + #include + #include + #include + +int +main (void) +{ + + EC_KEY *e = EC_KEY_new_by_curve_name(NID_secp521r1); + const EVP_MD *m = EVP_sha512(); /* We need this too */ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if OpenSSL's NID_secp521r1 is functional" >&5 +printf %s "checking if OpenSSL's NID_secp521r1 is functional... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross-compiling: assuming yes" >&5 +printf "%s\n" "$as_me: WARNING: cross-compiling: assuming yes" >&2;} + enable_nistp521=1 + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + #include + #include + #include + #include + #include + +int +main (void) +{ + + EC_KEY *e = EC_KEY_new_by_curve_name(NID_secp521r1); + const EVP_MD *m = EVP_sha512(); /* We need this too */ + exit(e == NULL || m == NULL); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + enable_nistp521=1 +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + + if test x$enable_nistp256 = x1 || test x$enable_nistp384 = x1 || \ + test x$enable_nistp521 = x1; then + +printf "%s\n" "#define OPENSSL_HAS_ECC 1" >>confdefs.h + + ac_fn_c_check_func "$LINENO" "EC_KEY_METHOD_new" "ac_cv_func_EC_KEY_METHOD_new" +if test "x$ac_cv_func_EC_KEY_METHOD_new" = xyes +then : + printf "%s\n" "#define HAVE_EC_KEY_METHOD_NEW 1" >>confdefs.h + +fi + + openssl_ecc=yes + else + openssl_ecc=no + fi + if test x$enable_nistp256 = x1; then + +printf "%s\n" "#define OPENSSL_HAS_NISTP256 1" >>confdefs.h + + else + unsupported_algorithms="$unsupported_algorithms \ + ecdsa-sha2-nistp256 \ + ecdh-sha2-nistp256 \ + ecdsa-sha2-nistp256-cert-v01@openssh.com" + fi + if test x$enable_nistp384 = x1; then + +printf "%s\n" "#define OPENSSL_HAS_NISTP384 1" >>confdefs.h + + else + unsupported_algorithms="$unsupported_algorithms \ + ecdsa-sha2-nistp384 \ + ecdh-sha2-nistp384 \ + ecdsa-sha2-nistp384-cert-v01@openssh.com" + fi + if test x$enable_nistp521 = x1; then + +printf "%s\n" "#define OPENSSL_HAS_NISTP521 1" >>confdefs.h + + else + unsupported_algorithms="$unsupported_algorithms \ + ecdh-sha2-nistp521 \ + ecdsa-sha2-nistp521 \ + ecdsa-sha2-nistp521-cert-v01@openssh.com" + fi + + # Check libcrypto ED25519 support + ac_fn_c_check_func "$LINENO" "EVP_PKEY_get_raw_public_key" "ac_cv_func_EVP_PKEY_get_raw_public_key" +if test "x$ac_cv_func_EVP_PKEY_get_raw_public_key" = xyes +then : + printf "%s\n" "#define HAVE_EVP_PKEY_GET_RAW_PUBLIC_KEY 1" >>confdefs.h + +fi + + ac_fn_c_check_func "$LINENO" "EVP_PKEY_get_raw_private_key" "ac_cv_func_EVP_PKEY_get_raw_private_key" +if test "x$ac_cv_func_EVP_PKEY_get_raw_private_key" = xyes +then : + printf "%s\n" "#define HAVE_EVP_PKEY_GET_RAW_PRIVATE_KEY 1" >>confdefs.h + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether OpenSSL has ED25519 support" >&5 +printf %s "checking whether OpenSSL has ED25519 support... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + #include + #ifdef OPENSSL_NO_EC + # error "OpenSSL has no EC support." + #endif + +int +main (void) +{ + + unsigned char buf[64]; + memset(buf, 0, sizeof(buf)); + exit(EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, NULL, + buf, sizeof(buf)) == NULL); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define OPENSSL_HAS_ED25519 1" >>confdefs.h + + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi + +# PKCS11/U2F depend on OpenSSL and dlopen(). +enable_pkcs11=yes +enable_sk=yes + +ac_fn_check_decl "$LINENO" "OPENSSL_IS_AWSLC" "ac_cv_have_decl_OPENSSL_IS_AWSLC" "#include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_OPENSSL_IS_AWSLC" = xyes +then : + enable_pkcs11="disabled; PKCS#11 not supported with AWS-LC" +fi +if test "x$ac_cv_func_dlopen" != "xyes" ; then + enable_pkcs11="disabled; missing dlopen(3)" + enable_sk="disabled; missing dlopen(3)" +fi +if test "x$ac_cv_have_decl_RTLD_NOW" != "xyes" ; then + enable_pkcs11="disabled; missing RTLD_NOW" + enable_sk="disabled; missing RTLD_NOW" +fi +if test ! -z "$disable_pkcs11" ; then + enable_pkcs11="disabled by user" +fi +if test ! -z "$disable_sk" ; then + enable_sk="disabled by user" +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable PKCS11" >&5 +printf %s "checking whether to enable PKCS11... " >&6; } +if test "x$enable_pkcs11" = "xyes" ; then + +printf "%s\n" "#define ENABLE_PKCS11 /**/" >>confdefs.h + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_pkcs11" >&5 +printf "%s\n" "$enable_pkcs11" >&6; } + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable U2F" >&5 +printf %s "checking whether to enable U2F... " >&6; } +if test "x$enable_sk" = "xyes" ; then + +printf "%s\n" "#define ENABLE_SK /**/" >>confdefs.h + + SK_DUMMY_LIBRARY=regress/misc/sk-dummy/sk-dummy.so + +else + # Do not try to build sk-dummy library. + SK_DUMMY_LIBRARY="" + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_sk" >&5 +printf "%s\n" "$enable_sk" >&6; } + +# Now check for built-in security key support. +if test "x$enable_sk" = "xyes" -a "x$enable_sk_internal" != "xno" ; then + use_pkgconfig_for_libfido2= + if test "x$PKGCONFIG" != "xno"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $PKGCONFIG knows about libfido2" >&5 +printf %s "checking if $PKGCONFIG knows about libfido2... " >&6; } + if "$PKGCONFIG" libfido2; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + use_pkgconfig_for_libfido2=yes + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + fi + if test "x$use_pkgconfig_for_libfido2" = "xyes"; then + LIBFIDO2=`$PKGCONFIG --libs libfido2` + CPPFLAGS="$CPPFLAGS `$PKGCONFIG --cflags libfido2`" + else + LIBFIDO2="-lfido2 -lcbor" + fi + OTHERLIBS=`echo $LIBFIDO2 | sed 's/-lfido2//'` + fido2_error= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fido_init in -lfido2" >&5 +printf %s "checking for fido_init in -lfido2... " >&6; } +if test ${ac_cv_lib_fido2_fido_init+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfido2 $OTHERLIBS + $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char fido_init (); +int +main (void) +{ +return fido_init (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_fido2_fido_init=yes +else $as_nop + ac_cv_lib_fido2_fido_init=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fido2_fido_init" >&5 +printf "%s\n" "$ac_cv_lib_fido2_fido_init" >&6; } +if test "x$ac_cv_lib_fido2_fido_init" = xyes +then : + +else $as_nop + fido2_error="missing/unusable libfido2" +fi + + ac_fn_c_check_header_compile "$LINENO" "fido.h" "ac_cv_header_fido_h" "$ac_includes_default" +if test "x$ac_cv_header_fido_h" = xyes +then : + +else $as_nop + fido2_error="missing fido.h from libfido2" +fi + + ac_fn_c_check_header_compile "$LINENO" "fido/credman.h" "ac_cv_header_fido_credman_h" " #include + +" +if test "x$ac_cv_header_fido_credman_h" = xyes +then : + +else $as_nop + fido2_error="missing fido/credman.h from libfido2" +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for usable libfido2 installation" >&5 +printf %s "checking for usable libfido2 installation... " >&6; } + if test ! -z "$fido2_error" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $fido2_error" >&5 +printf "%s\n" "$fido2_error" >&6; } + if test "x$enable_sk_internal" = "xyes" ; then + as_fn_error $? "No usable libfido2 library/headers found" "$LINENO" 5 + fi + LIBFIDO2="" + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + + +printf "%s\n" "#define ENABLE_SK_INTERNAL /**/" >>confdefs.h + + enable_sk="built-in" + saved_LIBS="$LIBS" + LIBS="$LIBFIDO2 $LIBS" + ac_fn_c_check_func "$LINENO" "fido_assert_set_clientdata" "ac_cv_func_fido_assert_set_clientdata" +if test "x$ac_cv_func_fido_assert_set_clientdata" = xyes +then : + printf "%s\n" "#define HAVE_FIDO_ASSERT_SET_CLIENTDATA 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "fido_cred_prot" "ac_cv_func_fido_cred_prot" +if test "x$ac_cv_func_fido_cred_prot" = xyes +then : + printf "%s\n" "#define HAVE_FIDO_CRED_PROT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "fido_cred_set_prot" "ac_cv_func_fido_cred_set_prot" +if test "x$ac_cv_func_fido_cred_set_prot" = xyes +then : + printf "%s\n" "#define HAVE_FIDO_CRED_SET_PROT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "fido_cred_set_clientdata" "ac_cv_func_fido_cred_set_clientdata" +if test "x$ac_cv_func_fido_cred_set_clientdata" = xyes +then : + printf "%s\n" "#define HAVE_FIDO_CRED_SET_CLIENTDATA 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "fido_dev_get_touch_begin" "ac_cv_func_fido_dev_get_touch_begin" +if test "x$ac_cv_func_fido_dev_get_touch_begin" = xyes +then : + printf "%s\n" "#define HAVE_FIDO_DEV_GET_TOUCH_BEGIN 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "fido_dev_get_touch_status" "ac_cv_func_fido_dev_get_touch_status" +if test "x$ac_cv_func_fido_dev_get_touch_status" = xyes +then : + printf "%s\n" "#define HAVE_FIDO_DEV_GET_TOUCH_STATUS 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "fido_dev_supports_cred_prot" "ac_cv_func_fido_dev_supports_cred_prot" +if test "x$ac_cv_func_fido_dev_supports_cred_prot" = xyes +then : + printf "%s\n" "#define HAVE_FIDO_DEV_SUPPORTS_CRED_PROT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "fido_dev_is_winhello" "ac_cv_func_fido_dev_is_winhello" +if test "x$ac_cv_func_fido_dev_is_winhello" = xyes +then : + printf "%s\n" "#define HAVE_FIDO_DEV_IS_WINHELLO 1" >>confdefs.h + +fi + + LIBS="$saved_LIBS" + fi +fi + +# Check for standalone SecurityKeyProvider +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build standalone sk-libfido2" >&5 +printf %s "checking whether to build standalone sk-libfido2... " >&6; } +if test "x$enable_sk_standalone" = "xyes" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + SK_STANDALONE=sk-libfido2$SHLIBEXT + +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + SK_STANDALONE="" + +fi + +ac_fn_c_check_func "$LINENO" "arc4random" "ac_cv_func_arc4random" +if test "x$ac_cv_func_arc4random" = xyes +then : + printf "%s\n" "#define HAVE_ARC4RANDOM 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "arc4random_buf" "ac_cv_func_arc4random_buf" +if test "x$ac_cv_func_arc4random_buf" = xyes +then : + printf "%s\n" "#define HAVE_ARC4RANDOM_BUF 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "arc4random_stir" "ac_cv_func_arc4random_stir" +if test "x$ac_cv_func_arc4random_stir" = xyes +then : + printf "%s\n" "#define HAVE_ARC4RANDOM_STIR 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "arc4random_uniform" "ac_cv_func_arc4random_uniform" +if test "x$ac_cv_func_arc4random_uniform" = xyes +then : + printf "%s\n" "#define HAVE_ARC4RANDOM_UNIFORM 1" >>confdefs.h + +fi + +### Configure cryptographic random number support + +# Check whether OpenSSL seeds itself +if test "x$openssl" = "xyes" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether OpenSSL's PRNG is internally seeded" >&5 +printf %s "checking whether OpenSSL's PRNG is internally seeded... " >&6; } + if test "$cross_compiling" = yes +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: assuming yes" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: assuming yes" >&2;} + # This is safe, since we will fatal() at runtime if + # OpenSSL is not seeded correctly. + OPENSSL_SEEDS_ITSELF=yes + + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + #include + +int +main (void) +{ + + exit(RAND_status() == 1 ? 0 : 1); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + + OPENSSL_SEEDS_ITSELF=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +# PRNGD TCP socket + +# Check whether --with-prngd-port was given. +if test ${with_prngd_port+y} +then : + withval=$with_prngd_port; + case "$withval" in + no) + withval="" + ;; + [0-9]*) + ;; + *) + as_fn_error $? "You must specify a numeric port number for --with-prngd-port" "$LINENO" 5 + ;; + esac + if test ! -z "$withval" ; then + PRNGD_PORT="$withval" + +printf "%s\n" "#define PRNGD_PORT $PRNGD_PORT" >>confdefs.h + + fi + + +fi + + +# PRNGD Unix domain socket + +# Check whether --with-prngd-socket was given. +if test ${with_prngd_socket+y} +then : + withval=$with_prngd_socket; + case "$withval" in + yes) + withval="/var/run/egd-pool" + ;; + no) + withval="" + ;; + /*) + ;; + *) + as_fn_error $? "You must specify an absolute path to the entropy socket" "$LINENO" 5 + ;; + esac + + if test ! -z "$withval" ; then + if test ! -z "$PRNGD_PORT" ; then + as_fn_error $? "You may not specify both a PRNGD/EGD port and socket" "$LINENO" 5 + fi + if test ! -r "$withval" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Entropy socket is not readable" >&5 +printf "%s\n" "$as_me: WARNING: Entropy socket is not readable" >&2;} + fi + PRNGD_SOCKET="$withval" + +printf "%s\n" "#define PRNGD_SOCKET \"$PRNGD_SOCKET\"" >>confdefs.h + + fi + +else $as_nop + + # Check for existing socket only if we don't have a random device already + if test "x$OPENSSL_SEEDS_ITSELF" != "xyes" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PRNGD/EGD socket" >&5 +printf %s "checking for PRNGD/EGD socket... " >&6; } + # Insert other locations here + for sock in /var/run/egd-pool /dev/egd-pool /etc/entropy; do + if test -r $sock && $TEST_MINUS_S_SH -c "test -S $sock -o -p $sock" ; then + PRNGD_SOCKET="$sock" + printf "%s\n" "#define PRNGD_SOCKET \"$PRNGD_SOCKET\"" >>confdefs.h + + break; + fi + done + if test ! -z "$PRNGD_SOCKET" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PRNGD_SOCKET" >&5 +printf "%s\n" "$PRNGD_SOCKET" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +printf "%s\n" "not found" >&6; } + fi + fi + + +fi + + +# Which randomness source do we use? +if test ! -z "$PRNGD_PORT" ; then + RAND_MSG="PRNGd port $PRNGD_PORT" +elif test ! -z "$PRNGD_SOCKET" ; then + RAND_MSG="PRNGd socket $PRNGD_SOCKET" +elif test ! -z "$OPENSSL_SEEDS_ITSELF" ; then + +printf "%s\n" "#define OPENSSL_PRNG_ONLY 1" >>confdefs.h + + RAND_MSG="OpenSSL internal ONLY" +elif test "x$openssl" = "xno" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: OpenSSH will use /dev/urandom as a source of random numbers. It will fail if this device is not supported or accessible" >&5 +printf "%s\n" "$as_me: WARNING: OpenSSH will use /dev/urandom as a source of random numbers. It will fail if this device is not supported or accessible" >&2;} +else + as_fn_error $? "OpenSSH has no source of random numbers. Please configure OpenSSL with an entropy source or re-run configure using one of the --with-prngd-port or --with-prngd-socket options" "$LINENO" 5 +fi +LIBS="$nocrypto_saved_LIBS" + +saved_LIBS="$LIBS" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ia_openinfo in -liaf" >&5 +printf %s "checking for ia_openinfo in -liaf... " >&6; } +if test ${ac_cv_lib_iaf_ia_openinfo+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-liaf $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char ia_openinfo (); +int +main (void) +{ +return ia_openinfo (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_iaf_ia_openinfo=yes +else $as_nop + ac_cv_lib_iaf_ia_openinfo=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iaf_ia_openinfo" >&5 +printf "%s\n" "$ac_cv_lib_iaf_ia_openinfo" >&6; } +if test "x$ac_cv_lib_iaf_ia_openinfo" = xyes +then : + + LIBS="$LIBS -liaf" + + for ac_func in set_id +do : + ac_fn_c_check_func "$LINENO" "set_id" "ac_cv_func_set_id" +if test "x$ac_cv_func_set_id" = xyes +then : + printf "%s\n" "#define HAVE_SET_ID 1" >>confdefs.h + SSHDLIBS="$SSHDLIBS -liaf" + +printf "%s\n" "#define HAVE_LIBIAF 1" >>confdefs.h + + +fi + +done + +fi + +LIBS="$saved_LIBS" + +# Check for crypt() in libcrypt. If we have it, we only need it for sshd. +saved_LIBS="$LIBS" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for crypt in -lcrypt" >&5 +printf %s "checking for crypt in -lcrypt... " >&6; } +if test ${ac_cv_lib_crypt_crypt+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcrypt $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char crypt (); +int +main (void) +{ +return crypt (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_crypt_crypt=yes +else $as_nop + ac_cv_lib_crypt_crypt=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypt_crypt" >&5 +printf "%s\n" "$ac_cv_lib_crypt_crypt" >&6; } +if test "x$ac_cv_lib_crypt_crypt" = xyes +then : + + LIBS="-lcrypt $LIBS" + SSHDLIBS="-lcrypt $SSHDLIBS" + +fi + +ac_fn_c_check_func "$LINENO" "crypt" "ac_cv_func_crypt" +if test "x$ac_cv_func_crypt" = xyes +then : + printf "%s\n" "#define HAVE_CRYPT 1" >>confdefs.h + +fi + +LIBS="$saved_LIBS" + +# Check for PAM libs +PAM_MSG="no" + +# Check whether --with-pam was given. +if test ${with_pam+y} +then : + withval=$with_pam; + if test "x$withval" != "xno" ; then + if test "x$ac_cv_header_security_pam_appl_h" != "xyes" && \ + test "x$ac_cv_header_pam_pam_appl_h" != "xyes" ; then + as_fn_error $? "PAM headers not found" "$LINENO" 5 + fi + + saved_LIBS="$LIBS" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else $as_nop + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : + printf "%s\n" "#define HAVE_LIBDL 1" >>confdefs.h + + LIBS="-ldl $LIBS" + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pam_set_item in -lpam" >&5 +printf %s "checking for pam_set_item in -lpam... " >&6; } +if test ${ac_cv_lib_pam_pam_set_item+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpam $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char pam_set_item (); +int +main (void) +{ +return pam_set_item (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_pam_pam_set_item=yes +else $as_nop + ac_cv_lib_pam_pam_set_item=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pam_pam_set_item" >&5 +printf "%s\n" "$ac_cv_lib_pam_pam_set_item" >&6; } +if test "x$ac_cv_lib_pam_pam_set_item" = xyes +then : + printf "%s\n" "#define HAVE_LIBPAM 1" >>confdefs.h + + LIBS="-lpam $LIBS" + +else $as_nop + as_fn_error $? "*** libpam missing" "$LINENO" 5 +fi + + ac_fn_c_check_func "$LINENO" "pam_getenvlist" "ac_cv_func_pam_getenvlist" +if test "x$ac_cv_func_pam_getenvlist" = xyes +then : + printf "%s\n" "#define HAVE_PAM_GETENVLIST 1" >>confdefs.h + +fi + + ac_fn_c_check_func "$LINENO" "pam_putenv" "ac_cv_func_pam_putenv" +if test "x$ac_cv_func_pam_putenv" = xyes +then : + printf "%s\n" "#define HAVE_PAM_PUTENV 1" >>confdefs.h + +fi + + LIBS="$saved_LIBS" + + PAM_MSG="yes" + + SSHDLIBS="$SSHDLIBS -lpam" + +printf "%s\n" "#define USE_PAM 1" >>confdefs.h + + + if test $ac_cv_lib_dl_dlopen = yes; then + case "$LIBS" in + *-ldl*) + # libdl already in LIBS + ;; + *) + SSHDLIBS="$SSHDLIBS -ldl" + ;; + esac + fi + fi + + +fi + + + +# Check whether --with-pam-service was given. +if test ${with_pam_service+y} +then : + withval=$with_pam_service; + if test "x$withval" != "xno" && \ + test "x$withval" != "xyes" ; then + +printf "%s\n" "#define SSHD_PAM_SERVICE \"$withval\"" >>confdefs.h + + fi + + +fi + + +# Check for older PAM +if test "x$PAM_MSG" = "xyes" ; then + # Check PAM strerror arguments (old PAM) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pam_strerror takes only one argument" >&5 +printf %s "checking whether pam_strerror takes only one argument... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if defined(HAVE_SECURITY_PAM_APPL_H) +#include +#elif defined (HAVE_PAM_PAM_APPL_H) +#include +#endif + +int +main (void) +{ + +(void)pam_strerror((pam_handle_t *)NULL, -1); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +else $as_nop + + +printf "%s\n" "#define HAVE_OLD_PAM 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + PAM_MSG="yes (old library)" + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +case "$host" in +*-*-cygwin*) + SSH_PRIVSEP_USER=CYGWIN_SSH_PRIVSEP_USER + ;; +*) + SSH_PRIVSEP_USER=sshd + ;; +esac + +# Check whether --with-privsep-user was given. +if test ${with_privsep_user+y} +then : + withval=$with_privsep_user; + if test -n "$withval" && test "x$withval" != "xno" && \ + test "x${withval}" != "xyes"; then + SSH_PRIVSEP_USER=$withval + fi + + +fi + +if test "x$SSH_PRIVSEP_USER" = "xCYGWIN_SSH_PRIVSEP_USER" ; then + +printf "%s\n" "#define SSH_PRIVSEP_USER CYGWIN_SSH_PRIVSEP_USER" >>confdefs.h + +else + +printf "%s\n" "#define SSH_PRIVSEP_USER \"$SSH_PRIVSEP_USER\"" >>confdefs.h + +fi + + +if test "x$have_linux_no_new_privs" = "x1" ; then +ac_fn_check_decl "$LINENO" "SECCOMP_MODE_FILTER" "ac_cv_have_decl_SECCOMP_MODE_FILTER" " + #include + #include + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_SECCOMP_MODE_FILTER" = xyes +then : + have_seccomp_filter=1 +fi +fi +if test "x$have_seccomp_filter" = "x1" ; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking kernel for seccomp_filter support" >&5 +printf %s "checking kernel for seccomp_filter support... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + #include + #include + #include + #include + #include + +int +main (void) +{ + int i = $seccomp_audit_arch; + errno = 0; + prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL, 0, 0); + exit(errno == EFAULT ? 0 : 1); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + # Disable seccomp filter as a target + have_seccomp_filter=0 + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi + +ac_fn_c_check_member "$LINENO" "struct pollfd" "fd" "ac_cv_member_struct_pollfd_fd" " +#include +#ifdef HAVE_POLL_H +#include +#endif +#ifdef HAVE_SYS_POLL_H +#include +#endif + +" +if test "x$ac_cv_member_struct_pollfd_fd" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_POLLFD_FD 1" >>confdefs.h + + +fi + + +ac_fn_c_check_type "$LINENO" "nfds_t" "ac_cv_type_nfds_t" " +#include +#ifdef HAVE_POLL_H +#include +#endif +#ifdef HAVE_SYS_POLL_H +#include +#endif + +" +if test "x$ac_cv_type_nfds_t" = xyes +then : + +printf "%s\n" "#define HAVE_NFDS_T 1" >>confdefs.h + + +fi + + +if test "x$ac_cv_type_nfds_t" != "xyes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if poll nfds_t is unsigned long" >&5 +printf %s "checking if poll nfds_t is unsigned long... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef HAVE_POLL_H +#include +#endif +#ifdef HAVE_SYS_POLL_H +#include +#endif + int poll(struct pollfd *, unsigned long, int timeout); + +int +main (void) +{ +return poll(0, 0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define POLL_NFDS_T_ULONG 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +# Decide which sandbox style to use +sandbox_arg="" + +# Check whether --with-sandbox was given. +if test ${with_sandbox+y} +then : + withval=$with_sandbox; + if test "x$withval" = "xyes" ; then + sandbox_arg="" + else + sandbox_arg="$withval" + fi + + +fi + + +if test "x$sandbox_arg" != "xno"; then +# POSIX specifies that poll() "shall fail with EINVAL if the nfds argument +# is greater than OPEN_MAX". On some platforms that includes implementions +# of select in userspace on top of poll() so check both work with rlimit +# NOFILES so check that both work before enabling the rlimit sandbox. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if select and/or poll works with descriptor rlimit" >&5 +printf %s "checking if select and/or poll works with descriptor rlimit... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: assuming no" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: assuming no" >&2;} + select_works_with_rlimit=no + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef HAVE_SYS_TIME_H +# include +#endif +#include +#ifdef HAVE_SYS_SELECT_H +# include +#endif +#ifdef HAVE_POLL_H +# include +#elif HAVE_SYS_POLL_H +# include +#endif +#include +#include +#include + +int +main (void) +{ + + struct rlimit rl_zero; + int fd, r; + fd_set fds; + struct timeval tv; +#ifdef HAVE_POLL + struct pollfd pfd; +#endif + + fd = open("/dev/null", O_RDONLY); + FD_ZERO(&fds); + FD_SET(fd, &fds); + rl_zero.rlim_cur = rl_zero.rlim_max = 0; + setrlimit(RLIMIT_FSIZE, &rl_zero); + setrlimit(RLIMIT_NOFILE, &rl_zero); + tv.tv_sec = 1; + tv.tv_usec = 0; + r = select(fd+1, &fds, NULL, NULL, &tv); + if (r == -1) + exit(1); +#ifdef HAVE_POLL + pfd.fd = fd; + pfd.events = POLLIN; + r = poll(&pfd, 1, 1); + if (r == -1) + exit(2); +#endif + exit(0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + select_works_with_rlimit=yes +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + select_works_with_rlimit=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if setrlimit(RLIMIT_NOFILE,{0,0}) works" >&5 +printf %s "checking if setrlimit(RLIMIT_NOFILE,{0,0}) works... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: assuming yes" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: assuming yes" >&2;} + rlimit_nofile_zero_works=yes + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef HAVE_SYS_TIME_H +# include +#endif +#include +#include +#include + +int +main (void) +{ + + struct rlimit rl_zero; + int r; + + rl_zero.rlim_cur = rl_zero.rlim_max = 0; + r = setrlimit(RLIMIT_NOFILE, &rl_zero); + exit (r == -1 ? 1 : 0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + rlimit_nofile_zero_works=yes +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + rlimit_nofile_zero_works=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if setrlimit RLIMIT_FSIZE works" >&5 +printf %s "checking if setrlimit RLIMIT_FSIZE works... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: assuming yes" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: assuming yes" >&2;} + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +int +main (void) +{ + + struct rlimit rl_zero; + + rl_zero.rlim_cur = rl_zero.rlim_max = 0; + exit(setrlimit(RLIMIT_FSIZE, &rl_zero) != 0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +printf "%s\n" "#define SANDBOX_SKIP_RLIMIT_FSIZE 1" >>confdefs.h + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +if test "x$sandbox_arg" = "xdarwin" || \ + ( test -z "$sandbox_arg" && test "x$ac_cv_func_sandbox_init" = "xyes" && \ + test "x$ac_cv_header_sandbox_h" = "xyes") ; then + test "x$ac_cv_func_sandbox_init" != "xyes" -o \ + "x$ac_cv_header_sandbox_h" != "xyes" && \ + as_fn_error $? "Darwin seatbelt sandbox requires sandbox.h and sandbox_init function" "$LINENO" 5 + SANDBOX_STYLE="darwin" + +printf "%s\n" "#define SANDBOX_DARWIN 1" >>confdefs.h + +elif test "x$sandbox_arg" = "xseccomp_filter" || \ + ( test -z "$sandbox_arg" && \ + test "x$have_seccomp_filter" = "x1" && \ + test "x$ac_cv_header_elf_h" = "xyes" && \ + test "x$ac_cv_header_linux_audit_h" = "xyes" && \ + test "x$ac_cv_header_linux_filter_h" = "xyes" && \ + test "x$seccomp_audit_arch" != "x" && \ + test "x$have_linux_no_new_privs" = "x1" && \ + test "x$ac_cv_func_prctl" = "xyes" ) ; then + test "x$seccomp_audit_arch" = "x" && \ + as_fn_error $? "seccomp_filter sandbox not supported on $host" "$LINENO" 5 + test "x$have_linux_no_new_privs" != "x1" && \ + as_fn_error $? "seccomp_filter sandbox requires PR_SET_NO_NEW_PRIVS" "$LINENO" 5 + test "x$have_seccomp_filter" != "x1" && \ + as_fn_error $? "seccomp_filter sandbox requires seccomp headers" "$LINENO" 5 + test "x$ac_cv_func_prctl" != "xyes" && \ + as_fn_error $? "seccomp_filter sandbox requires prctl function" "$LINENO" 5 + SANDBOX_STYLE="seccomp_filter" + +printf "%s\n" "#define SANDBOX_SECCOMP_FILTER 1" >>confdefs.h + +elif test "x$sandbox_arg" = "xcapsicum" || \ + ( test -z "$sandbox_arg" && \ + test "x$disable_capsicum" != "xyes" && \ + test "x$ac_cv_header_sys_capsicum_h" = "xyes" && \ + test "x$ac_cv_func_cap_rights_limit" = "xyes") ; then + test "x$ac_cv_header_sys_capsicum_h" != "xyes" && \ + as_fn_error $? "capsicum sandbox requires sys/capsicum.h header" "$LINENO" 5 + test "x$ac_cv_func_cap_rights_limit" != "xyes" && \ + as_fn_error $? "capsicum sandbox requires cap_rights_limit function" "$LINENO" 5 + SANDBOX_STYLE="capsicum" + +printf "%s\n" "#define SANDBOX_CAPSICUM 1" >>confdefs.h + +elif test "x$sandbox_arg" = "xrlimit" || \ + ( test -z "$sandbox_arg" && test "x$ac_cv_func_setrlimit" = "xyes" && \ + test "x$select_works_with_rlimit" = "xyes" && \ + test "x$rlimit_nofile_zero_works" = "xyes" ) ; then + test "x$ac_cv_func_setrlimit" != "xyes" && \ + as_fn_error $? "rlimit sandbox requires setrlimit function" "$LINENO" 5 + test "x$select_works_with_rlimit" != "xyes" && \ + as_fn_error $? "rlimit sandbox requires select to work with rlimit" "$LINENO" 5 + SANDBOX_STYLE="rlimit" + +printf "%s\n" "#define SANDBOX_RLIMIT 1" >>confdefs.h + +elif test "x$sandbox_arg" = "xsolaris" || \ + ( test -z "$sandbox_arg" && test "x$SOLARIS_PRIVS" = "xyes" ) ; then + SANDBOX_STYLE="solaris" + +printf "%s\n" "#define SANDBOX_SOLARIS 1" >>confdefs.h + +elif test -z "$sandbox_arg" || test "x$sandbox_arg" = "xno" || \ + test "x$sandbox_arg" = "xnone" || test "x$sandbox_arg" = "xnull" ; then + SANDBOX_STYLE="none" + +printf "%s\n" "#define SANDBOX_NULL 1" >>confdefs.h + +else + as_fn_error $? "unsupported --with-sandbox" "$LINENO" 5 +fi + +# Cheap hack to ensure NEWS-OS libraries are arranged right. +if test ! -z "$SONY" ; then + LIBS="$LIBS -liberty"; +fi + +# Check for long long datatypes +ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" +if test "x$ac_cv_type_long_long" = xyes +then : + +printf "%s\n" "#define HAVE_LONG_LONG 1" >>confdefs.h + + +fi +ac_fn_c_check_type "$LINENO" "unsigned long long" "ac_cv_type_unsigned_long_long" "$ac_includes_default" +if test "x$ac_cv_type_unsigned_long_long" = xyes +then : + +printf "%s\n" "#define HAVE_UNSIGNED_LONG_LONG 1" >>confdefs.h + + +fi +ac_fn_c_check_type "$LINENO" "long double" "ac_cv_type_long_double" "$ac_includes_default" +if test "x$ac_cv_type_long_double" = xyes +then : + +printf "%s\n" "#define HAVE_LONG_DOUBLE 1" >>confdefs.h + + +fi + + +# Check datatype sizes +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of short int" >&5 +printf %s "checking size of short int... " >&6; } +if test ${ac_cv_sizeof_short_int+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short int))" "ac_cv_sizeof_short_int" "$ac_includes_default" +then : + +else $as_nop + if test "$ac_cv_type_short_int" = yes; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (short int) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_short_int=0 + fi +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short_int" >&5 +printf "%s\n" "$ac_cv_sizeof_short_int" >&6; } + + + +printf "%s\n" "#define SIZEOF_SHORT_INT $ac_cv_sizeof_short_int" >>confdefs.h + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +printf %s "checking size of int... " >&6; } +if test ${ac_cv_sizeof_int+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default" +then : + +else $as_nop + if test "$ac_cv_type_int" = yes; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (int) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_int=0 + fi +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +printf "%s\n" "$ac_cv_sizeof_int" >&6; } + + + +printf "%s\n" "#define SIZEOF_INT $ac_cv_sizeof_int" >>confdefs.h + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long int" >&5 +printf %s "checking size of long int... " >&6; } +if test ${ac_cv_sizeof_long_int+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long int))" "ac_cv_sizeof_long_int" "$ac_includes_default" +then : + +else $as_nop + if test "$ac_cv_type_long_int" = yes; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long int) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long_int=0 + fi +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_int" >&5 +printf "%s\n" "$ac_cv_sizeof_long_int" >&6; } + + + +printf "%s\n" "#define SIZEOF_LONG_INT $ac_cv_sizeof_long_int" >>confdefs.h + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long long int" >&5 +printf %s "checking size of long long int... " >&6; } +if test ${ac_cv_sizeof_long_long_int+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long int))" "ac_cv_sizeof_long_long_int" "$ac_includes_default" +then : + +else $as_nop + if test "$ac_cv_type_long_long_int" = yes; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long long int) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long_long_int=0 + fi +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long_int" >&5 +printf "%s\n" "$ac_cv_sizeof_long_long_int" >&6; } + + + +printf "%s\n" "#define SIZEOF_LONG_LONG_INT $ac_cv_sizeof_long_long_int" >>confdefs.h + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5 +printf %s "checking size of time_t... " >&6; } +if test ${ac_cv_sizeof_time_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))" "ac_cv_sizeof_time_t" " + #include + #ifdef HAVE_SYS_TIME_H + # include + #endif + #ifdef HAVE_TIME_H + # include + #endif + + +" +then : + +else $as_nop + if test "$ac_cv_type_time_t" = yes; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (time_t) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_time_t=0 + fi +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_time_t" >&5 +printf "%s\n" "$ac_cv_sizeof_time_t" >&6; } + + + +printf "%s\n" "#define SIZEOF_TIME_T $ac_cv_sizeof_time_t" >>confdefs.h + + + +# Sanity check long long for some platforms (AIX) +if test "x$ac_cv_sizeof_long_long_int" = "x4" ; then + ac_cv_sizeof_long_long_int=0 +fi + +# compute LLONG_MIN and LLONG_MAX if we don't know them. +if test -z "$have_llong_max" && test -z "$have_long_long_max"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for max value of long long" >&5 +printf %s "checking for max value of long long... " >&6; } + if test "$cross_compiling" = yes +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: not checking" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: not checking" >&2;} + + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +/* Why is this so damn hard? */ +#ifdef __GNUC__ +# undef __GNUC__ +#endif +#define __USE_ISOC99 +#include +#define DATA "conftest.llminmax" +#define my_abs(a) ((a) < 0 ? ((a) * -1) : (a)) + +/* + * printf in libc on some platforms (eg old Tru64) does not understand %lld so + * we do this the hard way. + */ +static int +fprint_ll(FILE *f, long long n) +{ + unsigned int i; + int l[sizeof(long long) * 8]; + + if (n < 0) + if (fprintf(f, "-") < 0) + return -1; + for (i = 0; n != 0; i++) { + l[i] = my_abs(n % 10); + n /= 10; + } + do { + if (fprintf(f, "%d", l[--i]) < 0) + return -1; + } while (i != 0); + if (fprintf(f, " ") < 0) + return -1; + return 0; +} + +int +main (void) +{ + + FILE *f; + long long i, llmin, llmax = 0; + + if((f = fopen(DATA,"w")) == NULL) + exit(1); + +#if defined(LLONG_MIN) && defined(LLONG_MAX) + fprintf(stderr, "Using system header for LLONG_MIN and LLONG_MAX\n"); + llmin = LLONG_MIN; + llmax = LLONG_MAX; +#else + fprintf(stderr, "Calculating LLONG_MIN and LLONG_MAX\n"); + /* This will work on one's complement and two's complement */ + for (i = 1; i > llmax; i <<= 1, i++) + llmax = i; + llmin = llmax + 1LL; /* wrap */ +#endif + + /* Sanity check */ + if (llmin + 1 < llmin || llmin - 1 < llmin || llmax + 1 > llmax + || llmax - 1 > llmax || llmin == llmax || llmin == 0 + || llmax == 0 || llmax < LONG_MAX || llmin > LONG_MIN) { + fprintf(f, "unknown unknown\n"); + exit(2); + } + + if (fprint_ll(f, llmin) < 0) + exit(3); + if (fprint_ll(f, llmax) < 0) + exit(4); + if (fclose(f) < 0) + exit(5); + exit(0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + + llong_min=`$AWK '{print $1}' conftest.llminmax` + llong_max=`$AWK '{print $2}' conftest.llminmax` + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $llong_max" >&5 +printf "%s\n" "$llong_max" >&6; } + +printf "%s\n" "#define LLONG_MAX ${llong_max}LL" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for min value of long long" >&5 +printf %s "checking for min value of long long... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $llong_min" >&5 +printf "%s\n" "$llong_min" >&6; } + +printf "%s\n" "#define LLONG_MIN ${llong_min}LL" >>confdefs.h + + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +printf "%s\n" "not found" >&6; } + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +ac_fn_check_decl "$LINENO" "UINT32_MAX" "ac_cv_have_decl_UINT32_MAX" " +#ifdef HAVE_SYS_LIMITS_H +# include +#endif +#ifdef HAVE_LIMITS_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_UINT32_MAX" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_UINT32_MAX $ac_have_decl" >>confdefs.h + + +# More checks for data types +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for u_int type" >&5 +printf %s "checking for u_int type... " >&6; } +if test ${ac_cv_have_u_int+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + u_int a; a = 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_u_int="yes" +else $as_nop + ac_cv_have_u_int="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_u_int" >&5 +printf "%s\n" "$ac_cv_have_u_int" >&6; } +if test "x$ac_cv_have_u_int" = "xyes" ; then + +printf "%s\n" "#define HAVE_U_INT 1" >>confdefs.h + + have_u_int=1 +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for intXX_t types" >&5 +printf %s "checking for intXX_t types... " >&6; } +if test ${ac_cv_have_intxx_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + int8_t a; int16_t b; int32_t c; a = b = c = 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_intxx_t="yes" +else $as_nop + ac_cv_have_intxx_t="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_intxx_t" >&5 +printf "%s\n" "$ac_cv_have_intxx_t" >&6; } +if test "x$ac_cv_have_intxx_t" = "xyes" ; then + +printf "%s\n" "#define HAVE_INTXX_T 1" >>confdefs.h + + have_intxx_t=1 +fi + +if (test -z "$have_intxx_t" && \ + test "x$ac_cv_header_stdint_h" = "xyes") +then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for intXX_t types in stdint.h" >&5 +printf %s "checking for intXX_t types in stdint.h... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + int8_t a; int16_t b; int32_t c; a = b = c = 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + printf "%s\n" "#define HAVE_INTXX_T 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for int64_t type" >&5 +printf %s "checking for int64_t type... " >&6; } +if test ${ac_cv_have_int64_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef HAVE_STDINT_H +# include +#endif +#include +#ifdef HAVE_SYS_BITYPES_H +# include +#endif + +int +main (void) +{ + +int64_t a; a = 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_int64_t="yes" +else $as_nop + ac_cv_have_int64_t="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_int64_t" >&5 +printf "%s\n" "$ac_cv_have_int64_t" >&6; } +if test "x$ac_cv_have_int64_t" = "xyes" ; then + +printf "%s\n" "#define HAVE_INT64_T 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for u_intXX_t types" >&5 +printf %s "checking for u_intXX_t types... " >&6; } +if test ${ac_cv_have_u_intxx_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + u_int8_t a; u_int16_t b; u_int32_t c; a = b = c = 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_u_intxx_t="yes" +else $as_nop + ac_cv_have_u_intxx_t="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_u_intxx_t" >&5 +printf "%s\n" "$ac_cv_have_u_intxx_t" >&6; } +if test "x$ac_cv_have_u_intxx_t" = "xyes" ; then + +printf "%s\n" "#define HAVE_U_INTXX_T 1" >>confdefs.h + + have_u_intxx_t=1 +fi + +if test -z "$have_u_intxx_t" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for u_intXX_t types in sys/socket.h" >&5 +printf %s "checking for u_intXX_t types in sys/socket.h... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + u_int8_t a; u_int16_t b; u_int32_t c; a = b = c = 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + printf "%s\n" "#define HAVE_U_INTXX_T 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for u_int64_t types" >&5 +printf %s "checking for u_int64_t types... " >&6; } +if test ${ac_cv_have_u_int64_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + u_int64_t a; a = 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_u_int64_t="yes" +else $as_nop + ac_cv_have_u_int64_t="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_u_int64_t" >&5 +printf "%s\n" "$ac_cv_have_u_int64_t" >&6; } +if test "x$ac_cv_have_u_int64_t" = "xyes" ; then + +printf "%s\n" "#define HAVE_U_INT64_T 1" >>confdefs.h + + have_u_int64_t=1 +fi + +if (test -z "$have_u_int64_t" && \ + test "x$ac_cv_header_sys_bitypes_h" = "xyes") +then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for u_int64_t type in sys/bitypes.h" >&5 +printf %s "checking for u_int64_t type in sys/bitypes.h... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + u_int64_t a; a = 1 + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + printf "%s\n" "#define HAVE_U_INT64_T 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +if test -z "$have_u_intxx_t" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uintXX_t types" >&5 +printf %s "checking for uintXX_t types... " >&6; } +if test ${ac_cv_have_uintxx_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include + +int +main (void) +{ + + uint8_t a; + uint16_t b; + uint32_t c; + a = b = c = 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_uintxx_t="yes" +else $as_nop + ac_cv_have_uintxx_t="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_uintxx_t" >&5 +printf "%s\n" "$ac_cv_have_uintxx_t" >&6; } + if test "x$ac_cv_have_uintxx_t" = "xyes" ; then + +printf "%s\n" "#define HAVE_UINTXX_T 1" >>confdefs.h + + fi +fi + +if (test -z "$have_uintxx_t" && \ + test "x$ac_cv_header_stdint_h" = "xyes") +then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uintXX_t types in stdint.h" >&5 +printf %s "checking for uintXX_t types in stdint.h... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + uint8_t a; uint16_t b; uint32_t c; a = b = c = 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + printf "%s\n" "#define HAVE_UINTXX_T 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +if (test -z "$have_uintxx_t" && \ + test "x$ac_cv_header_inttypes_h" = "xyes") +then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uintXX_t types in inttypes.h" >&5 +printf %s "checking for uintXX_t types in inttypes.h... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + uint8_t a; uint16_t b; uint32_t c; a = b = c = 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + printf "%s\n" "#define HAVE_UINTXX_T 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +if (test -z "$have_u_intxx_t" || test -z "$have_intxx_t" && \ + test "x$ac_cv_header_sys_bitypes_h" = "xyes") +then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for intXX_t and u_intXX_t types in sys/bitypes.h" >&5 +printf %s "checking for intXX_t and u_intXX_t types in sys/bitypes.h... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include + +int +main (void) +{ + + int8_t a; int16_t b; int32_t c; + u_int8_t e; u_int16_t f; u_int32_t g; + a = b = c = e = f = g = 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + printf "%s\n" "#define HAVE_U_INTXX_T 1" >>confdefs.h + + printf "%s\n" "#define HAVE_INTXX_T 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for u_char" >&5 +printf %s "checking for u_char... " >&6; } +if test ${ac_cv_have_u_char+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + u_char foo; foo = 125; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_u_char="yes" +else $as_nop + ac_cv_have_u_char="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_u_char" >&5 +printf "%s\n" "$ac_cv_have_u_char" >&6; } +if test "x$ac_cv_have_u_char" = "xyes" ; then + +printf "%s\n" "#define HAVE_U_CHAR 1" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "intmax_t" "ac_cv_type_intmax_t" " +#include +#ifdef HAVE_STDINT_H +# include +#endif + +" +if test "x$ac_cv_type_intmax_t" = xyes +then : + +printf "%s\n" "#define HAVE_INTMAX_T 1" >>confdefs.h + + +fi +ac_fn_c_check_type "$LINENO" "uintmax_t" "ac_cv_type_uintmax_t" " +#include +#ifdef HAVE_STDINT_H +# include +#endif + +" +if test "x$ac_cv_type_uintmax_t" = xyes +then : + +printf "%s\n" "#define HAVE_UINTMAX_T 1" >>confdefs.h + + +fi + + + + ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "#include +#include +" +if test "x$ac_cv_type_socklen_t" = xyes +then : + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for socklen_t equivalent" >&5 +printf %s "checking for socklen_t equivalent... " >&6; } + if test ${curl_cv_socklen_t_equiv+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + # Systems have either "struct sockaddr *" or + # "void *" as the second argument to getpeername + curl_cv_socklen_t_equiv= + for arg2 in "struct sockaddr" void; do + for t in int size_t unsigned long "unsigned long"; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + + #include + #include + int getpeername (int, $arg2 *, $t *); + +int +main (void) +{ + + $t len; + getpeername(0,0,&len); + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + + curl_cv_socklen_t_equiv="$t" + break + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + done + + if test "x$curl_cv_socklen_t_equiv" = x; then + as_fn_error $? "Cannot find a type to use in place of socklen_t" "$LINENO" 5 + fi + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $curl_cv_socklen_t_equiv" >&5 +printf "%s\n" "$curl_cv_socklen_t_equiv" >&6; } + +printf "%s\n" "#define socklen_t $curl_cv_socklen_t_equiv" >>confdefs.h + +fi + + + +ac_fn_c_check_type "$LINENO" "sig_atomic_t" "ac_cv_type_sig_atomic_t" "#include +" +if test "x$ac_cv_type_sig_atomic_t" = xyes +then : + +printf "%s\n" "#define HAVE_SIG_ATOMIC_T 1" >>confdefs.h + + +fi +ac_fn_c_check_type "$LINENO" "sighandler_t" "ac_cv_type_sighandler_t" "#include +" +if test "x$ac_cv_type_sighandler_t" = xyes +then : + +printf "%s\n" "#define HAVE_SIGHANDLER_T 1" >>confdefs.h + + +fi + +ac_fn_c_check_type "$LINENO" "fsblkcnt_t" "ac_cv_type_fsblkcnt_t" " +#include +#ifdef HAVE_SYS_BITYPES_H +#include +#endif +#ifdef HAVE_SYS_STATFS_H +#include +#endif +#ifdef HAVE_SYS_STATVFS_H +#include +#endif + +" +if test "x$ac_cv_type_fsblkcnt_t" = xyes +then : + +printf "%s\n" "#define HAVE_FSBLKCNT_T 1" >>confdefs.h + + +fi +ac_fn_c_check_type "$LINENO" "fsfilcnt_t" "ac_cv_type_fsfilcnt_t" " +#include +#ifdef HAVE_SYS_BITYPES_H +#include +#endif +#ifdef HAVE_SYS_STATFS_H +#include +#endif +#ifdef HAVE_SYS_STATVFS_H +#include +#endif + +" +if test "x$ac_cv_type_fsfilcnt_t" = xyes +then : + +printf "%s\n" "#define HAVE_FSFILCNT_T 1" >>confdefs.h + + +fi + + +ac_fn_c_check_member "$LINENO" "struct statfs" "f_files" "ac_cv_member_struct_statfs_f_files" " +#include +#include +#ifdef HAVE_SYS_BITYPES_H +#include +#endif +#ifdef HAVE_SYS_STATFS_H +#include +#endif +#ifdef HAVE_SYS_STATVFS_H +#include +#endif +#ifdef HAVE_SYS_VFS_H +#include +#endif +#ifdef HAVE_SYS_MOUNT_H +#include +#endif + +" +if test "x$ac_cv_member_struct_statfs_f_files" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_STATFS_F_FILES 1" >>confdefs.h + + +fi +ac_fn_c_check_member "$LINENO" "struct statfs" "f_flags" "ac_cv_member_struct_statfs_f_flags" " +#include +#include +#ifdef HAVE_SYS_BITYPES_H +#include +#endif +#ifdef HAVE_SYS_STATFS_H +#include +#endif +#ifdef HAVE_SYS_STATVFS_H +#include +#endif +#ifdef HAVE_SYS_VFS_H +#include +#endif +#ifdef HAVE_SYS_MOUNT_H +#include +#endif + +" +if test "x$ac_cv_member_struct_statfs_f_flags" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_STATFS_F_FLAGS 1" >>confdefs.h + + +fi + + + +ac_fn_c_check_type "$LINENO" "in_addr_t" "ac_cv_type_in_addr_t" "#include +#include +" +if test "x$ac_cv_type_in_addr_t" = xyes +then : + +printf "%s\n" "#define HAVE_IN_ADDR_T 1" >>confdefs.h + + +fi +ac_fn_c_check_type "$LINENO" "in_port_t" "ac_cv_type_in_port_t" "#include +#include +" +if test "x$ac_cv_type_in_port_t" = xyes +then : + +printf "%s\n" "#define HAVE_IN_PORT_T 1" >>confdefs.h + + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for size_t" >&5 +printf %s "checking for size_t... " >&6; } +if test ${ac_cv_have_size_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + size_t foo; foo = 1235; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_size_t="yes" +else $as_nop + ac_cv_have_size_t="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_size_t" >&5 +printf "%s\n" "$ac_cv_have_size_t" >&6; } +if test "x$ac_cv_have_size_t" = "xyes" ; then + +printf "%s\n" "#define HAVE_SIZE_T 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ssize_t" >&5 +printf %s "checking for ssize_t... " >&6; } +if test ${ac_cv_have_ssize_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + ssize_t foo; foo = 1235; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_ssize_t="yes" +else $as_nop + ac_cv_have_ssize_t="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_ssize_t" >&5 +printf "%s\n" "$ac_cv_have_ssize_t" >&6; } +if test "x$ac_cv_have_ssize_t" = "xyes" ; then + +printf "%s\n" "#define HAVE_SSIZE_T 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_t" >&5 +printf %s "checking for clock_t... " >&6; } +if test ${ac_cv_have_clock_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + clock_t foo; foo = 1235; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_clock_t="yes" +else $as_nop + ac_cv_have_clock_t="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_clock_t" >&5 +printf "%s\n" "$ac_cv_have_clock_t" >&6; } +if test "x$ac_cv_have_clock_t" = "xyes" ; then + +printf "%s\n" "#define HAVE_CLOCK_T 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sa_family_t" >&5 +printf %s "checking for sa_family_t... " >&6; } +if test ${ac_cv_have_sa_family_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main (void) +{ + sa_family_t foo; foo = 1235; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_sa_family_t="yes" +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +int +main (void) +{ + sa_family_t foo; foo = 1235; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_sa_family_t="yes" +else $as_nop + ac_cv_have_sa_family_t="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_sa_family_t" >&5 +printf "%s\n" "$ac_cv_have_sa_family_t" >&6; } +if test "x$ac_cv_have_sa_family_t" = "xyes" ; then + +printf "%s\n" "#define HAVE_SA_FAMILY_T 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pid_t" >&5 +printf %s "checking for pid_t... " >&6; } +if test ${ac_cv_have_pid_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + pid_t foo; foo = 1235; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_pid_t="yes" +else $as_nop + ac_cv_have_pid_t="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_pid_t" >&5 +printf "%s\n" "$ac_cv_have_pid_t" >&6; } +if test "x$ac_cv_have_pid_t" = "xyes" ; then + +printf "%s\n" "#define HAVE_PID_T 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mode_t" >&5 +printf %s "checking for mode_t... " >&6; } +if test ${ac_cv_have_mode_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + mode_t foo; foo = 1235; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_mode_t="yes" +else $as_nop + ac_cv_have_mode_t="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_mode_t" >&5 +printf "%s\n" "$ac_cv_have_mode_t" >&6; } +if test "x$ac_cv_have_mode_t" = "xyes" ; then + +printf "%s\n" "#define HAVE_MODE_T 1" >>confdefs.h + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct sockaddr_storage" >&5 +printf %s "checking for struct sockaddr_storage... " >&6; } +if test ${ac_cv_have_struct_sockaddr_storage+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main (void) +{ + struct sockaddr_storage s; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_struct_sockaddr_storage="yes" +else $as_nop + ac_cv_have_struct_sockaddr_storage="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_struct_sockaddr_storage" >&5 +printf "%s\n" "$ac_cv_have_struct_sockaddr_storage" >&6; } +if test "x$ac_cv_have_struct_sockaddr_storage" = "xyes" ; then + +printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_STORAGE 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct sockaddr_in6" >&5 +printf %s "checking for struct sockaddr_in6... " >&6; } +if test ${ac_cv_have_struct_sockaddr_in6+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main (void) +{ + struct sockaddr_in6 s; s.sin6_family = 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_struct_sockaddr_in6="yes" +else $as_nop + ac_cv_have_struct_sockaddr_in6="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_struct_sockaddr_in6" >&5 +printf "%s\n" "$ac_cv_have_struct_sockaddr_in6" >&6; } +if test "x$ac_cv_have_struct_sockaddr_in6" = "xyes" ; then + +printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_IN6 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct in6_addr" >&5 +printf %s "checking for struct in6_addr... " >&6; } +if test ${ac_cv_have_struct_in6_addr+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main (void) +{ + struct in6_addr s; s.s6_addr[0] = 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_struct_in6_addr="yes" +else $as_nop + ac_cv_have_struct_in6_addr="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_struct_in6_addr" >&5 +printf "%s\n" "$ac_cv_have_struct_in6_addr" >&6; } +if test "x$ac_cv_have_struct_in6_addr" = "xyes" ; then + +printf "%s\n" "#define HAVE_STRUCT_IN6_ADDR 1" >>confdefs.h + + + ac_fn_c_check_member "$LINENO" "struct sockaddr_in6" "sin6_scope_id" "ac_cv_member_struct_sockaddr_in6_sin6_scope_id" " +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#include + +" +if test "x$ac_cv_member_struct_sockaddr_in6_sin6_scope_id" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1" >>confdefs.h + + +fi + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct addrinfo" >&5 +printf %s "checking for struct addrinfo... " >&6; } +if test ${ac_cv_have_struct_addrinfo+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include + +int +main (void) +{ + struct addrinfo s; s.ai_flags = AI_PASSIVE; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_struct_addrinfo="yes" +else $as_nop + ac_cv_have_struct_addrinfo="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_struct_addrinfo" >&5 +printf "%s\n" "$ac_cv_have_struct_addrinfo" >&6; } +if test "x$ac_cv_have_struct_addrinfo" = "xyes" ; then + +printf "%s\n" "#define HAVE_STRUCT_ADDRINFO 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timeval" >&5 +printf %s "checking for struct timeval... " >&6; } +if test ${ac_cv_have_struct_timeval+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + struct timeval tv; tv.tv_sec = 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_struct_timeval="yes" +else $as_nop + ac_cv_have_struct_timeval="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_struct_timeval" >&5 +printf "%s\n" "$ac_cv_have_struct_timeval" >&6; } +if test "x$ac_cv_have_struct_timeval" = "xyes" ; then + +printf "%s\n" "#define HAVE_STRUCT_TIMEVAL 1" >>confdefs.h + + have_struct_timeval=1 +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timespec" >&5 +printf %s "checking for struct timespec... " >&6; } +if test ${ac_cv_have_struct_timespec+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #ifdef HAVE_SYS_TIME_H + # include + #endif + #ifdef HAVE_TIME_H + # include + #endif + +int +main (void) +{ + struct timespec ts; ts.tv_sec = 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_struct_timespec="yes" +else $as_nop + ac_cv_have_struct_timespec="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_struct_timespec" >&5 +printf "%s\n" "$ac_cv_have_struct_timespec" >&6; } +if test "x$ac_cv_have_struct_timespec" = "xyes" ; then + +printf "%s\n" "#define HAVE_STRUCT_TIMESPEC 1" >>confdefs.h + + have_struct_timespec=1 +fi + +# We need int64_t or else certain parts of the compile will fail. +if test "x$ac_cv_have_int64_t" = "xno" && \ + test "x$ac_cv_sizeof_long_int" != "x8" && \ + test "x$ac_cv_sizeof_long_long_int" = "x0" ; then + echo "OpenSSH requires int64_t support. Contact your vendor or install" + echo "an alternative compiler (I.E., GCC) before continuing." + echo "" + exit 1; +else + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: Assuming working snprintf()" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: Assuming working snprintf()" >&2;} + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#ifdef HAVE_SNPRINTF +int main(void) +{ + char buf[50]; + char expected_out[50]; + int mazsize = 50 ; +#if (SIZEOF_LONG_INT == 8) + long int num = 0x7fffffffffffffff; +#else + long long num = 0x7fffffffffffffffll; +#endif + strcpy(expected_out, "9223372036854775807"); +#if (SIZEOF_LONG_INT == 8) + snprintf(buf, mazsize, "%ld", num); +#else + snprintf(buf, mazsize, "%lld", num); +#endif + if(strcmp(buf, expected_out) != 0) + exit(1); + exit(0); +} +#else +int main(void) { exit(0); } +#endif + +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + true +else $as_nop + printf "%s\n" "#define BROKEN_SNPRINTF 1" >>confdefs.h + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + + +# look for field 'ut_host' in header 'utmp.h' + ossh_safe=`echo "utmp.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_host + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_host field in utmp.h" >&5 +printf %s "checking for ut_host field in utmp.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_host" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_HOST_IN_UTMP 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'ut_host' in header 'utmpx.h' + ossh_safe=`echo "utmpx.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_host + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_host field in utmpx.h" >&5 +printf %s "checking for ut_host field in utmpx.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_host" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_HOST_IN_UTMPX 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'syslen' in header 'utmpx.h' + ossh_safe=`echo "utmpx.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"syslen + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for syslen field in utmpx.h" >&5 +printf %s "checking for syslen field in utmpx.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "syslen" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_SYSLEN_IN_UTMPX 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'ut_pid' in header 'utmp.h' + ossh_safe=`echo "utmp.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_pid + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_pid field in utmp.h" >&5 +printf %s "checking for ut_pid field in utmp.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_pid" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_PID_IN_UTMP 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'ut_type' in header 'utmp.h' + ossh_safe=`echo "utmp.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_type + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_type field in utmp.h" >&5 +printf %s "checking for ut_type field in utmp.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_type" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_TYPE_IN_UTMP 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'ut_type' in header 'utmpx.h' + ossh_safe=`echo "utmpx.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_type + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_type field in utmpx.h" >&5 +printf %s "checking for ut_type field in utmpx.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_type" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_TYPE_IN_UTMPX 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'ut_tv' in header 'utmp.h' + ossh_safe=`echo "utmp.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_tv + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_tv field in utmp.h" >&5 +printf %s "checking for ut_tv field in utmp.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_tv" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_TV_IN_UTMP 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'ut_id' in header 'utmp.h' + ossh_safe=`echo "utmp.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_id + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_id field in utmp.h" >&5 +printf %s "checking for ut_id field in utmp.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_id" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_ID_IN_UTMP 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'ut_id' in header 'utmpx.h' + ossh_safe=`echo "utmpx.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_id + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_id field in utmpx.h" >&5 +printf %s "checking for ut_id field in utmpx.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_id" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_ID_IN_UTMPX 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'ut_addr' in header 'utmp.h' + ossh_safe=`echo "utmp.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_addr + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_addr field in utmp.h" >&5 +printf %s "checking for ut_addr field in utmp.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_addr" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_ADDR_IN_UTMP 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'ut_addr' in header 'utmpx.h' + ossh_safe=`echo "utmpx.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_addr + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_addr field in utmpx.h" >&5 +printf %s "checking for ut_addr field in utmpx.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_addr" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_ADDR_IN_UTMPX 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'ut_addr_v6' in header 'utmp.h' + ossh_safe=`echo "utmp.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_addr_v6 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_addr_v6 field in utmp.h" >&5 +printf %s "checking for ut_addr_v6 field in utmp.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_addr_v6" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_ADDR_V6_IN_UTMP 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'ut_addr_v6' in header 'utmpx.h' + ossh_safe=`echo "utmpx.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_addr_v6 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_addr_v6 field in utmpx.h" >&5 +printf %s "checking for ut_addr_v6 field in utmpx.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_addr_v6" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_ADDR_V6_IN_UTMPX 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'ut_exit' in header 'utmp.h' + ossh_safe=`echo "utmp.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_exit + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_exit field in utmp.h" >&5 +printf %s "checking for ut_exit field in utmp.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_exit" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_EXIT_IN_UTMP 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'ut_time' in header 'utmp.h' + ossh_safe=`echo "utmp.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_time + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_time field in utmp.h" >&5 +printf %s "checking for ut_time field in utmp.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_time" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_TIME_IN_UTMP 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'ut_time' in header 'utmpx.h' + ossh_safe=`echo "utmpx.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_time + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_time field in utmpx.h" >&5 +printf %s "checking for ut_time field in utmpx.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_time" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_TIME_IN_UTMPX 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'ut_tv' in header 'utmpx.h' + ossh_safe=`echo "utmpx.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_tv + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_tv field in utmpx.h" >&5 +printf %s "checking for ut_tv field in utmpx.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_tv" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_TV_IN_UTMPX 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +# look for field 'ut_ss' in header 'utmpx.h' + ossh_safe=`echo "utmpx.h" | sed 'y%./+-%__p_%'` + ossh_varname="ossh_cv_$ossh_safe""_has_"ut_ss + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ut_ss field in utmpx.h" >&5 +printf %s "checking for ut_ss field in utmpx.h... " >&6; } + if eval test \${$ossh_varname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ut_ss" >/dev/null 2>&1 +then : + eval "$ossh_varname=yes" +else $as_nop + eval "$ossh_varname=no" +fi +rm -rf conftest* + +fi + + ossh_result=`eval 'echo $'"$ossh_varname"` + if test -n "`echo $ossh_varname`"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ossh_result" >&5 +printf "%s\n" "$ossh_result" >&6; } + if test "x$ossh_result" = "xyes"; then + +printf "%s\n" "#define HAVE_SS_IN_UTMPX 1" >>confdefs.h + + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + + +ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize" "ac_cv_member_struct_stat_st_blksize" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat_st_blksize" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BLKSIZE 1" >>confdefs.h + + +fi + +ac_fn_c_check_member "$LINENO" "struct stat" "st_mtim" "ac_cv_member_struct_stat_st_mtim" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat_st_mtim" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_STAT_ST_MTIM 1" >>confdefs.h + + +fi + +ac_fn_c_check_member "$LINENO" "struct stat" "st_mtime" "ac_cv_member_struct_stat_st_mtime" "$ac_includes_default" +if test "x$ac_cv_member_struct_stat_st_mtime" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_STAT_ST_MTIME 1" >>confdefs.h + + +fi + +ac_fn_c_check_member "$LINENO" "struct passwd" "pw_gecos" "ac_cv_member_struct_passwd_pw_gecos" " +#include +#include + +" +if test "x$ac_cv_member_struct_passwd_pw_gecos" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_PASSWD_PW_GECOS 1" >>confdefs.h + + +fi +ac_fn_c_check_member "$LINENO" "struct passwd" "pw_class" "ac_cv_member_struct_passwd_pw_class" " +#include +#include + +" +if test "x$ac_cv_member_struct_passwd_pw_class" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_PASSWD_PW_CLASS 1" >>confdefs.h + + +fi +ac_fn_c_check_member "$LINENO" "struct passwd" "pw_change" "ac_cv_member_struct_passwd_pw_change" " +#include +#include + +" +if test "x$ac_cv_member_struct_passwd_pw_change" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_PASSWD_PW_CHANGE 1" >>confdefs.h + + +fi +ac_fn_c_check_member "$LINENO" "struct passwd" "pw_expire" "ac_cv_member_struct_passwd_pw_expire" " +#include +#include + +" +if test "x$ac_cv_member_struct_passwd_pw_expire" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_PASSWD_PW_EXPIRE 1" >>confdefs.h + + +fi + + +ac_fn_c_check_member "$LINENO" "struct __res_state" "retrans" "ac_cv_member_struct___res_state_retrans" " +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#include +#include +#include + +" +if test "x$ac_cv_member_struct___res_state_retrans" = xyes +then : + +else $as_nop + +printf "%s\n" "#define __res_state state" >>confdefs.h + +fi + + +ac_fn_c_check_member "$LINENO" "struct sockaddr_in" "sin_len" "ac_cv_member_struct_sockaddr_in_sin_len" " +#include +#include +#include + + +" +if test "x$ac_cv_member_struct_sockaddr_in_sin_len" = xyes +then : + +printf "%s\n" "#define SOCK_HAS_LEN 1" >>confdefs.h + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ss_family field in struct sockaddr_storage" >&5 +printf %s "checking for ss_family field in struct sockaddr_storage... " >&6; } +if test ${ac_cv_have_ss_family_in_struct_ss+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main (void) +{ + struct sockaddr_storage s; s.ss_family = 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_ss_family_in_struct_ss="yes" +else $as_nop + ac_cv_have_ss_family_in_struct_ss="no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_ss_family_in_struct_ss" >&5 +printf "%s\n" "$ac_cv_have_ss_family_in_struct_ss" >&6; } +if test "x$ac_cv_have_ss_family_in_struct_ss" = "xyes" ; then + +printf "%s\n" "#define HAVE_SS_FAMILY_IN_SS 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __ss_family field in struct sockaddr_storage" >&5 +printf %s "checking for __ss_family field in struct sockaddr_storage... " >&6; } +if test ${ac_cv_have___ss_family_in_struct_ss+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main (void) +{ + struct sockaddr_storage s; s.__ss_family = 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have___ss_family_in_struct_ss="yes" +else $as_nop + ac_cv_have___ss_family_in_struct_ss="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have___ss_family_in_struct_ss" >&5 +printf "%s\n" "$ac_cv_have___ss_family_in_struct_ss" >&6; } +if test "x$ac_cv_have___ss_family_in_struct_ss" = "xyes" ; then + +printf "%s\n" "#define HAVE___SS_FAMILY_IN_SS 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for msg_accrights field in struct msghdr" >&5 +printf %s "checking for msg_accrights field in struct msghdr... " >&6; } +if test ${ac_cv_have_accrights_in_msghdr+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include + +int +main (void) +{ + +#ifdef msg_accrights +#error "msg_accrights is a macro" +exit(1); +#endif +struct msghdr m; +m.msg_accrights = 0; +exit(0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_accrights_in_msghdr="yes" +else $as_nop + ac_cv_have_accrights_in_msghdr="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_accrights_in_msghdr" >&5 +printf "%s\n" "$ac_cv_have_accrights_in_msghdr" >&6; } +if test "x$ac_cv_have_accrights_in_msghdr" = "xyes" ; then + +printf "%s\n" "#define HAVE_ACCRIGHTS_IN_MSGHDR 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if struct statvfs.f_fsid is integral type" >&5 +printf %s "checking if struct statvfs.f_fsid is integral type... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#ifdef HAVE_SYS_TIME_H +# include +#endif +#ifdef HAVE_SYS_MOUNT_H +#include +#endif +#ifdef HAVE_SYS_STATVFS_H +#include +#endif + +int +main (void) +{ + struct statvfs s; s.f_fsid = 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if fsid_t has member val" >&5 +printf %s "checking if fsid_t has member val... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main (void) +{ + fsid_t t; t.val[0] = 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define FSID_HAS_VAL 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if f_fsid has member __val" >&5 +printf %s "checking if f_fsid has member __val... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include + +int +main (void) +{ + fsid_t t; t.__val[0] = 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define FSID_HAS___VAL 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for msg_control field in struct msghdr" >&5 +printf %s "checking for msg_control field in struct msghdr... " >&6; } +if test ${ac_cv_have_control_in_msghdr+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include + +int +main (void) +{ + +#ifdef msg_control +#error "msg_control is a macro" +exit(1); +#endif +struct msghdr m; +m.msg_control = 0; +exit(0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_have_control_in_msghdr="yes" +else $as_nop + ac_cv_have_control_in_msghdr="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_control_in_msghdr" >&5 +printf "%s\n" "$ac_cv_have_control_in_msghdr" >&6; } +if test "x$ac_cv_have_control_in_msghdr" = "xyes" ; then + +printf "%s\n" "#define HAVE_CONTROL_IN_MSGHDR 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libc defines __progname" >&5 +printf %s "checking if libc defines __progname... " >&6; } +if test ${ac_cv_libc_defines___progname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + extern char *__progname; printf("%s", __progname); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_libc_defines___progname="yes" +else $as_nop + ac_cv_libc_defines___progname="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libc_defines___progname" >&5 +printf "%s\n" "$ac_cv_libc_defines___progname" >&6; } +if test "x$ac_cv_libc_defines___progname" = "xyes" ; then + +printf "%s\n" "#define HAVE___PROGNAME 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC implements __FUNCTION__" >&5 +printf %s "checking whether $CC implements __FUNCTION__... " >&6; } +if test ${ac_cv_cc_implements___FUNCTION__+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + printf("%s", __FUNCTION__); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_cc_implements___FUNCTION__="yes" +else $as_nop + ac_cv_cc_implements___FUNCTION__="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_implements___FUNCTION__" >&5 +printf "%s\n" "$ac_cv_cc_implements___FUNCTION__" >&6; } +if test "x$ac_cv_cc_implements___FUNCTION__" = "xyes" ; then + +printf "%s\n" "#define HAVE___FUNCTION__ 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC implements __func__" >&5 +printf %s "checking whether $CC implements __func__... " >&6; } +if test ${ac_cv_cc_implements___func__+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + printf("%s", __func__); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_cc_implements___func__="yes" +else $as_nop + ac_cv_cc_implements___func__="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_implements___func__" >&5 +printf "%s\n" "$ac_cv_cc_implements___func__" >&6; } +if test "x$ac_cv_cc_implements___func__" = "xyes" ; then + +printf "%s\n" "#define HAVE___func__ 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether va_copy exists" >&5 +printf %s "checking whether va_copy exists... " >&6; } +if test ${ac_cv_have_va_copy+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +va_list x,y; + +int +main (void) +{ + va_copy(x,y); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_have_va_copy="yes" +else $as_nop + ac_cv_have_va_copy="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_va_copy" >&5 +printf "%s\n" "$ac_cv_have_va_copy" >&6; } +if test "x$ac_cv_have_va_copy" = "xyes" ; then + +printf "%s\n" "#define HAVE_VA_COPY 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether __va_copy exists" >&5 +printf %s "checking whether __va_copy exists... " >&6; } +if test ${ac_cv_have___va_copy+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +va_list x,y; + +int +main (void) +{ + __va_copy(x,y); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_have___va_copy="yes" +else $as_nop + ac_cv_have___va_copy="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have___va_copy" >&5 +printf "%s\n" "$ac_cv_have___va_copy" >&6; } +if test "x$ac_cv_have___va_copy" = "xyes" ; then + +printf "%s\n" "#define HAVE___VA_COPY 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getopt has optreset support" >&5 +printf %s "checking whether getopt has optreset support... " >&6; } +if test ${ac_cv_have_getopt_optreset+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + extern int optreset; optreset = 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_have_getopt_optreset="yes" +else $as_nop + ac_cv_have_getopt_optreset="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_getopt_optreset" >&5 +printf "%s\n" "$ac_cv_have_getopt_optreset" >&6; } +if test "x$ac_cv_have_getopt_optreset" = "xyes" ; then + +printf "%s\n" "#define HAVE_GETOPT_OPTRESET 1" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libc defines sys_errlist" >&5 +printf %s "checking if libc defines sys_errlist... " >&6; } +if test ${ac_cv_libc_defines_sys_errlist+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + extern const char *const sys_errlist[]; printf("%s", sys_errlist[0]); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_libc_defines_sys_errlist="yes" +else $as_nop + ac_cv_libc_defines_sys_errlist="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libc_defines_sys_errlist" >&5 +printf "%s\n" "$ac_cv_libc_defines_sys_errlist" >&6; } +if test "x$ac_cv_libc_defines_sys_errlist" = "xyes" ; then + +printf "%s\n" "#define HAVE_SYS_ERRLIST 1" >>confdefs.h + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libc defines sys_nerr" >&5 +printf %s "checking if libc defines sys_nerr... " >&6; } +if test ${ac_cv_libc_defines_sys_nerr+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main (void) +{ + extern int sys_nerr; printf("%i", sys_nerr); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_libc_defines_sys_nerr="yes" +else $as_nop + ac_cv_libc_defines_sys_nerr="no" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libc_defines_sys_nerr" >&5 +printf "%s\n" "$ac_cv_libc_defines_sys_nerr" >&6; } +if test "x$ac_cv_libc_defines_sys_nerr" = "xyes" ; then + +printf "%s\n" "#define HAVE_SYS_NERR 1" >>confdefs.h + +fi + +# Check libraries needed by DNS fingerprint support +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing getrrsetbyname" >&5 +printf %s "checking for library containing getrrsetbyname... " >&6; } +if test ${ac_cv_search_getrrsetbyname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char getrrsetbyname (); +int +main (void) +{ +return getrrsetbyname (); + ; + return 0; +} +_ACEOF +for ac_lib in '' resolv +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_getrrsetbyname=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_getrrsetbyname+y} +then : + break +fi +done +if test ${ac_cv_search_getrrsetbyname+y} +then : + +else $as_nop + ac_cv_search_getrrsetbyname=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getrrsetbyname" >&5 +printf "%s\n" "$ac_cv_search_getrrsetbyname" >&6; } +ac_res=$ac_cv_search_getrrsetbyname +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +printf "%s\n" "#define HAVE_GETRRSETBYNAME 1" >>confdefs.h + +else $as_nop + + # Needed by our getrrsetbyname() + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing res_query" >&5 +printf %s "checking for library containing res_query... " >&6; } +if test ${ac_cv_search_res_query+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char res_query (); +int +main (void) +{ +return res_query (); + ; + return 0; +} +_ACEOF +for ac_lib in '' resolv +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_res_query=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_res_query+y} +then : + break +fi +done +if test ${ac_cv_search_res_query+y} +then : + +else $as_nop + ac_cv_search_res_query=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_res_query" >&5 +printf "%s\n" "$ac_cv_search_res_query" >&6; } +ac_res=$ac_cv_search_res_query +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing dn_expand" >&5 +printf %s "checking for library containing dn_expand... " >&6; } +if test ${ac_cv_search_dn_expand+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dn_expand (); +int +main (void) +{ +return dn_expand (); + ; + return 0; +} +_ACEOF +for ac_lib in '' resolv +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_dn_expand=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_dn_expand+y} +then : + break +fi +done +if test ${ac_cv_search_dn_expand+y} +then : + +else $as_nop + ac_cv_search_dn_expand=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dn_expand" >&5 +printf "%s\n" "$ac_cv_search_dn_expand" >&6; } +ac_res=$ac_cv_search_dn_expand +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if res_query will link" >&5 +printf %s "checking if res_query will link... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include + +int +main (void) +{ + + res_query (0, 0, 0, 0, 0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + saved_LIBS="$LIBS" + LIBS="$LIBS -lresolv" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for res_query in -lresolv" >&5 +printf %s "checking for res_query in -lresolv... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#include +#include + +int +main (void) +{ + + res_query (0, 0, 0, 0, 0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + LIBS="$saved_LIBS" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + ac_fn_c_check_func "$LINENO" "_getshort" "ac_cv_func__getshort" +if test "x$ac_cv_func__getshort" = xyes +then : + printf "%s\n" "#define HAVE__GETSHORT 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "_getlong" "ac_cv_func__getlong" +if test "x$ac_cv_func__getlong" = xyes +then : + printf "%s\n" "#define HAVE__GETLONG 1" >>confdefs.h + +fi + + ac_fn_check_decl "$LINENO" "_getshort" "ac_cv_have_decl__getshort" "#include + #include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl__getshort" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL__GETSHORT $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "_getlong" "ac_cv_have_decl__getlong" "#include + #include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl__getlong" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL__GETLONG $ac_have_decl" >>confdefs.h + + ac_fn_c_check_member "$LINENO" "HEADER" "ad" "ac_cv_member_HEADER_ad" "#include +" +if test "x$ac_cv_member_HEADER_ad" = xyes +then : + +printf "%s\n" "#define HAVE_HEADER_AD 1" >>confdefs.h + +fi + + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if struct __res_state _res is an extern" >&5 +printf %s "checking if struct __res_state _res is an extern... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#include +#include +#include +extern struct __res_state _res; + +int +main (void) +{ + +struct __res_state *volatile p = &_res; /* force resolution of _res */ +return 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define HAVE__RES_EXTERN 1" >>confdefs.h + + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + +# Check whether user wants SELinux support +SELINUX_MSG="no" +LIBSELINUX="" + +# Check whether --with-selinux was given. +if test ${with_selinux+y} +then : + withval=$with_selinux; if test "x$withval" != "xno" ; then + save_LIBS="$LIBS" + +printf "%s\n" "#define WITH_SELINUX 1" >>confdefs.h + + SELINUX_MSG="yes" + ac_fn_c_check_header_compile "$LINENO" "selinux/selinux.h" "ac_cv_header_selinux_selinux_h" "$ac_includes_default" +if test "x$ac_cv_header_selinux_selinux_h" = xyes +then : + +else $as_nop + as_fn_error $? "SELinux support requires selinux.h header" "$LINENO" 5 +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for setexeccon in -lselinux" >&5 +printf %s "checking for setexeccon in -lselinux... " >&6; } +if test ${ac_cv_lib_selinux_setexeccon+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lselinux $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char setexeccon (); +int +main (void) +{ +return setexeccon (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_selinux_setexeccon=yes +else $as_nop + ac_cv_lib_selinux_setexeccon=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_selinux_setexeccon" >&5 +printf "%s\n" "$ac_cv_lib_selinux_setexeccon" >&6; } +if test "x$ac_cv_lib_selinux_setexeccon" = xyes +then : + LIBSELINUX="-lselinux" + LIBS="$LIBS -lselinux" + +else $as_nop + as_fn_error $? "SELinux support requires libselinux library" "$LINENO" 5 +fi + + ac_fn_c_check_func "$LINENO" "getseuserbyname" "ac_cv_func_getseuserbyname" +if test "x$ac_cv_func_getseuserbyname" = xyes +then : + printf "%s\n" "#define HAVE_GETSEUSERBYNAME 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "get_default_context_with_level" "ac_cv_func_get_default_context_with_level" +if test "x$ac_cv_func_get_default_context_with_level" = xyes +then : + printf "%s\n" "#define HAVE_GET_DEFAULT_CONTEXT_WITH_LEVEL 1" >>confdefs.h + +fi + + LIBS="$save_LIBS $LIBSELINUX" + fi + +fi + + + +# Check whether user wants Kerberos 5 support +KRB5_MSG="no" + +# Check whether --with-kerberos5 was given. +if test ${with_kerberos5+y} +then : + withval=$with_kerberos5; if test "x$withval" != "xno" ; then + if test "x$withval" = "xyes" ; then + KRB5ROOT="/usr/local" + else + KRB5ROOT=${withval} + fi + + +printf "%s\n" "#define KRB5 1" >>confdefs.h + + KRB5_MSG="yes" + + use_pkgconfig_for_krb5= + if test "x$PKGCONFIG" != "xno"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $PKGCONFIG knows about kerberos5" >&5 +printf %s "checking if $PKGCONFIG knows about kerberos5... " >&6; } + if "$PKGCONFIG" krb5; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + use_pkgconfig_for_krb5=yes + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + fi + if test "x$use_pkgconfig_for_krb5" = "xyes"; then + K5CFLAGS=`$PKGCONFIG --cflags krb5` + K5LIBS=`$PKGCONFIG --libs krb5` + CPPFLAGS="$CPPFLAGS $K5CFLAGS" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gssapi support" >&5 +printf %s "checking for gssapi support... " >&6; } + if "$PKGCONFIG" krb5-gssapi; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define GSSAPI 1" >>confdefs.h + + GSSCFLAGS="`$PKGCONFIG --cflags krb5-gssapi`" + GSSLIBS="`$PKGCONFIG --libs krb5-gssapi`" + CPPFLAGS="$CPPFLAGS $GSSCFLAGS" + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are using Heimdal" >&5 +printf %s "checking whether we are using Heimdal... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include + +int +main (void) +{ + char *tmp = heimdal_version; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define HEIMDAL 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + else + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}krb5-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}krb5-config; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_KRB5CONF+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $KRB5CONF in + [\\/]* | ?:[\\/]*) + ac_cv_path_KRB5CONF="$KRB5CONF" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy="$KRB5ROOT/bin:$PATH" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_KRB5CONF="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +KRB5CONF=$ac_cv_path_KRB5CONF +if test -n "$KRB5CONF"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $KRB5CONF" >&5 +printf "%s\n" "$KRB5CONF" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_KRB5CONF"; then + ac_pt_KRB5CONF=$KRB5CONF + # Extract the first word of "krb5-config", so it can be a program name with args. +set dummy krb5-config; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_ac_pt_KRB5CONF+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $ac_pt_KRB5CONF in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_KRB5CONF="$ac_pt_KRB5CONF" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy="$KRB5ROOT/bin:$PATH" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_KRB5CONF="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_KRB5CONF=$ac_cv_path_ac_pt_KRB5CONF +if test -n "$ac_pt_KRB5CONF"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_KRB5CONF" >&5 +printf "%s\n" "$ac_pt_KRB5CONF" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_pt_KRB5CONF" = x; then + KRB5CONF="$KRB5ROOT/bin/krb5-config" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + KRB5CONF=$ac_pt_KRB5CONF + fi +else + KRB5CONF="$ac_cv_path_KRB5CONF" +fi + + if test -x $KRB5CONF ; then + K5CFLAGS="`$KRB5CONF --cflags`" + K5LIBS="`$KRB5CONF --libs`" + CPPFLAGS="$CPPFLAGS $K5CFLAGS" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gssapi support" >&5 +printf %s "checking for gssapi support... " >&6; } + if $KRB5CONF | grep gssapi >/dev/null ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define GSSAPI 1" >>confdefs.h + + GSSCFLAGS="`$KRB5CONF --cflags gssapi`" + GSSLIBS="`$KRB5CONF --libs gssapi`" + CPPFLAGS="$CPPFLAGS $GSSCFLAGS" + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are using Heimdal" >&5 +printf %s "checking whether we are using Heimdal... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include + +int +main (void) +{ + char *tmp = heimdal_version; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define HEIMDAL 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + else + CPPFLAGS="$CPPFLAGS -I${KRB5ROOT}/include" + LDFLAGS="$LDFLAGS -L${KRB5ROOT}/lib" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are using Heimdal" >&5 +printf %s "checking whether we are using Heimdal... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include + +int +main (void) +{ + char *tmp = heimdal_version; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + printf "%s\n" "#define HEIMDAL 1" >>confdefs.h + + K5LIBS="-lkrb5" + K5LIBS="$K5LIBS -lcom_err -lasn1" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for net_write in -lroken" >&5 +printf %s "checking for net_write in -lroken... " >&6; } +if test ${ac_cv_lib_roken_net_write+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lroken $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char net_write (); +int +main (void) +{ +return net_write (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_roken_net_write=yes +else $as_nop + ac_cv_lib_roken_net_write=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_roken_net_write" >&5 +printf "%s\n" "$ac_cv_lib_roken_net_write" >&6; } +if test "x$ac_cv_lib_roken_net_write" = xyes +then : + K5LIBS="$K5LIBS -lroken" +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for des_cbc_encrypt in -ldes" >&5 +printf %s "checking for des_cbc_encrypt in -ldes... " >&6; } +if test ${ac_cv_lib_des_des_cbc_encrypt+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldes $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char des_cbc_encrypt (); +int +main (void) +{ +return des_cbc_encrypt (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_des_des_cbc_encrypt=yes +else $as_nop + ac_cv_lib_des_des_cbc_encrypt=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_des_des_cbc_encrypt" >&5 +printf "%s\n" "$ac_cv_lib_des_des_cbc_encrypt" >&6; } +if test "x$ac_cv_lib_des_des_cbc_encrypt" = xyes +then : + K5LIBS="$K5LIBS -ldes" +fi + + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + K5LIBS="-lkrb5 -lk5crypto -lcom_err" + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing dn_expand" >&5 +printf %s "checking for library containing dn_expand... " >&6; } +if test ${ac_cv_search_dn_expand+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dn_expand (); +int +main (void) +{ +return dn_expand (); + ; + return 0; +} +_ACEOF +for ac_lib in '' resolv +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_dn_expand=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_dn_expand+y} +then : + break +fi +done +if test ${ac_cv_search_dn_expand+y} +then : + +else $as_nop + ac_cv_search_dn_expand=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dn_expand" >&5 +printf "%s\n" "$ac_cv_search_dn_expand" >&6; } +ac_res=$ac_cv_search_dn_expand +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gss_init_sec_context in -lgssapi_krb5" >&5 +printf %s "checking for gss_init_sec_context in -lgssapi_krb5... " >&6; } +if test ${ac_cv_lib_gssapi_krb5_gss_init_sec_context+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgssapi_krb5 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char gss_init_sec_context (); +int +main (void) +{ +return gss_init_sec_context (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_gssapi_krb5_gss_init_sec_context=yes +else $as_nop + ac_cv_lib_gssapi_krb5_gss_init_sec_context=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gssapi_krb5_gss_init_sec_context" >&5 +printf "%s\n" "$ac_cv_lib_gssapi_krb5_gss_init_sec_context" >&6; } +if test "x$ac_cv_lib_gssapi_krb5_gss_init_sec_context" = xyes +then : + printf "%s\n" "#define GSSAPI 1" >>confdefs.h + + GSSLIBS="-lgssapi_krb5" +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gss_init_sec_context in -lgssapi" >&5 +printf %s "checking for gss_init_sec_context in -lgssapi... " >&6; } +if test ${ac_cv_lib_gssapi_gss_init_sec_context+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgssapi $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char gss_init_sec_context (); +int +main (void) +{ +return gss_init_sec_context (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_gssapi_gss_init_sec_context=yes +else $as_nop + ac_cv_lib_gssapi_gss_init_sec_context=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gssapi_gss_init_sec_context" >&5 +printf "%s\n" "$ac_cv_lib_gssapi_gss_init_sec_context" >&6; } +if test "x$ac_cv_lib_gssapi_gss_init_sec_context" = xyes +then : + printf "%s\n" "#define GSSAPI 1" >>confdefs.h + + GSSLIBS="-lgssapi" +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gss_init_sec_context in -lgss" >&5 +printf %s "checking for gss_init_sec_context in -lgss... " >&6; } +if test ${ac_cv_lib_gss_gss_init_sec_context+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgss $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char gss_init_sec_context (); +int +main (void) +{ +return gss_init_sec_context (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_gss_gss_init_sec_context=yes +else $as_nop + ac_cv_lib_gss_gss_init_sec_context=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gss_gss_init_sec_context" >&5 +printf "%s\n" "$ac_cv_lib_gss_gss_init_sec_context" >&6; } +if test "x$ac_cv_lib_gss_gss_init_sec_context" = xyes +then : + printf "%s\n" "#define GSSAPI 1" >>confdefs.h + + GSSLIBS="-lgss" +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find any suitable gss-api library - build may fail" >&5 +printf "%s\n" "$as_me: WARNING: Cannot find any suitable gss-api library - build may fail" >&2;} +fi + + +fi + + +fi + + + ac_fn_c_check_header_compile "$LINENO" "gssapi.h" "ac_cv_header_gssapi_h" "$ac_includes_default" +if test "x$ac_cv_header_gssapi_h" = xyes +then : + +else $as_nop + unset ac_cv_header_gssapi_h + CPPFLAGS="$CPPFLAGS -I${KRB5ROOT}/include/gssapi" + for ac_header in gssapi.h +do : + ac_fn_c_check_header_compile "$LINENO" "gssapi.h" "ac_cv_header_gssapi_h" "$ac_includes_default" +if test "x$ac_cv_header_gssapi_h" = xyes +then : + printf "%s\n" "#define HAVE_GSSAPI_H 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find any suitable gss-api header - build may fail" >&5 +printf "%s\n" "$as_me: WARNING: Cannot find any suitable gss-api header - build may fail" >&2;} + +fi + +done + + +fi + + + oldCPP="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -I${KRB5ROOT}/include/gssapi" + ac_fn_c_check_header_compile "$LINENO" "gssapi_krb5.h" "ac_cv_header_gssapi_krb5_h" "$ac_includes_default" +if test "x$ac_cv_header_gssapi_krb5_h" = xyes +then : + +else $as_nop + CPPFLAGS="$oldCPP" +fi + + + fi + fi + if test -n "${rpath_opt}" ; then + LDFLAGS="$LDFLAGS ${rpath_opt}${KRB5ROOT}/lib" + fi + if test ! -z "$blibpath" ; then + blibpath="$blibpath:${KRB5ROOT}/lib" + fi + + ac_fn_c_check_header_compile "$LINENO" "gssapi.h" "ac_cv_header_gssapi_h" "$ac_includes_default" +if test "x$ac_cv_header_gssapi_h" = xyes +then : + printf "%s\n" "#define HAVE_GSSAPI_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "gssapi/gssapi.h" "ac_cv_header_gssapi_gssapi_h" "$ac_includes_default" +if test "x$ac_cv_header_gssapi_gssapi_h" = xyes +then : + printf "%s\n" "#define HAVE_GSSAPI_GSSAPI_H 1" >>confdefs.h + +fi + + ac_fn_c_check_header_compile "$LINENO" "gssapi_krb5.h" "ac_cv_header_gssapi_krb5_h" "$ac_includes_default" +if test "x$ac_cv_header_gssapi_krb5_h" = xyes +then : + printf "%s\n" "#define HAVE_GSSAPI_KRB5_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "gssapi/gssapi_krb5.h" "ac_cv_header_gssapi_gssapi_krb5_h" "$ac_includes_default" +if test "x$ac_cv_header_gssapi_gssapi_krb5_h" = xyes +then : + printf "%s\n" "#define HAVE_GSSAPI_GSSAPI_KRB5_H 1" >>confdefs.h + +fi + + ac_fn_c_check_header_compile "$LINENO" "gssapi_generic.h" "ac_cv_header_gssapi_generic_h" "$ac_includes_default" +if test "x$ac_cv_header_gssapi_generic_h" = xyes +then : + printf "%s\n" "#define HAVE_GSSAPI_GENERIC_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "gssapi/gssapi_generic.h" "ac_cv_header_gssapi_gssapi_generic_h" "$ac_includes_default" +if test "x$ac_cv_header_gssapi_gssapi_generic_h" = xyes +then : + printf "%s\n" "#define HAVE_GSSAPI_GSSAPI_GENERIC_H 1" >>confdefs.h + +fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing k_hasafs" >&5 +printf %s "checking for library containing k_hasafs... " >&6; } +if test ${ac_cv_search_k_hasafs+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char k_hasafs (); +int +main (void) +{ +return k_hasafs (); + ; + return 0; +} +_ACEOF +for ac_lib in '' kafs +do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO" +then : + ac_cv_search_k_hasafs=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_k_hasafs+y} +then : + break +fi +done +if test ${ac_cv_search_k_hasafs+y} +then : + +else $as_nop + ac_cv_search_k_hasafs=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_k_hasafs" >&5 +printf "%s\n" "$ac_cv_search_k_hasafs" >&6; } +ac_res=$ac_cv_search_k_hasafs +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +printf "%s\n" "#define USE_AFS 1" >>confdefs.h + +fi + + + ac_fn_check_decl "$LINENO" "GSS_C_NT_HOSTBASED_SERVICE" "ac_cv_have_decl_GSS_C_NT_HOSTBASED_SERVICE" " +#ifdef HAVE_GSSAPI_H +# include +#elif defined(HAVE_GSSAPI_GSSAPI_H) +# include +#endif + +#ifdef HAVE_GSSAPI_GENERIC_H +# include +#elif defined(HAVE_GSSAPI_GSSAPI_GENERIC_H) +# include +#endif + +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_GSS_C_NT_HOSTBASED_SERVICE" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_GSS_C_NT_HOSTBASED_SERVICE $ac_have_decl" >>confdefs.h + + saved_LIBS="$LIBS" + LIBS="$LIBS $K5LIBS" + ac_fn_c_check_func "$LINENO" "krb5_cc_new_unique" "ac_cv_func_krb5_cc_new_unique" +if test "x$ac_cv_func_krb5_cc_new_unique" = xyes +then : + printf "%s\n" "#define HAVE_KRB5_CC_NEW_UNIQUE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "krb5_get_error_message" "ac_cv_func_krb5_get_error_message" +if test "x$ac_cv_func_krb5_get_error_message" = xyes +then : + printf "%s\n" "#define HAVE_KRB5_GET_ERROR_MESSAGE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "krb5_free_error_message" "ac_cv_func_krb5_free_error_message" +if test "x$ac_cv_func_krb5_free_error_message" = xyes +then : + printf "%s\n" "#define HAVE_KRB5_FREE_ERROR_MESSAGE 1" >>confdefs.h + +fi + + LIBS="$saved_LIBS" + + fi + + +fi + + + + + +# Looking for programs, paths and files + +PRIVSEP_PATH=/var/empty + +# Check whether --with-privsep-path was given. +if test ${with_privsep_path+y} +then : + withval=$with_privsep_path; + if test -n "$withval" && test "x$withval" != "xno" && \ + test "x${withval}" != "xyes"; then + PRIVSEP_PATH=$withval + fi + + +fi + + + + +# Check whether --with-xauth was given. +if test ${with_xauth+y} +then : + withval=$with_xauth; + if test -n "$withval" && test "x$withval" != "xno" && \ + test "x${withval}" != "xyes"; then + xauth_path=$withval + fi + +else $as_nop + + TestPath="$PATH" + TestPath="${TestPath}${PATH_SEPARATOR}/usr/X/bin" + TestPath="${TestPath}${PATH_SEPARATOR}/usr/bin/X11" + TestPath="${TestPath}${PATH_SEPARATOR}/usr/X11R6/bin" + TestPath="${TestPath}${PATH_SEPARATOR}/usr/openwin/bin" + # Extract the first word of "xauth", so it can be a program name with args. +set dummy xauth; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_xauth_path+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $xauth_path in + [\\/]* | ?:[\\/]*) + ac_cv_path_xauth_path="$xauth_path" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $TestPath +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_xauth_path="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +xauth_path=$ac_cv_path_xauth_path +if test -n "$xauth_path"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $xauth_path" >&5 +printf "%s\n" "$xauth_path" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + if (test ! -z "$xauth_path" && test -x "/usr/openwin/bin/xauth") ; then + xauth_path="/usr/openwin/bin/xauth" + fi + + +fi + + +STRIP_OPT=-s +# Check whether --enable-strip was given. +if test ${enable_strip+y} +then : + enableval=$enable_strip; + if test "x$enableval" = "xno" ; then + STRIP_OPT= + fi + + +fi + + + +if test -z "$xauth_path" ; then + XAUTH_PATH="undefined" + +else + +printf "%s\n" "#define XAUTH_PATH \"$xauth_path\"" >>confdefs.h + + XAUTH_PATH=$xauth_path + +fi + +# Check for mail directory + +# Check whether --with-maildir was given. +if test ${with_maildir+y} +then : + withval=$with_maildir; + if test "X$withval" != X && test "x$withval" != xno && \ + test "x${withval}" != xyes; then + +printf "%s\n" "#define MAIL_DIRECTORY \"$withval\"" >>confdefs.h + + fi + +else $as_nop + + if test "X$maildir" != "X"; then + printf "%s\n" "#define MAIL_DIRECTORY \"$maildir\"" >>confdefs.h + + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking Discovering system mail directory" >&5 +printf %s "checking Discovering system mail directory... " >&6; } + if test "$cross_compiling" = yes +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: use --with-maildir=/path/to/mail" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: use --with-maildir=/path/to/mail" >&2;} + + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +#ifdef HAVE_PATHS_H +#include +#endif +#ifdef HAVE_MAILLOCK_H +#include +#endif +#define DATA "conftest.maildir" + +int +main (void) +{ + + FILE *fd; + int rc; + + fd = fopen(DATA,"w"); + if(fd == NULL) + exit(1); + +#if defined (_PATH_MAILDIR) + if ((rc = fprintf(fd ,"_PATH_MAILDIR:%s\n", _PATH_MAILDIR)) <0) + exit(1); +#elif defined (MAILDIR) + if ((rc = fprintf(fd ,"MAILDIR:%s\n", MAILDIR)) <0) + exit(1); +#elif defined (_PATH_MAIL) + if ((rc = fprintf(fd ,"_PATH_MAIL:%s\n", _PATH_MAIL)) <0) + exit(1); +#else + exit (2); +#endif + + exit(0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + + maildir_what=`awk -F: '{print $1}' conftest.maildir` + maildir=`awk -F: '{print $2}' conftest.maildir \ + | sed 's|/$||'` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Using: $maildir from $maildir_what" >&5 +printf "%s\n" "Using: $maildir from $maildir_what" >&6; } + if test "x$maildir_what" != "x_PATH_MAILDIR"; then + printf "%s\n" "#define MAIL_DIRECTORY \"$maildir\"" >>confdefs.h + + fi + +else $as_nop + + if test "X$ac_status" = "X2";then +# our test program didn't find it. Default to /var/spool/mail + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Using: default value of /var/spool/mail" >&5 +printf "%s\n" "Using: default value of /var/spool/mail" >&6; } + printf "%s\n" "#define MAIL_DIRECTORY \"/var/spool/mail\"" >>confdefs.h + + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: *** not found ***" >&5 +printf "%s\n" "*** not found ***" >&6; } + fi + +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi + + +fi + # maildir + +if test ! -z "$cross_compiling" && test "x$cross_compiling" = "xyes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: Disabling /dev/ptmx test" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: Disabling /dev/ptmx test" >&2;} + disable_ptmx_check=yes +fi +if test -z "$no_dev_ptmx" ; then + if test "x$disable_ptmx_check" != "xyes" ; then + as_ac_File=`printf "%s\n" "ac_cv_file_"/dev/ptmx"" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for \"/dev/ptmx\"" >&5 +printf %s "checking for \"/dev/ptmx\"... " >&6; } +if eval test \${$as_ac_File+y} +then : + printf %s "(cached) " >&6 +else $as_nop + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r ""/dev/ptmx""; then + eval "$as_ac_File=yes" +else + eval "$as_ac_File=no" +fi +fi +eval ac_res=\$$as_ac_File + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_ac_File"\" = x"yes" +then : + + +printf "%s\n" "#define HAVE_DEV_PTMX 1" >>confdefs.h + + have_dev_ptmx=1 + + +fi + + fi +fi + +if test ! -z "$cross_compiling" && test "x$cross_compiling" != "xyes"; then + as_ac_File=`printf "%s\n" "ac_cv_file_"/dev/ptc"" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for \"/dev/ptc\"" >&5 +printf %s "checking for \"/dev/ptc\"... " >&6; } +if eval test \${$as_ac_File+y} +then : + printf %s "(cached) " >&6 +else $as_nop + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r ""/dev/ptc""; then + eval "$as_ac_File=yes" +else + eval "$as_ac_File=no" +fi +fi +eval ac_res=\$$as_ac_File + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_ac_File"\" = x"yes" +then : + + +printf "%s\n" "#define HAVE_DEV_PTS_AND_PTC 1" >>confdefs.h + + have_dev_ptc=1 + + +fi + +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: Disabling /dev/ptc test" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: Disabling /dev/ptc test" >&2;} +fi + +# Options from here on. Some of these are preset by platform above + +# Check whether --with-mantype was given. +if test ${with_mantype+y} +then : + withval=$with_mantype; + case "$withval" in + man|cat|doc) + MANTYPE=$withval + ;; + *) + as_fn_error $? "invalid man type: $withval" "$LINENO" 5 + ;; + esac + + +fi + +if test -z "$MANTYPE"; then + if ${MANDOC} ${srcdir}/ssh.1 >/dev/null 2>&1; then + MANTYPE=doc + elif ${NROFF} -mdoc ${srcdir}/ssh.1 >/dev/null 2>&1; then + MANTYPE=doc + elif ${NROFF} -man ${srcdir}/ssh.1 >/dev/null 2>&1; then + MANTYPE=man + else + MANTYPE=cat + fi +fi + +if test "$MANTYPE" = "doc"; then + mansubdir=man; +else + mansubdir=$MANTYPE; +fi + + +# Whether to disable shadow password support + +# Check whether --with-shadow was given. +if test ${with_shadow+y} +then : + withval=$with_shadow; + if test "x$withval" = "xno" ; then + printf "%s\n" "#define DISABLE_SHADOW 1" >>confdefs.h + + disable_shadow=yes + fi + + +fi + + +if test -z "$disable_shadow" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the systems has expire shadow information" >&5 +printf %s "checking if the systems has expire shadow information... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +struct spwd sp; + +int +main (void) +{ + sp.sp_expire = sp.sp_lstchg = sp.sp_inact = 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + sp_expire_available=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + + if test "x$sp_expire_available" = "xyes" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define HAS_SHADOW_EXPIRE 1" >>confdefs.h + + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi +fi + +# Use ip address instead of hostname in $DISPLAY +if test ! -z "$IPADDR_IN_DISPLAY" ; then + DISPLAY_HACK_MSG="yes" + +printf "%s\n" "#define IPADDR_IN_DISPLAY 1" >>confdefs.h + +else + DISPLAY_HACK_MSG="no" + +# Check whether --with-ipaddr-display was given. +if test ${with_ipaddr_display+y} +then : + withval=$with_ipaddr_display; + if test "x$withval" != "xno" ; then + printf "%s\n" "#define IPADDR_IN_DISPLAY 1" >>confdefs.h + + DISPLAY_HACK_MSG="yes" + fi + + +fi + +fi + +# check for /etc/default/login and use it if present. +# Check whether --enable-etc-default-login was given. +if test ${enable_etc_default_login+y} +then : + enableval=$enable_etc_default_login; if test "x$enableval" = "xno"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: /etc/default/login handling disabled" >&5 +printf "%s\n" "$as_me: /etc/default/login handling disabled" >&6;} + etc_default_login=no + else + etc_default_login=yes + fi +else $as_nop + if test ! -z "$cross_compiling" && test "x$cross_compiling" = "xyes"; + then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: not checking /etc/default/login" >&5 +printf "%s\n" "$as_me: WARNING: cross compiling: not checking /etc/default/login" >&2;} + etc_default_login=no + else + etc_default_login=yes + fi + +fi + + +if test "x$etc_default_login" != "xno"; then + as_ac_File=`printf "%s\n" "ac_cv_file_"/etc/default/login"" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for \"/etc/default/login\"" >&5 +printf %s "checking for \"/etc/default/login\"... " >&6; } +if eval test \${$as_ac_File+y} +then : + printf %s "(cached) " >&6 +else $as_nop + test "$cross_compiling" = yes && + as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 +if test -r ""/etc/default/login""; then + eval "$as_ac_File=yes" +else + eval "$as_ac_File=no" +fi +fi +eval ac_res=\$$as_ac_File + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_ac_File"\" = x"yes" +then : + external_path_file=/etc/default/login +fi + + if test "x$external_path_file" = "x/etc/default/login"; then + +printf "%s\n" "#define HAVE_ETC_DEFAULT_LOGIN 1" >>confdefs.h + + fi +fi + +if test $ac_cv_func_login_getcapbool = "yes" && \ + test $ac_cv_header_login_cap_h = "yes" ; then + external_path_file=/etc/login.conf +fi + +# Whether to mess with the default path +SERVER_PATH_MSG="(default)" + +# Check whether --with-default-path was given. +if test ${with_default_path+y} +then : + withval=$with_default_path; + if test "x$external_path_file" = "x/etc/login.conf" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: +--with-default-path=PATH has no effect on this system. +Edit /etc/login.conf instead." >&5 +printf "%s\n" "$as_me: WARNING: +--with-default-path=PATH has no effect on this system. +Edit /etc/login.conf instead." >&2;} + elif test "x$withval" != "xno" ; then + if test ! -z "$external_path_file" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: +--with-default-path=PATH will only be used if PATH is not defined in +$external_path_file ." >&5 +printf "%s\n" "$as_me: WARNING: +--with-default-path=PATH will only be used if PATH is not defined in +$external_path_file ." >&2;} + fi + user_path="$withval" + SERVER_PATH_MSG="$withval" + fi + +else $as_nop + if test "x$external_path_file" = "x/etc/login.conf" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Make sure the path to scp is in /etc/login.conf" >&5 +printf "%s\n" "$as_me: WARNING: Make sure the path to scp is in /etc/login.conf" >&2;} + else + if test ! -z "$external_path_file" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: +If PATH is defined in $external_path_file, ensure the path to scp is included, +otherwise scp will not work." >&5 +printf "%s\n" "$as_me: WARNING: +If PATH is defined in $external_path_file, ensure the path to scp is included, +otherwise scp will not work." >&2;} + fi + if test "$cross_compiling" = yes +then : + user_path="/usr/bin:/bin:/usr/sbin:/sbin" + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* find out what STDPATH is */ +#include +#include +#ifdef HAVE_PATHS_H +# include +#endif +#ifndef _PATH_STDPATH +# ifdef _PATH_USERPATH /* Irix */ +# define _PATH_STDPATH _PATH_USERPATH +# else +# define _PATH_STDPATH "/usr/bin:/bin:/usr/sbin:/sbin" +# endif +#endif +#include +#include +#include +#define DATA "conftest.stdpath" + +int +main (void) +{ + + FILE *fd; + int rc; + + fd = fopen(DATA,"w"); + if(fd == NULL) + exit(1); + + if ((rc = fprintf(fd,"%s", _PATH_STDPATH)) < 0) + exit(1); + + exit(0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + user_path=`cat conftest.stdpath` +else $as_nop + user_path="/usr/bin:/bin:/usr/sbin:/sbin" +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +# make sure $bindir is in USER_PATH so scp will work + t_bindir="${bindir}" + while echo "${t_bindir}" | egrep '\$\{|NONE/' >/dev/null 2>&1; do + t_bindir=`eval echo ${t_bindir}` + case $t_bindir in + NONE/*) t_bindir=`echo $t_bindir | sed "s~NONE~$prefix~"` ;; + esac + case $t_bindir in + NONE/*) t_bindir=`echo $t_bindir | sed "s~NONE~$ac_default_prefix~"` ;; + esac + done + echo $user_path | grep ":$t_bindir" > /dev/null 2>&1 + if test $? -ne 0 ; then + echo $user_path | grep "^$t_bindir" > /dev/null 2>&1 + if test $? -ne 0 ; then + user_path=$user_path:$t_bindir + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Adding $t_bindir to USER_PATH so scp will work" >&5 +printf "%s\n" "Adding $t_bindir to USER_PATH so scp will work" >&6; } + fi + fi + fi + +fi + +if test "x$external_path_file" != "x/etc/login.conf" ; then + +printf "%s\n" "#define USER_PATH \"$user_path\"" >>confdefs.h + + +fi + +# Set superuser path separately to user path + +# Check whether --with-superuser-path was given. +if test ${with_superuser_path+y} +then : + withval=$with_superuser_path; + if test -n "$withval" && test "x$withval" != "xno" && \ + test "x${withval}" != "xyes"; then + +printf "%s\n" "#define SUPERUSER_PATH \"$withval\"" >>confdefs.h + + superuser_path=$withval + fi + + +fi + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we need to convert IPv4 in IPv6-mapped addresses" >&5 +printf %s "checking if we need to convert IPv4 in IPv6-mapped addresses... " >&6; } +IPV4_IN6_HACK_MSG="no" + +# Check whether --with-4in6 was given. +if test ${with_4in6+y} +then : + withval=$with_4in6; + if test "x$withval" != "xno" ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define IPV4_IN_IPV6 1" >>confdefs.h + + IPV4_IN6_HACK_MSG="yes" + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + +else $as_nop + + if test "x$inet6_default_4in6" = "xyes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (default)" >&5 +printf "%s\n" "yes (default)" >&6; } + printf "%s\n" "#define IPV4_IN_IPV6 1" >>confdefs.h + + IPV4_IN6_HACK_MSG="yes" + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no (default)" >&5 +printf "%s\n" "no (default)" >&6; } + fi + + +fi + + +# Whether to enable BSD auth support +BSD_AUTH_MSG=no + +# Check whether --with-bsd-auth was given. +if test ${with_bsd_auth+y} +then : + withval=$with_bsd_auth; + if test "x$withval" != "xno" ; then + +printf "%s\n" "#define BSD_AUTH 1" >>confdefs.h + + BSD_AUTH_MSG=yes + fi + + +fi + + +# Where to place sshd.pid +piddir=/var/run +# make sure the directory exists +if test ! -d $piddir ; then + piddir=`eval echo ${sysconfdir}` + case $piddir in + NONE/*) piddir=`echo $piddir | sed "s~NONE~$ac_default_prefix~"` ;; + esac +fi + + +# Check whether --with-pid-dir was given. +if test ${with_pid_dir+y} +then : + withval=$with_pid_dir; + if test -n "$withval" && test "x$withval" != "xno" && \ + test "x${withval}" != "xyes"; then + piddir=$withval + if test ! -d $piddir ; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ** no $piddir directory on this system **" >&5 +printf "%s\n" "$as_me: WARNING: ** no $piddir directory on this system **" >&2;} + fi + fi + + +fi + + + +printf "%s\n" "#define _PATH_SSH_PIDDIR \"$piddir\"" >>confdefs.h + + + + +# Check whether --enable-fd-passing was given. +if test ${enable_fd_passing+y} +then : + enableval=$enable_fd_passing; + if test "x$enableval" = "xno" ; then + printf "%s\n" "#define DISABLE_FD_PASSING 1" >>confdefs.h + + fi + + +fi + + +# Check whether --enable-lastlog was given. +if test ${enable_lastlog+y} +then : + enableval=$enable_lastlog; + if test "x$enableval" = "xno" ; then + printf "%s\n" "#define DISABLE_LASTLOG 1" >>confdefs.h + + fi + + +fi + +# Check whether --enable-utmp was given. +if test ${enable_utmp+y} +then : + enableval=$enable_utmp; + if test "x$enableval" = "xno" ; then + printf "%s\n" "#define DISABLE_UTMP 1" >>confdefs.h + + fi + + +fi + +# Check whether --enable-utmpx was given. +if test ${enable_utmpx+y} +then : + enableval=$enable_utmpx; + if test "x$enableval" = "xno" ; then + +printf "%s\n" "#define DISABLE_UTMPX 1" >>confdefs.h + + fi + + +fi + +# Check whether --enable-wtmp was given. +if test ${enable_wtmp+y} +then : + enableval=$enable_wtmp; + if test "x$enableval" = "xno" ; then + printf "%s\n" "#define DISABLE_WTMP 1" >>confdefs.h + + fi + + +fi + +# Check whether --enable-wtmpx was given. +if test ${enable_wtmpx+y} +then : + enableval=$enable_wtmpx; + if test "x$enableval" = "xno" ; then + +printf "%s\n" "#define DISABLE_WTMPX 1" >>confdefs.h + + fi + + +fi + +# Check whether --enable-libutil was given. +if test ${enable_libutil+y} +then : + enableval=$enable_libutil; + if test "x$enableval" = "xno" ; then + printf "%s\n" "#define DISABLE_LOGIN 1" >>confdefs.h + + fi + + +fi + +# Check whether --enable-pututline was given. +if test ${enable_pututline+y} +then : + enableval=$enable_pututline; + if test "x$enableval" = "xno" ; then + +printf "%s\n" "#define DISABLE_PUTUTLINE 1" >>confdefs.h + + fi + + +fi + +# Check whether --enable-pututxline was given. +if test ${enable_pututxline+y} +then : + enableval=$enable_pututxline; + if test "x$enableval" = "xno" ; then + +printf "%s\n" "#define DISABLE_PUTUTXLINE 1" >>confdefs.h + + fi + + +fi + + +# Check whether --with-lastlog was given. +if test ${with_lastlog+y} +then : + withval=$with_lastlog; + if test "x$withval" = "xno" ; then + printf "%s\n" "#define DISABLE_LASTLOG 1" >>confdefs.h + + elif test -n "$withval" && test "x${withval}" != "xyes"; then + conf_lastlog_location=$withval + fi + + +fi + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if your system defines LASTLOG_FILE" >&5 +printf %s "checking if your system defines LASTLOG_FILE... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#ifdef HAVE_LASTLOG_H +# include +#endif +#ifdef HAVE_PATHS_H +# include +#endif +#ifdef HAVE_LOGIN_H +# include +#endif + +int +main (void) +{ + char *lastlog = LASTLOG_FILE; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if your system defines _PATH_LASTLOG" >&5 +printf %s "checking if your system defines _PATH_LASTLOG... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#ifdef HAVE_LASTLOG_H +# include +#endif +#ifdef HAVE_PATHS_H +# include +#endif + +int +main (void) +{ + char *lastlog = _PATH_LASTLOG; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + system_lastlog_path=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +if test -z "$conf_lastlog_location"; then + if test x"$system_lastlog_path" = x"no" ; then + for f in /var/log/lastlog /usr/adm/lastlog /var/adm/lastlog /etc/security/lastlog ; do + if (test -d "$f" || test -f "$f") ; then + conf_lastlog_location=$f + fi + done + if test -z "$conf_lastlog_location"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ** Cannot find lastlog **" >&5 +printf "%s\n" "$as_me: WARNING: ** Cannot find lastlog **" >&2;} + fi + fi +fi + +if test -n "$conf_lastlog_location"; then + +printf "%s\n" "#define CONF_LASTLOG_FILE \"$conf_lastlog_location\"" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if your system defines UTMP_FILE" >&5 +printf %s "checking if your system defines UTMP_FILE... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#ifdef HAVE_PATHS_H +# include +#endif + +int +main (void) +{ + char *utmp = UTMP_FILE; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + system_utmp_path=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +if test -z "$conf_utmp_location"; then + if test x"$system_utmp_path" = x"no" ; then + for f in /etc/utmp /usr/adm/utmp /var/run/utmp; do + if test -f $f ; then + conf_utmp_location=$f + fi + done + if test -z "$conf_utmp_location"; then + printf "%s\n" "#define DISABLE_UTMP 1" >>confdefs.h + + fi + fi +fi +if test -n "$conf_utmp_location"; then + +printf "%s\n" "#define CONF_UTMP_FILE \"$conf_utmp_location\"" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if your system defines WTMP_FILE" >&5 +printf %s "checking if your system defines WTMP_FILE... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#ifdef HAVE_PATHS_H +# include +#endif + +int +main (void) +{ + char *wtmp = WTMP_FILE; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + system_wtmp_path=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +if test -z "$conf_wtmp_location"; then + if test x"$system_wtmp_path" = x"no" ; then + for f in /usr/adm/wtmp /var/log/wtmp; do + if test -f $f ; then + conf_wtmp_location=$f + fi + done + if test -z "$conf_wtmp_location"; then + printf "%s\n" "#define DISABLE_WTMP 1" >>confdefs.h + + fi + fi +fi +if test -n "$conf_wtmp_location"; then + +printf "%s\n" "#define CONF_WTMP_FILE \"$conf_wtmp_location\"" >>confdefs.h + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if your system defines WTMPX_FILE" >&5 +printf %s "checking if your system defines WTMPX_FILE... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#ifdef HAVE_UTMPX_H +#include +#endif +#ifdef HAVE_PATHS_H +# include +#endif + +int +main (void) +{ + char *wtmpx = WTMPX_FILE; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + system_wtmpx_path=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +if test -z "$conf_wtmpx_location"; then + if test x"$system_wtmpx_path" = x"no" ; then + printf "%s\n" "#define DISABLE_WTMPX 1" >>confdefs.h + + fi +else + +printf "%s\n" "#define CONF_WTMPX_FILE \"$conf_wtmpx_location\"" >>confdefs.h + +fi + + +if test ! -z "$blibpath" ; then + LDFLAGS="$LDFLAGS $blibflags$blibpath" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Please check and edit blibpath in LDFLAGS in Makefile" >&5 +printf "%s\n" "$as_me: WARNING: Please check and edit blibpath in LDFLAGS in Makefile" >&2;} +fi + +ac_fn_c_check_member "$LINENO" "struct lastlog" "ll_line" "ac_cv_member_struct_lastlog_ll_line" " +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_UTMP_H +#include +#endif +#ifdef HAVE_UTMPX_H +#include +#endif +#ifdef HAVE_LASTLOG_H +#include +#endif + +" +if test "x$ac_cv_member_struct_lastlog_ll_line" = xyes +then : + +else $as_nop + + if test x$SKIP_DISABLE_LASTLOG_DEFINE != "xyes" ; then + printf "%s\n" "#define DISABLE_LASTLOG 1" >>confdefs.h + + fi + +fi + + +ac_fn_c_check_member "$LINENO" "struct utmp" "ut_line" "ac_cv_member_struct_utmp_ut_line" " +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_UTMP_H +#include +#endif +#ifdef HAVE_UTMPX_H +#include +#endif +#ifdef HAVE_LASTLOG_H +#include +#endif + +" +if test "x$ac_cv_member_struct_utmp_ut_line" = xyes +then : + +else $as_nop + + printf "%s\n" "#define DISABLE_UTMP 1" >>confdefs.h + + printf "%s\n" "#define DISABLE_WTMP 1" >>confdefs.h + + +fi + + +CFLAGS="$CFLAGS $werror_flags" + +if test "x$ac_cv_func_getaddrinfo" != "xyes" ; then + TEST_SSH_IPV6=no +else + TEST_SSH_IPV6=yes +fi +ac_fn_check_decl "$LINENO" "BROKEN_GETADDRINFO" "ac_cv_have_decl_BROKEN_GETADDRINFO" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_BROKEN_GETADDRINFO" = xyes +then : + TEST_SSH_IPV6=no +fi +TEST_SSH_IPV6=$TEST_SSH_IPV6 + +TEST_SSH_UTF8=$TEST_SSH_UTF8 + +TEST_MALLOC_OPTIONS=$TEST_MALLOC_OPTIONS + +UNSUPPORTED_ALGORITHMS=$unsupported_algorithms + +DEPEND=$(cat $srcdir/.depend) + + +# Binaries for interop tests. +# Extract the first word of "plink", so it can be a program name with args. +set dummy plink; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_PLINK+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $PLINK in + [\\/]* | ?:[\\/]*) + ac_cv_path_PLINK="$PLINK" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_PLINK="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PLINK=$ac_cv_path_PLINK +if test -n "$PLINK"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PLINK" >&5 +printf "%s\n" "$PLINK" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "puttygen", so it can be a program name with args. +set dummy puttygen; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_PUTTYGEN+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $PUTTYGEN in + [\\/]* | ?:[\\/]*) + ac_cv_path_PUTTYGEN="$PUTTYGEN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_PUTTYGEN="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PUTTYGEN=$ac_cv_path_PUTTYGEN +if test -n "$PUTTYGEN"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PUTTYGEN" >&5 +printf "%s\n" "$PUTTYGEN" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "conch", so it can be a program name with args. +set dummy conch; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_CONCH+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $CONCH in + [\\/]* | ?:[\\/]*) + ac_cv_path_CONCH="$CONCH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_CONCH="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +CONCH=$ac_cv_path_CONCH +if test -n "$CONCH"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CONCH" >&5 +printf "%s\n" "$CONCH" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "dropbear", so it can be a program name with args. +set dummy dropbear; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_DROPBEAR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $DROPBEAR in + [\\/]* | ?:[\\/]*) + ac_cv_path_DROPBEAR="$DROPBEAR" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_DROPBEAR="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DROPBEAR=$ac_cv_path_DROPBEAR +if test -n "$DROPBEAR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DROPBEAR" >&5 +printf "%s\n" "$DROPBEAR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "dbclient", so it can be a program name with args. +set dummy dbclient; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_DBCLIENT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $DBCLIENT in + [\\/]* | ?:[\\/]*) + ac_cv_path_DBCLIENT="$DBCLIENT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_DBCLIENT="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DBCLIENT=$ac_cv_path_DBCLIENT +if test -n "$DBCLIENT"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DBCLIENT" >&5 +printf "%s\n" "$DBCLIENT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "dropbearkey", so it can be a program name with args. +set dummy dropbearkey; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_DROPBEARKEY+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $DROPBEARKEY in + [\\/]* | ?:[\\/]*) + ac_cv_path_DROPBEARKEY="$DROPBEARKEY" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_DROPBEARKEY="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DROPBEARKEY=$ac_cv_path_DROPBEARKEY +if test -n "$DROPBEARKEY"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DROPBEARKEY" >&5 +printf "%s\n" "$DROPBEARKEY" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "dropbearconvert", so it can be a program name with args. +set dummy dropbearconvert; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_DROPBEARCONVERT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $DROPBEARCONVERT in + [\\/]* | ?:[\\/]*) + ac_cv_path_DROPBEARCONVERT="$DROPBEARCONVERT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_DROPBEARCONVERT="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DROPBEARCONVERT=$ac_cv_path_DROPBEARCONVERT +if test -n "$DROPBEARCONVERT"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DROPBEARCONVERT" >&5 +printf "%s\n" "$DROPBEARCONVERT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "tmux", so it can be a program name with args. +set dummy tmux; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_TMUX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $TMUX in + [\\/]* | ?:[\\/]*) + ac_cv_path_TMUX="$TMUX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_TMUX="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +TMUX=$ac_cv_path_TMUX +if test -n "$TMUX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TMUX" >&5 +printf "%s\n" "$TMUX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + +CFLAGS="${CFLAGS} ${CFLAGS_AFTER}" +LDFLAGS="${LDFLAGS} ${LDFLAGS_AFTER}" + +# Make a copy of CFLAGS/LDFLAGS without PIE options. +LDFLAGS_NOPIE=`echo "$LDFLAGS" | sed 's/^-pie //;s/ -pie//g'` +CFLAGS_NOPIE=`echo "$CFLAGS" | sed 's/^-fPIE //;s/ -fPIE//g'` + + + + + +ac_config_files="$ac_config_files Makefile buildpkg.sh opensshd.init openssh.xml openbsd-compat/Makefile openbsd-compat/regress/Makefile survey.sh" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else $as_nop + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else $as_nop + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else $as_nop + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by OpenSSH $as_me Portable, which was +generated by GNU Autoconf 2.71. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Report bugs to ." + +_ACEOF +ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` +ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config='$ac_cs_config_escaped' +ac_cs_version="\\ +OpenSSH config.status Portable +configured by $0, generated by GNU Autoconf 2.71, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2021 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + printf "%s\n" "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + printf "%s\n" "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + printf "%s\n" "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + printf "%s\n" "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "buildpkg.sh") CONFIG_FILES="$CONFIG_FILES buildpkg.sh" ;; + "opensshd.init") CONFIG_FILES="$CONFIG_FILES opensshd.init" ;; + "openssh.xml") CONFIG_FILES="$CONFIG_FILES openssh.xml" ;; + "openbsd-compat/Makefile") CONFIG_FILES="$CONFIG_FILES openbsd-compat/Makefile" ;; + "openbsd-compat/regress/Makefile") CONFIG_FILES="$CONFIG_FILES openbsd-compat/regress/Makefile" ;; + "survey.sh") CONFIG_FILES="$CONFIG_FILES survey.sh" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files + test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +printf "%s\n" "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`printf "%s\n" "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + printf "%s\n" "/* $configure_input */" >&1 \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + printf "%s\n" "/* $configure_input */" >&1 \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi + ;; + + + esac + +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + +# Print summary of options + +# Someone please show me a better way :) +A=`eval echo ${prefix}` ; A=`eval echo ${A}` +B=`eval echo ${bindir}` ; B=`eval echo ${B}` +C=`eval echo ${sbindir}` ; C=`eval echo ${C}` +D=`eval echo ${sysconfdir}` ; D=`eval echo ${D}` +E=`eval echo ${libexecdir}/ssh-askpass` ; E=`eval echo ${E}` +F=`eval echo ${mandir}/${mansubdir}X` ; F=`eval echo ${F}` +G=`eval echo ${piddir}` ; G=`eval echo ${G}` +H=`eval echo ${PRIVSEP_PATH}` ; H=`eval echo ${H}` +I=`eval echo ${user_path}` ; I=`eval echo ${I}` +J=`eval echo ${superuser_path}` ; J=`eval echo ${J}` + +echo "" +echo "OpenSSH has been configured with the following options:" +echo " User binaries: $B" +echo " System binaries: $C" +echo " Configuration files: $D" +echo " Askpass program: $E" +echo " Manual pages: $F" +echo " PID file: $G" +echo " Privilege separation chroot path: $H" +if test "x$external_path_file" = "x/etc/login.conf" ; then +echo " At runtime, sshd will use the path defined in $external_path_file" +echo " Make sure the path to scp is present, otherwise scp will not work" +else +echo " sshd default user PATH: $I" + if test ! -z "$external_path_file"; then +echo " (If PATH is set in $external_path_file it will be used instead. If" +echo " used, ensure the path to scp is present, otherwise scp will not work.)" + fi +fi +if test ! -z "$superuser_path" ; then +echo " sshd superuser user PATH: $J" +fi +echo " Manpage format: $MANTYPE" +echo " PAM support: $PAM_MSG" +echo " OSF SIA support: $SIA_MSG" +echo " KerberosV support: $KRB5_MSG" +echo " SELinux support: $SELINUX_MSG" +echo " libedit support: $LIBEDIT_MSG" +echo " libldns support: $LDNS_MSG" +echo " Solaris process contract support: $SPC_MSG" +echo " Solaris project support: $SP_MSG" +echo " Solaris privilege support: $SPP_MSG" +echo " IP address in \$DISPLAY hack: $DISPLAY_HACK_MSG" +echo " Translate v4 in v6 hack: $IPV4_IN6_HACK_MSG" +echo " BSD Auth support: $BSD_AUTH_MSG" +echo " Random number source: $RAND_MSG" +echo " Privsep sandbox style: $SANDBOX_STYLE" +echo " PKCS#11 support: $enable_pkcs11" +echo " U2F/FIDO support: $enable_sk" + +echo "" + +echo " Host: ${host}" +echo " Compiler: ${CC}" +echo " Compiler flags: ${CFLAGS}" +echo "Preprocessor flags: ${CPPFLAGS}" +echo " Linker flags: ${LDFLAGS}" +echo " Libraries: ${LIBS}" +if test ! -z "${CHANNELLIBS}"; then +echo " +for channels: ${CHANNELLIBS}" +fi +if test ! -z "${LIBFIDO2}"; then +echo " +for FIDO2: ${LIBFIDO2}" +fi +if test ! -z "${SSHDLIBS}"; then +echo " +for sshd: ${SSHDLIBS}" +fi + +echo "" + +if test "x$MAKE_PACKAGE_SUPPORTED" = "xyes" ; then + echo "SVR4 style packages are supported with \"make package\"" + echo "" +fi + +if test "x$PAM_MSG" = "xyes" ; then + echo "PAM is enabled. You may need to install a PAM control file " + echo "for sshd, otherwise password authentication may fail. " + echo "Example PAM control files can be found in the contrib/ " + echo "subdirectory" + echo "" +fi + +if test ! -z "$NO_PEERCHECK" ; then + echo "WARNING: the operating system that you are using does not" + echo "appear to support getpeereid(), getpeerucred() or the" + echo "SO_PEERCRED getsockopt() option. These facilities are used to" + echo "enforce security checks to prevent unauthorised connections to" + echo "ssh-agent. Their absence increases the risk that a malicious" + echo "user can connect to your agent." + echo "" +fi + +if test "$AUDIT_MODULE" = "bsm" ; then + echo "WARNING: BSM audit support is currently considered EXPERIMENTAL." + echo "See the Solaris section in README.platform for details." +fi diff --git a/moduli.0 b/moduli.0 new file mode 100644 index 000000000000..616f89420537 --- /dev/null +++ b/moduli.0 @@ -0,0 +1,74 @@ +MODULI(5) File Formats Manual MODULI(5) + +NAME + moduli M-bM-^@M-^S Diffie-Hellman moduli + +DESCRIPTION + The /etc/moduli file contains prime numbers and generators for use by + sshd(8) in the Diffie-Hellman Group Exchange key exchange method. + + New moduli may be generated with ssh-keygen(1) using a two-step process. + An initial candidate generation pass, using ssh-keygen -M generate, + calculates numbers that are likely to be useful. A second primality + testing pass, using ssh-keygen -M screen, provides a high degree of + assurance that the numbers are prime and are safe for use in Diffie- + Hellman operations by sshd(8). This moduli format is used as the output + from each pass. + + The file consists of newline-separated records, one per modulus, + containing seven space-separated fields. These fields are as follows: + + timestamp The time that the modulus was last processed as + YYYYMMDDHHMMSS. + + type Decimal number specifying the internal structure of + the prime modulus. Supported types are: + + 0 Unknown, not tested. + 2 "Safe" prime; (p-1)/2 is also prime. + 4 Sophie Germain; 2p+1 is also prime. + + Moduli candidates initially produced by ssh-keygen(1) + are Sophie Germain primes (type 4). Further primality + testing with ssh-keygen(1) produces safe prime moduli + (type 2) that are ready for use in sshd(8). Other + types are not used by OpenSSH. + + tests Decimal number indicating the type of primality tests + that the number has been subjected to represented as a + bitmask of the following values: + + 0x00 Not tested. + 0x01 Composite number M-bM-^@M-^S not prime. + 0x02 Sieve of Eratosthenes. + 0x04 Probabilistic Miller-Rabin primality tests. + + The ssh-keygen(1) moduli candidate generation uses the + Sieve of Eratosthenes (flag 0x02). Subsequent + ssh-keygen(1) primality tests are Miller-Rabin tests + (flag 0x04). + + trials Decimal number indicating the number of primality + trials that have been performed on the modulus. + + size Decimal number indicating the size of the prime in + bits. + + generator The recommended generator for use with this modulus + (hexadecimal). + + modulus The modulus itself in hexadecimal. + + When performing Diffie-Hellman Group Exchange, sshd(8) first estimates + the size of the modulus required to produce enough Diffie-Hellman output + to sufficiently key the selected symmetric cipher. sshd(8) then randomly + selects a modulus from /etc/moduli that best meets the size requirement. + +SEE ALSO + ssh-keygen(1), sshd(8) + +STANDARDS + M. Friedl, N. Provos, and W. Simpson, Diffie-Hellman Group Exchange for + the Secure Shell (SSH) Transport Layer Protocol, RFC 4419, March 2006. + +OpenBSD 7.9 April 16, 2022 MODULI(5) diff --git a/scp.0 b/scp.0 new file mode 100644 index 000000000000..347f9e1578a9 --- /dev/null +++ b/scp.0 @@ -0,0 +1,273 @@ +SCP(1) General Commands Manual SCP(1) + +NAME + scp M-bM-^@M-^S OpenSSH secure file copy + +SYNOPSIS + scp [-346ABCOpqRrsTv] [-c cipher] [-D sftp_server_path] [-F ssh_config] + [-i identity_file] [-J destination] [-l limit] [-o ssh_option] + [-P port] [-S program] [-X sftp_option] source ... target + +DESCRIPTION + scp copies files between hosts on a network. + + scp uses the SFTP protocol over an ssh(1) connection for data transfer, + and uses the same authentication and provides the same security as a + login session. + + scp will ask for passwords or passphrases if they are needed for + authentication. + + The source and target may be specified as a local pathname, a remote host + with optional path in the form [user@]host:[path], or a URI in the form + scp://[user@]host[:port][/path]. Local file names can be made explicit + using absolute or relative pathnames to avoid scp treating file names + containing M-bM-^@M-^X:M-bM-^@M-^Y as host specifiers. + + When copying between two remote hosts, if the URI format is used, a port + cannot be specified on the target if the -R option is used. + + The options are as follows: + + -3 Copies between two remote hosts are transferred through the local + host. This mode is the default, but see also the -R option for + copying data directly between two remote hosts. Note that when + using the legacy SCP protocol (via the -O flag), this option + selects batch mode for the second host as scp cannot ask for + passwords or passphrases for both hosts. + + -4 Forces scp to use IPv4 addresses only. + + -6 Forces scp to use IPv6 addresses only. + + -A Allows forwarding of ssh-agent(1) to the remote system. The + default is not to forward an authentication agent. + + -B Selects batch mode (prevents asking for passwords or + passphrases). + + -C Compression enable. Passes the -C flag to ssh(1) to enable + compression. + + -c cipher + Selects the cipher to use for encrypting the data transfer. This + option is directly passed to ssh(1). + + -D sftp_server_path + Connect directly to a local SFTP server program rather than a + remote one via ssh(1). This option may be useful in debugging + the client and server. + + -F ssh_config + Specifies an alternative per-user configuration file for ssh. + This option is directly passed to ssh(1). + + -i identity_file + Selects the file from which the identity (private key) for public + key authentication is read. This option is directly passed to + ssh(1). + + -J destination + Connect to the target host by first making an scp connection to + the jump host described by destination and then establishing a + TCP forwarding to the ultimate destination from there. Multiple + jump hops may be specified separated by comma characters. This + is a shortcut to specify a ProxyJump configuration directive. + This option is directly passed to ssh(1). + + -l limit + Limits the used bandwidth, specified in Kbit/s. + + -O Use the legacy SCP protocol for file transfers instead of the + SFTP protocol. Forcing the use of the SCP protocol may be + necessary for servers that do not implement SFTP, for backwards- + compatibility for particular filename wildcard patterns and for + expanding paths with a M-bM-^@M-^X~M-bM-^@M-^Y prefix for older SFTP servers. + + -o ssh_option + Can be used to pass options to ssh in the format used in + ssh_config(5). This is useful for specifying options for which + there is no separate scp command-line flag. For full details of + the options listed below, and their possible values, see + ssh_config(5). + + AddKeysToAgent + AddressFamily + BatchMode + BindAddress + BindInterface + CASignatureAlgorithms + CanonicalDomains + CanonicalizeFallbackLocal + CanonicalizeHostname + CanonicalizeMaxDots + CanonicalizePermittedCNAMEs + CertificateFile + ChannelTimeout + CheckHostIP + Ciphers + ClearAllForwardings + Compression + ConnectTimeout + ConnectionAttempts + ControlMaster + ControlPath + ControlPersist + DynamicForward + EnableEscapeCommandline + EnableSSHKeysign + EscapeChar + ExitOnForwardFailure + FingerprintHash + ForkAfterAuthentication + ForwardAgent + ForwardX11 + ForwardX11Timeout + ForwardX11Trusted + GSSAPIAuthentication + GSSAPIDelegateCredentials + GatewayPorts + GlobalKnownHostsFile + HashKnownHosts + Host + HostKeyAlgorithms + HostKeyAlias + HostbasedAcceptedAlgorithms + HostbasedAuthentication + Hostname + IPQoS + IdentitiesOnly + IdentityAgent + IdentityFile + IgnoreUnknown + Include + KbdInteractiveAuthentication + KbdInteractiveDevices + KexAlgorithms + KnownHostsCommand + LocalCommand + LocalForward + LogLevel + LogVerbose + MACs + NoHostAuthenticationForLocalhost + NumberOfPasswordPrompts + ObscureKeystrokeTiming + PKCS11Provider + PasswordAuthentication + PermitLocalCommand + PermitRemoteOpen + Port + PreferredAuthentications + ProxyCommand + ProxyJump + ProxyUseFdpass + PubkeyAcceptedAlgorithms + PubkeyAuthentication + RekeyLimit + RemoteCommand + RemoteForward + RequestTTY + RequiredRSASize + RevokedHostKeys + SecurityKeyProvider + SendEnv + ServerAliveCountMax + ServerAliveInterval + SessionType + SetEnv + StdinNull + StreamLocalBindMask + StreamLocalBindUnlink + StrictHostKeyChecking + SyslogFacility + TCPKeepAlive + Tag + Tunnel + TunnelDevice + UpdateHostKeys + User + UserKnownHostsFile + VerifyHostKeyDNS + VisualHostKey + XAuthLocation + + -P port + Specifies the port to connect to on the remote host. Note that + this option is written with a capital M-bM-^@M-^XPM-bM-^@M-^Y, because -p is already + reserved for preserving the times and mode bits of the file. + + -p Preserves modification times, access times, and file mode bits + from the source file. + + -q Quiet mode: disables the progress meter as well as warning and + diagnostic messages from ssh(1). + + -R Copies between two remote hosts are transferred through the local + host by default. This option instead copies between two remote + hosts by connecting to the origin host and executing scp there. + This requires that scp running on the origin host can + authenticate to the destination host without requiring a + password. + + -r Recursively copy entire directories. Note that scp follows + symbolic links encountered in the tree traversal. + + -S program + Name of program to use for the encrypted connection. The program + must understand ssh(1) options. + + -T Disable strict filename checking. By default when copying files + from a remote host to a local directory scp checks that the + received filenames match those requested on the command-line to + prevent the remote end from sending unexpected or unwanted files. + Because of differences in how various operating systems and + shells interpret filename wildcards, these checks may cause + wanted files to be rejected. This option disables these checks + at the expense of fully trusting that the server will not send + unexpected filenames. + + -v Verbose mode. Causes scp and ssh(1) to print debugging messages + about their progress. This is helpful in debugging connection, + authentication, and configuration problems. + + -X sftp_option + Specify an option that controls aspects of SFTP protocol + behaviour. The valid options are: + + nrequests=value + Controls how many concurrent SFTP read or write requests + may be in progress at any point in time during a download + or upload. By default 64 requests may be active + concurrently. + + buffer=value + Controls the maximum buffer size for a single SFTP + read/write operation used during download or upload. By + default a 32KB buffer is used. + +EXIT STATUS + The scp utility exitsM-BM- 0 on success, andM-BM- >0 if an error occurs. + +SEE ALSO + sftp(1), ssh(1), ssh-add(1), ssh-agent(1), ssh-keygen(1), ssh_config(5), + sftp-server(8), sshd(8) + +HISTORY + scp is based on the rcp program in BSD source code from the Regents of + the University of California. + + Since OpenSSH 9.0, scp has used the SFTP protocol for transfers by + default. + +AUTHORS + Timo Rinne + Tatu Ylonen + +CAVEATS + The legacy SCP protocol (selected by the -O flag) requires execution of + the remote user's shell to perform glob(3) pattern matching. This + requires careful quoting of any characters that have special meaning to + the remote shell, such as quote characters. + +OpenBSD 7.9 October 4, 2025 SCP(1) diff --git a/sftp-server.0 b/sftp-server.0 new file mode 100644 index 000000000000..054198498b57 --- /dev/null +++ b/sftp-server.0 @@ -0,0 +1,102 @@ +SFTP-SERVER(8) System Manager's Manual SFTP-SERVER(8) + +NAME + sftp-server M-bM-^@M-^S OpenSSH SFTP server subsystem + +SYNOPSIS + sftp-server [-ehR] [-d start_directory] [-f log_facility] [-l log_level] + [-P denied_requests] [-p allowed_requests] [-u umask] + sftp-server -Q protocol_feature + +DESCRIPTION + sftp-server is a program that speaks the server side of SFTP protocol to + stdout and expects client requests from stdin. sftp-server is not + intended to be called directly, but from sshd(8) using the Subsystem + option. + + Command-line flags to sftp-server should be specified in the Subsystem + declaration. See sshd_config(5) for more information. + + Valid options are: + + -d start_directory + Specifies an alternate starting directory for users. The + pathname may contain the following tokens that are expanded at + runtime: %% is replaced by a literal '%', %d is replaced by the + home directory of the user being authenticated, and %u is + replaced by the username of that user. The default is to use the + user's home directory. This option is useful in conjunction with + the sshd_config(5) ChrootDirectory option. + + -e Causes sftp-server to print logging information to stderr instead + of syslog for debugging. + + -f log_facility + Specifies the facility code that is used when logging messages + from sftp-server. The possible values are: DAEMON, USER, AUTH, + LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7. + The default is AUTH. + + -h Displays sftp-server usage information. + + -l log_level + Specifies which messages will be logged by sftp-server. The + possible values are: QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, + DEBUG1, DEBUG2, and DEBUG3. INFO and VERBOSE log transactions + that sftp-server performs on behalf of the client. DEBUG and + DEBUG1 are equivalent. DEBUG2 and DEBUG3 each specify higher + levels of debugging output. The default is ERROR. + + -P denied_requests + Specifies a comma-separated list of SFTP protocol requests that + are banned by the server. sftp-server will reply to any denied + request with a failure. The -Q flag can be used to determine the + supported request types. If both denied and allowed lists are + specified, then the denied list is applied before the allowed + list. This flag, along with the -p flag, may be used to disable + operations that are irrelevant or undesirable for the server. + For example, a sftp-server that accepts connections from + untrusted clients may wish to disable the M-bM-^@M-^\copy-dataM-bM-^@M-^] or + M-bM-^@M-^\users-groups-by-idM-bM-^@M-^] operations. + + -p allowed_requests + Specifies a comma-separated list of SFTP protocol requests that + are permitted by the server. All request types that are not on + the allowed list will be logged and replied to with a failure + message. + + Care must be taken when using this feature to ensure that + requests made implicitly by SFTP clients are permitted. + + -Q protocol_feature + Queries protocol features supported by sftp-server. At present + the only feature that may be queried is M-bM-^@M-^\requestsM-bM-^@M-^], which may be + used to deny or allow specific requests (flags -P and -p + respectively). + + -R Places this instance of sftp-server into a read-only mode. + Attempts to open files for writing, as well as other operations + that change the state of the filesystem, will be denied. + + -u umask + Sets an explicit umask(2) to be applied to newly-created files + and directories, instead of the user's default mask. + + On some systems, sftp-server must be able to access /dev/log for logging + to work, and use of sftp-server in a chroot configuration therefore + requires that syslogd(8) establish a logging socket inside the chroot + directory. + +SEE ALSO + sftp(1), ssh(1), sshd_config(5), sshd(8) + + T. Ylonen and S. Lehtinen, SSH File Transfer Protocol, draft-ietf-secsh- + filexfer-02.txt, October 2001, work in progress material. + +HISTORY + sftp-server first appeared in OpenBSD 2.8. + +AUTHORS + Markus Friedl + +OpenBSD 7.9 May 21, 2026 SFTP-SERVER(8) diff --git a/sftp.0 b/sftp.0 new file mode 100644 index 000000000000..05fc76a9d960 --- /dev/null +++ b/sftp.0 @@ -0,0 +1,477 @@ +SFTP(1) General Commands Manual SFTP(1) + +NAME + sftp M-bM-^@M-^S OpenSSH secure file transfer + +SYNOPSIS + sftp [-46AaCfNpqrv] [-B buffer_size] [-b batchfile] [-c cipher] + [-D sftp_server_command] [-F ssh_config] [-i identity_file] + [-J destination] [-l limit] [-o ssh_option] [-P port] + [-R num_requests] [-S program] [-s subsystem | sftp_server] + [-X sftp_option] destination + +DESCRIPTION + sftp is a file transfer program, similar to ftp(1), which performs all + operations over an encrypted ssh(1) transport. It may also use many + features of ssh, such as public key authentication and compression. + + The destination may be specified either as [user@]host[:path] or as a URI + in the form sftp://[user@]host[:port][/path]. + + If the destination includes a path and it is not a directory, sftp will + retrieve files automatically if a non-interactive authentication method + is used; otherwise it will do so after successful interactive + authentication. + + If no path is specified, or if the path is a directory, sftp will log in + to the specified host and enter interactive command mode, changing to the + remote directory if one was specified. An optional trailing slash can be + used to force the path to be interpreted as a directory. + + Since the destination formats use colon characters to delimit host names + from path names or port numbers, IPv6 addresses must be enclosed in + square brackets to avoid ambiguity. + + The options are as follows: + + -4 Forces sftp to use IPv4 addresses only. + + -6 Forces sftp to use IPv6 addresses only. + + -A Allows forwarding of ssh-agent(1) to the remote system. The + default is not to forward an authentication agent. + + -a Attempt to continue interrupted transfers rather than overwriting + existing partial or complete copies of files. If the partial + contents differ from those being transferred, then the resultant + file is likely to be corrupt. + + -B buffer_size + Specify the size of the buffer that sftp uses when transferring + files. Larger buffers require fewer round trips at the cost of + higher memory consumption. The default is 32768 bytes. + + -b batchfile + Batch mode reads a series of commands from an input batchfile + instead of stdin. Since it lacks user interaction, it should be + used in conjunction with non-interactive authentication to + obviate the need to enter a password at connection time (see + sshd(8) and ssh-keygen(1) for details). + + A batchfile of M-bM-^@M-^X-M-bM-^@M-^Y may be used to indicate standard input. sftp + will abort if any of the following commands fail: get, put, + reget, reput, rename, ln, rm, mkdir, chdir, ls, lchdir, copy, cp, + chmod, chown, chgrp, lpwd, df, symlink, and lmkdir. + + Termination on error can be suppressed on a command by command + basis by prefixing the command with a M-bM-^@M-^X-M-bM-^@M-^Y character (for example, + -rm /tmp/blah*). Echo of the command may be suppressed by + prefixing the command with a M-bM-^@M-^X@M-bM-^@M-^Y character. These two prefixes + may be combined in any order, for example -@ls /bsd. + + -C Enables compression (via ssh's -C flag). + + -c cipher + Selects the cipher to use for encrypting the data transfers. + This option is directly passed to ssh(1). + + -D sftp_server_command + Connect directly to a local sftp server (rather than via ssh(1)). + A command and arguments may be specified, for example + "/path/sftp-server -el debug3". This option may be useful in + debugging the client and server. + + -F ssh_config + Specifies an alternative per-user configuration file for ssh(1). + This option is directly passed to ssh(1). + + -f Requests that files be flushed to disk immediately after + transfer. When uploading files, this feature is only enabled if + the server implements the "fsync@openssh.com" extension. + + -i identity_file + Selects the file from which the identity (private key) for public + key authentication is read. This option is directly passed to + ssh(1). + + -J destination + Connect to the target host by first making an sftp connection to + the jump host described by destination and then establishing a + TCP forwarding to the ultimate destination from there. Multiple + jump hops may be specified separated by comma characters. This + is a shortcut to specify a ProxyJump configuration directive. + This option is directly passed to ssh(1). + + -l limit + Limits the used bandwidth, specified in Kbit/s. + + -N Disables quiet mode, e.g. to override the implicit quiet mode set + by the -b flag. + + -o ssh_option + Can be used to pass options to ssh in the format used in + ssh_config(5). This is useful for specifying options for which + there is no separate sftp command-line flag. For example, to + specify an alternate port use: sftp -oPort=24. For full details + of the options listed below, and their possible values, see + ssh_config(5). + + AddKeysToAgent + AddressFamily + BatchMode + BindAddress + BindInterface + CASignatureAlgorithms + CanonicalDomains + CanonicalizeFallbackLocal + CanonicalizeHostname + CanonicalizeMaxDots + CanonicalizePermittedCNAMEs + CertificateFile + ChannelTimeout + CheckHostIP + Ciphers + ClearAllForwardings + Compression + ConnectTimeout + ConnectionAttempts + ControlMaster + ControlPath + ControlPersist + DynamicForward + EnableEscapeCommandline + EnableSSHKeysign + EscapeChar + ExitOnForwardFailure + FingerprintHash + ForkAfterAuthentication + ForwardAgent + ForwardX11 + ForwardX11Timeout + ForwardX11Trusted + GSSAPIAuthentication + GSSAPIDelegateCredentials + GatewayPorts + GlobalKnownHostsFile + HashKnownHosts + Host + HostKeyAlgorithms + HostKeyAlias + HostbasedAcceptedAlgorithms + HostbasedAuthentication + Hostname + IPQoS + IdentitiesOnly + IdentityAgent + IdentityFile + IgnoreUnknown + Include + KbdInteractiveAuthentication + KbdInteractiveDevices + KexAlgorithms + KnownHostsCommand + LocalCommand + LocalForward + LogLevel + LogVerbose + MACs + NoHostAuthenticationForLocalhost + NumberOfPasswordPrompts + ObscureKeystrokeTiming + PKCS11Provider + PasswordAuthentication + PermitLocalCommand + PermitRemoteOpen + Port + PreferredAuthentications + ProxyCommand + ProxyJump + ProxyUseFdpass + PubkeyAcceptedAlgorithms + PubkeyAuthentication + RekeyLimit + RemoteCommand + RemoteForward + RequestTTY + RequiredRSASize + RevokedHostKeys + SecurityKeyProvider + SendEnv + ServerAliveCountMax + ServerAliveInterval + SessionType + SetEnv + StdinNull + StreamLocalBindMask + StreamLocalBindUnlink + StrictHostKeyChecking + SyslogFacility + TCPKeepAlive + Tag + Tunnel + TunnelDevice + UpdateHostKeys + User + UserKnownHostsFile + VerifyHostKeyDNS + VisualHostKey + XAuthLocation + + -P port + Specifies the port to connect to on the remote host. + + -p Preserves modification times, access times, and modes from the + original files transferred. + + -q Quiet mode: disables the progress meter as well as warning and + diagnostic messages from ssh(1). + + -R num_requests + Specify how many requests may be outstanding at any one time. + Increasing this may slightly improve file transfer speed but will + increase memory usage. The default is 64 outstanding requests. + + -r Recursively copy entire directories when uploading and + downloading. Note that sftp does not follow symbolic links + encountered in the tree traversal. + + -S program + Name of the program to use for the encrypted connection. The + program must understand ssh(1) options. + + -s subsystem | sftp_server + Specifies the SSH2 subsystem or the path for an sftp server on + the remote host. A path is useful when the remote sshd(8) does + not have an sftp subsystem configured. + + -v Raise logging level. This option is also passed to ssh. + + -X sftp_option + Specify an option that controls aspects of SFTP protocol + behaviour. The valid options are: + + nrequests=value + Controls how many concurrent SFTP read or write requests + may be in progress at any point in time during a download + or upload. By default 64 requests may be active + concurrently. + + buffer=value + Controls the maximum buffer size for a single SFTP + read/write operation used during download or upload. By + default a 32KB buffer is used. + +INTERACTIVE COMMANDS + Once in interactive mode, sftp understands a set of commands similar to + those of ftp(1). Commands are case insensitive. Pathnames that contain + spaces must be enclosed in quotes. Any special characters contained + within pathnames that are recognized by glob(3) must be escaped with + backslashes (M-bM-^@M-^X\M-bM-^@M-^Y). + + bye Quit sftp. + + cd [path] + Change remote directory to path. If path is not specified, then + change directory to the one the session started in. + + chgrp [-h] grp path + Change group of file path to grp. path may contain glob(7) + characters and may match multiple files. grp must be a numeric + GID. + + If the -h flag is specified, then symlinks will not be followed. + Note that this is only supported by servers that implement the + "lsetstat@openssh.com" extension. + + chmod [-h] mode path + Change permissions of file path to mode. path may contain + glob(7) characters and may match multiple files. + + If the -h flag is specified, then symlinks will not be followed. + Note that this is only supported by servers that implement the + "lsetstat@openssh.com" extension. + + chown [-h] own path + Change owner of file path to own. path may contain glob(7) + characters and may match multiple files. own must be a numeric + UID. + + If the -h flag is specified, then symlinks will not be followed. + Note that this is only supported by servers that implement the + "lsetstat@openssh.com" extension. + + copy oldpath newpath + Copy remote file from oldpath to newpath. + + Note that this is only supported by servers that implement the + "copy-data" extension. + + cp oldpath newpath + Alias to copy command. + + df [-hi] [path] + Display usage information for the filesystem holding the current + directory (or path if specified). If the -h flag is specified, + the capacity information will be displayed using "human-readable" + suffixes. The -i flag requests display of inode information in + addition to capacity information. This command is only supported + on servers that implement the M-bM-^@M-^\statvfs@openssh.comM-bM-^@M-^] extension. + + exit Quit sftp. + + get [-afpR] remote-path [local-path] + Retrieve the remote-path and store it on the local machine. If + the local path name is not specified, it is given the same name + it has on the remote machine. remote-path may contain glob(7) + characters and may match multiple files. If it does and + local-path is specified, then local-path must specify a + directory. + + If the -a flag is specified, then attempt to resume partial + transfers of existing files. Note that resumption assumes that + any partial copy of the local file matches the remote copy. If + the remote file contents differ from the partial local copy then + the resultant file is likely to be corrupt. + + If the -f flag is specified, then fsync(2) will be called after + the file transfer has completed to flush the file to disk. + + If the -p flag is specified, then full file permissions and + access times are copied too. + + If the -R flag is specified then directories will be copied + recursively. Note that sftp does not follow symbolic links when + performing recursive transfers. + + help Display help text. + + lcd [path] + Change local directory to path. If path is not specified, then + change directory to the local user's home directory. + + lls [ls-options [path]] + Display local directory listing of either path or current + directory if path is not specified. ls-options may contain any + flags supported by the local system's ls(1) command. path may + contain glob(7) characters and may match multiple files. + + lmkdir path + Create local directory specified by path. + + ln [-s] oldpath newpath + Create a link from oldpath to newpath. If the -s flag is + specified the created link is a symbolic link, otherwise it is a + hard link. + + lpwd Print local working directory. + + ls [-1afhlnrSt] [path] + Display a remote directory listing of either path or the current + directory if path is not specified. path may contain glob(7) + characters and may match multiple files. + + The following flags are recognized and alter the behaviour of ls + accordingly: + + -1 Produce single columnar output. + + -a List files beginning with a dot (M-bM-^@M-^X.M-bM-^@M-^Y). + + -f Do not sort the listing. The default sort order is + lexicographical. + + -h When used with a long format option, use unit suffixes: + Byte, Kilobyte, Megabyte, Gigabyte, Terabyte, Petabyte, + and Exabyte in order to reduce the number of digits to + four or fewer using powers of 2 for sizes (K=1024, + M=1048576, etc.). + + -l Display additional details including permissions and + ownership information. + + -n Produce a long listing with user and group information + presented numerically. + + -r Reverse the sort order of the listing. + + -S Sort the listing by file size. + + -t Sort the listing by last modification time. + + lumask umask + Set local umask to umask. + + mkdir path + Create remote directory specified by path. + + progress + Toggle display of progress meter. + + put [-afpR] local-path [remote-path] + Upload local-path and store it on the remote machine. If the + remote path name is not specified, it is given the same name it + has on the local machine. local-path may contain glob(7) + characters and may match multiple files. If it does and + remote-path is specified, then remote-path must specify a + directory. + + If the -a flag is specified, then attempt to resume partial + transfers of existing files. Note that resumption assumes that + any partial copy of the remote file matches the local copy. If + the local file contents differ from the remote local copy then + the resultant file is likely to be corrupt. + + If the -f flag is specified, then a request will be sent to the + server to call fsync(2) after the file has been transferred. + Note that this is only supported by servers that implement the + "fsync@openssh.com" extension. + + If the -p flag is specified, then full file permissions and + access times are copied too. + + If the -R flag is specified then directories will be copied + recursively. Note that sftp does not follow symbolic links when + performing recursive transfers. + + pwd Display remote working directory. + + quit Quit sftp. + + reget [-fpR] remote-path [local-path] + Resume download of remote-path. Equivalent to get with the -a + flag set. + + reput [-fpR] local-path [remote-path] + Resume upload of local-path. Equivalent to put with the -a flag + set. + + rename oldpath newpath + Rename remote file from oldpath to newpath. + + rm path + Delete remote file specified by path. + + rmdir path + Remove remote directory specified by path. + + symlink oldpath newpath + Create a symbolic link from oldpath to newpath. + + version + Display the sftp protocol version. + + !command + Execute command in local shell. + + ! Escape to local shell. + + ? Synonym for help. + +SEE ALSO + ftp(1), ls(1), scp(1), ssh(1), ssh-add(1), ssh-keygen(1), ssh_config(5), + glob(7), sftp-server(8), sshd(8) + + T. Ylonen and S. Lehtinen, SSH File Transfer Protocol, draft-ietf-secsh- + filexfer-00.txt, January 2001, work in progress material. + +OpenBSD 7.9 December 6, 2024 SFTP(1) diff --git a/ssh-add.0 b/ssh-add.0 new file mode 100644 index 000000000000..ad09faec07d4 --- /dev/null +++ b/ssh-add.0 @@ -0,0 +1,219 @@ +SSH-ADD(1) General Commands Manual SSH-ADD(1) + +NAME + ssh-add M-bM-^@M-^S adds private key identities to the OpenSSH authentication agent + +SYNOPSIS + ssh-add [-CcDdKkLlNqvXx] [-E fingerprint_hash] [-H hostkey_file] + [-h destination_constraint] [-S provider] [-t life] [file ...] + ssh-add -s pkcs11 [-Cv] [certificate ...] + ssh-add -e pkcs11 + ssh-add -T pubkey ... + ssh-add -Q + +DESCRIPTION + ssh-add adds private key identities to the authentication agent, + ssh-agent(1). When run without arguments, it adds the files + ~/.ssh/id_rsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ecdsa_sk, ~/.ssh/id_ed25519 and + ~/.ssh/id_ed25519_sk. After loading a private key, ssh-add will try to + load corresponding certificate information from the filename obtained by + appending -cert.pub to the name of the private key file. Alternative + file names can be given on the command line. + + If any file requires a passphrase, ssh-add asks for the passphrase from + the user. The passphrase is read from the user's tty. ssh-add retries + the last passphrase if multiple identity files are given. + + The authentication agent must be running and the SSH_AUTH_SOCK + environment variable must contain the name of its socket for ssh-add to + work. + + The options are as follows: + + -C When loading keys into or deleting keys from the agent, process + certificates only and skip plain keys. + + -c Indicates that added identities should be subject to confirmation + before being used for authentication. Confirmation is performed + by ssh-askpass(1). Successful confirmation is signaled by a zero + exit status from ssh-askpass(1), rather than text entered into + the requester. + + -D Deletes all identities from the agent. + + -d Instead of adding identities, removes identities from the agent. + If ssh-add has been run without arguments, the keys for the + default identities and their corresponding certificates will be + removed. Otherwise, the argument list will be interpreted as a + list of paths to public key files to specify keys and + certificates to be removed from the agent. If no public key is + found at a given path, ssh-add will append .pub and retry. If + the argument list consists of M-bM-^@M-^\-M-bM-^@M-^] then ssh-add will read public + keys to be removed from standard input. + + -E fingerprint_hash + Specifies the hash algorithm used when displaying key + fingerprints. Valid options are: M-bM-^@M-^\md5M-bM-^@M-^] and M-bM-^@M-^\sha256M-bM-^@M-^]. The + default is M-bM-^@M-^\sha256M-bM-^@M-^]. + + -e pkcs11 + Remove keys provided by the PKCS#11 shared library pkcs11. + + -H hostkey_file + Specifies a known hosts file to look up hostkeys when using + destination-constrained keys via the -h flag. This option may be + specified multiple times to allow multiple files to be searched. + If no files are specified, ssh-add will use the default + ssh_config(5) known hosts files: ~/.ssh/known_hosts, + ~/.ssh/known_hosts2, /etc/ssh/ssh_known_hosts, and + /etc/ssh/ssh_known_hosts2. + + -h destination_constraint + When adding keys, constrain them to be usable only through + specific hosts or to specific destinations. + + Destination constraints of the form M-bM-^@M-^X[user@]dest-hostnameM-bM-^@M-^Y permit + use of the key only from the origin host (the one running + ssh-agent(1)) to the listed destination host, with optional user + name. + + Constraints of the form M-bM-^@M-^Xsrc-hostname>[user@]dst-hostnameM-bM-^@M-^Y allow + a key available on a forwarded ssh-agent(1) to be used through a + particular host (as specified by M-bM-^@M-^Xsrc-hostnameM-bM-^@M-^Y) to authenticate + to a further host, specified by M-bM-^@M-^Xdst-hostnameM-bM-^@M-^Y. + + Multiple destination constraints may be added when loading keys. + When attempting authentication with a key that has destination + constraints, the whole connection path, including ssh-agent(1) + forwarding, is tested against those constraints and each hop must + be permitted for the attempt to succeed. For example, if key is + forwarded to a remote host, M-bM-^@M-^Xhost-bM-bM-^@M-^Y, and is attempting + authentication to another host, M-bM-^@M-^Xhost-cM-bM-^@M-^Y, then the operation will + be successful only if M-bM-^@M-^Xhost-bM-bM-^@M-^Y was permitted from the origin host + and the subsequent M-bM-^@M-^Xhost-b>host-cM-bM-^@M-^Y hop is also permitted by + destination constraints. + + Hosts are identified by their host keys, and are looked up from + known hosts files by ssh-add. Wildcards patterns may be used for + hostnames and certificate host keys are supported. By default, + keys added by ssh-add are not destination constrained. + + Destination constraints were added in OpenSSH release 8.9. + Support in both the remote SSH client and server is required when + using destination-constrained keys over a forwarded ssh-agent(1) + channel. + + It is also important to note that destination constraints can + only be enforced by ssh-agent(1) when a key is used, or when it + is forwarded by a cooperating ssh(1). Specifically, it does not + prevent an attacker with access to a remote SSH_AUTH_SOCK from + forwarding it again and using it on a different host (but only to + a permitted destination). + + -K Load resident keys from a FIDO authenticator. + + -k When loading keys into or deleting keys from the agent, process + plain private keys only and skip certificates. + + -L Lists public key parameters of all identities currently + represented by the agent. + + -l Lists fingerprints of all identities currently represented by the + agent. + + -N When adding certificates, by default ssh-add will request that + the agent automatically delete the certificate shortly after the + certificate's expiry date. This flag suppresses this behaviour + and does not specify a lifetime for certificates added to an + agent. + + -Q Query the agent for the list of protocol extensions it supports. + Note: not all agents support this query. + + -q Be quiet after a successful operation. + + -S provider + Specifies a path to a library that will be used when adding FIDO + authenticator-hosted keys, overriding the default of using the + internal USB HID support. + + -s pkcs11 + Add keys provided by the PKCS#11 shared library pkcs11. + Certificate files may optionally be listed as command-line + arguments. If these are present, then they will be loaded into + the agent using any corresponding private keys loaded from the + PKCS#11 token. + + -T pubkey ... + Tests whether the private keys that correspond to the specified + pubkey files are usable by performing sign and verify operations + on each. + + -t life + Set a maximum lifetime when adding identities to an agent. The + lifetime may be specified in seconds or in a time format + specified in sshd_config(5). + + -v Verbose mode. Causes ssh-add to print debugging messages about + its progress. This is helpful in debugging problems. Multiple + -v options increase the verbosity. The maximum is 3. + + -X Unlock the agent. + + -x Lock the agent with a password. + +ENVIRONMENT + DISPLAY, SSH_ASKPASS and SSH_ASKPASS_REQUIRE + If ssh-add needs a passphrase, it will read the passphrase from + the current terminal if it was run from a terminal. If ssh-add + does not have a terminal associated with it but DISPLAY and + SSH_ASKPASS are set, it will execute the program specified by + SSH_ASKPASS (by default M-bM-^@M-^\ssh-askpassM-bM-^@M-^]) and open an X11 window to + read the passphrase. This is particularly useful when calling + ssh-add from a .xsession or related script. + + SSH_ASKPASS_REQUIRE allows further control over the use of an + askpass program. If this variable is set to M-bM-^@M-^\neverM-bM-^@M-^] then ssh-add + will never attempt to use one. If it is set to M-bM-^@M-^\preferM-bM-^@M-^], then + ssh-add will prefer to use the askpass program instead of the TTY + when requesting passwords. Finally, if the variable is set to + M-bM-^@M-^\forceM-bM-^@M-^], then the askpass program will be used for all passphrase + input regardless of whether DISPLAY is set. + + SSH_AUTH_SOCK + Identifies the path of a Unix-domain socket used to communicate + with the agent. + + SSH_SK_PROVIDER + Specifies a path to a library that will be used when loading any + FIDO authenticator-hosted keys, overriding the default of using + the built-in USB HID support. + +FILES + ~/.ssh/id_ecdsa + ~/.ssh/id_ecdsa_sk + ~/.ssh/id_ed25519 + ~/.ssh/id_ed25519_sk + ~/.ssh/id_rsa + Contains the ECDSA, authenticator-hosted ECDSA, Ed25519, + authenticator-hosted Ed25519 or RSA authentication identity of + the user. + + Identity files should not be readable by anyone but the user. Note that + ssh-add ignores identity files if they are accessible by others. + +EXIT STATUS + Exit status is 0 on success, 1 if the specified command fails, and 2 if + ssh-add is unable to contact the authentication agent. + +SEE ALSO + ssh(1), ssh-agent(1), ssh-askpass(1), ssh-keygen(1), sshd(8) + +AUTHORS + OpenSSH is a derivative of the original and free ssh 1.2.12 release by + Tatu Ylonen. Aaron Campbell, Bob Beck, Markus Friedl, Niels Provos, Theo + de Raadt and Dug Song removed many bugs, re-added newer features and + created OpenSSH. Markus Friedl contributed the support for SSH protocol + versions 1.5 and 2.0. + +OpenBSD 7.9 March 5, 2026 SSH-ADD(1) diff --git a/ssh-agent.0 b/ssh-agent.0 new file mode 100644 index 000000000000..e53ec00ba8e7 --- /dev/null +++ b/ssh-agent.0 @@ -0,0 +1,180 @@ +SSH-AGENT(1) General Commands Manual SSH-AGENT(1) + +NAME + ssh-agent M-bM-^@M-^S OpenSSH authentication agent + +SYNOPSIS + ssh-agent [-c | -s] [-DdTU] [-a bind_address] [-E fingerprint_hash] + [-O option] [-P allowed_providers] [-t life] + ssh-agent [-TU] [-a bind_address] [-E fingerprint_hash] [-O option] + [-P allowed_providers] [-t life] command [arg ...] + ssh-agent [-c | -s] -k + ssh-agent -u + ssh-agent -V + +DESCRIPTION + ssh-agent is a program to hold private keys used for public key + authentication. Through use of environment variables the agent can be + located and automatically used for authentication when logging in to + other machines using ssh(1). + + The options are as follows: + + -a bind_address + Bind the agent to the Unix-domain socket bind_address. The + default is to create a socket at a random path matching + $HOME/.ssh/agent/s.*. + + -c Generate C-shell commands on standard output. This is the + default if SHELL looks like it's a csh style of shell. + + -D Foreground mode. When this option is specified, ssh-agent will + not fork. + + -d Debug mode. When this option is specified, ssh-agent will not + fork and will write debug information to standard error. + + -E fingerprint_hash + Specifies the hash algorithm used when displaying key + fingerprints. Valid options are: M-bM-^@M-^\md5M-bM-^@M-^] and M-bM-^@M-^\sha256M-bM-^@M-^]. The + default is M-bM-^@M-^\sha256M-bM-^@M-^]. + + -k Kill the current agent (given by the SSH_AGENT_PID environment + variable). + + -O option + Specify an option when starting ssh-agent. The supported options + are: allow-remote-pkcs11, no-restrict-websafe and websafe-allow. + + The allow-remote-pkcs11 option allows clients of a forwarded + ssh-agent to load PKCS#11 or FIDO provider libraries. By default + only local clients may perform this operation. Note that + signalling that an ssh-agent client is remote is performed by + ssh(1), and use of other tools to forward access to the agent + socket may circumvent this restriction. + + The no-restrict-websafe option instructs ssh-agent to permit + signatures using FIDO keys that might be web authentication + requests. By default, ssh-agent refuses signature requests for + FIDO keys where the key application string does not start with + M-bM-^@M-^\ssh:M-bM-^@M-^] and when the data to be signed does not appear to be an + ssh(1) user authentication request or an ssh-keygen(1) signature. + The default behaviour prevents forwarded access to a FIDO key + from also implicitly forwarding the ability to authenticate to + websites. + + Alternately the websafe-allow option allows specifying a pattern- + list of key application strings to replace the default + application allow-list, for example: + M-bM-^@M-^\websafe-allow=ssh:*,example.org,*.example.comM-bM-^@M-^] + + See PATTERNS in ssh_config(5) for a description of pattern-list + syntax. + + -P allowed_providers + Specify a pattern-list of acceptable paths for PKCS#11 provider + and FIDO authenticator middleware shared libraries that may be + used with the -S or -s options to ssh-add(1). Libraries that do + not match the pattern list will be refused. The default list is + M-bM-^@M-^\/usr/lib*/*,/usr/local/lib*/*M-bM-^@M-^]. + + See PATTERNS in ssh_config(5) for a description of pattern-list + syntax. + + -s Generate Bourne shell commands on standard output. This is the + default if SHELL does not look like it's a csh style of shell. + + -T Bind the agent socket in a randomised subdirectory of the form + $TMPDIR/ssh-XXXXXXXXXX/agent., instead of the default + behaviour of using a randomised name matching + $HOME/.ssh/agent/s.*. + + -t life + Set a default value for the maximum lifetime of identities added + to the agent. The lifetime may be specified in seconds or in a + time format specified in sshd_config(5). A lifetime specified + for an identity with ssh-add(1) overrides this value. Without + this option the default maximum lifetime is forever. + + -U Instructs ssh-agent not to clean up stale agent sockets under + $HOME/.ssh/agent/. + + -u Instructs ssh-agent to only clean up stale agent sockets under + $HOME/.ssh/agent/ and then exit immediately. If this option is + given twice, ssh-agent will delete stale agent sockets regardless + of the host name that created them. + + command [arg ...] + If a command (and optional arguments) is given, this is executed + as a subprocess of the agent. The agent exits automatically when + the command given on the command line terminates. + + -V Display the version number and exit. + + There are three main ways to get an agent set up. The first is at the + start of an X session, where all other windows or programs are started as + children of the ssh-agent program. The agent starts a command under + which its environment variables are exported, for example ssh-agent xterm + &. When the command terminates, so does the agent. + + The second method is used for a login session. When ssh-agent is + started, it prints the shell commands required to set its environment + variables, which in turn can be evaluated in the calling shell, for + example eval `ssh-agent -s`. + + In both of these cases, ssh(1) looks at these environment variables and + uses them to establish a connection to the agent. + + The third way to run ssh-agent is via socket activation from a + supervising process, such as systemd. In this mode, the supervising + process creates the listening socket and is responsible for starting + ssh-agent as needed, and also for communicating the location of the + socket listener to other programs in the user's session. Socket + activation is used when ssh-agent is started with either of the -d or -D + flags, no socket listening address specified by the -a flag, and both the + LISTEN_FDS and LISTEN_PID environment variables correctly supplied by the + supervising process. + + The agent initially does not have any private keys. Keys are added using + ssh-add(1) or by ssh(1) when AddKeysToAgent is set in ssh_config(5). + Multiple identities may be stored in ssh-agent concurrently and ssh(1) + will automatically use them if present. ssh-add(1) is also used to + remove keys from ssh-agent and to query the keys that are held in one. + + Connections to ssh-agent may be forwarded from further remote hosts using + the -A option to ssh(1) (but see the caveats documented therein), + avoiding the need for authentication data to be stored on other machines. + Authentication passphrases and private keys never go over the network: + the connection to the agent is forwarded over SSH remote connections and + the result is returned to the requester, allowing the user access to + their identities anywhere in the network in a secure fashion. + + ssh-agent will delete all keys it has loaded upon receiving SIGUSR1. + +ENVIRONMENT + SSH_AGENT_PID When ssh-agent starts, it stores the name of the agent's + process ID (PID) in this variable. + + SSH_AUTH_SOCK When ssh-agent starts, it creates a Unix-domain socket and + stores its pathname in this variable. It is accessible + only to the current user, but is easily abused by root or + another instance of the same user. + +FILES + $HOME/.ssh/agent/s.* + Unix-domain sockets used to contain the connection to the + authentication agent. These sockets should only be readable by + the owner. The sockets should get automatically removed when the + agent exits. + +SEE ALSO + ssh(1), ssh-add(1), ssh-keygen(1), ssh_config(5), sshd(8) + +AUTHORS + OpenSSH is a derivative of the original and free ssh 1.2.12 release by + Tatu Ylonen. Aaron Campbell, Bob Beck, Markus Friedl, Niels Provos, Theo + de Raadt and Dug Song removed many bugs, re-added newer features and + created OpenSSH. Markus Friedl contributed the support for SSH protocol + versions 1.5 and 2.0. + +OpenBSD 7.9 May 27, 2026 SSH-AGENT(1) diff --git a/ssh-keygen.0 b/ssh-keygen.0 new file mode 100644 index 000000000000..01ec6cb02432 --- /dev/null +++ b/ssh-keygen.0 @@ -0,0 +1,914 @@ +SSH-KEYGEN(1) General Commands Manual SSH-KEYGEN(1) + +NAME + ssh-keygen M-bM-^@M-^S OpenSSH authentication key utility + +SYNOPSIS + ssh-keygen [-q] [-a rounds] [-b bits] [-C comment] [-f output_keyfile] + [-m format] [-N new_passphrase] [-O option] + [-t ecdsa | + ecdsa-sk | ed25519 | ed25519-sk | mldsa44-ed25519 | rsa] + [-w provider] [-Z cipher] + ssh-keygen -p [-a rounds] [-f keyfile] [-m format] [-N new_passphrase] + [-P old_passphrase] [-Z cipher] + ssh-keygen -i [-f input_keyfile] [-m key_format] + ssh-keygen -e [-f input_keyfile] [-m key_format] + ssh-keygen -y [-f input_keyfile] + ssh-keygen -c [-a rounds] [-C comment] [-f keyfile] [-P passphrase] + ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile] + ssh-keygen -B [-f input_keyfile] + ssh-keygen -D pkcs11 + ssh-keygen -F hostname [-lv] [-f known_hosts_file] + ssh-keygen -H [-f known_hosts_file] + ssh-keygen -K [-a rounds] [-w provider] + ssh-keygen -R hostname [-f known_hosts_file] + ssh-keygen -r hostname [-g] [-f input_keyfile] + ssh-keygen -M generate [-O option] output_file + ssh-keygen -M screen [-f input_file] [-O option] output_file + ssh-keygen -I certificate_identity -s ca_key [-hU] [-D pkcs11_provider] + [-n principals] [-O option] [-V validity_interval] + [-z serial_number] file ... + ssh-keygen -L [-f input_keyfile] + ssh-keygen -A [-a rounds] [-f prefix_path] + ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number] + file ... + ssh-keygen -Q [-l] -f krl_file file ... + ssh-keygen -Y find-principals [-O option] -s signature_file + -f allowed_signers_file + ssh-keygen -Y match-principals -I signer_identity -f allowed_signers_file + ssh-keygen -Y check-novalidate [-O option] -n namespace -s signature_file + ssh-keygen -Y sign [-O option] -f key_file -n namespace file ... + ssh-keygen -Y verify [-O option] -f allowed_signers_file + -I signer_identity -n namespace -s signature_file + [-r revocation_file] + +DESCRIPTION + ssh-keygen generates, manages and converts authentication keys for + ssh(1). ssh-keygen can create keys for use by SSH protocol version 2. + + The type of key to be generated is specified with the -t option. If + invoked without any arguments, ssh-keygen will generate an Ed25519 key. + + ssh-keygen is also used to generate groups for use in Diffie-Hellman + group exchange (DH-GEX). See the MODULI GENERATION section for details. + + Finally, ssh-keygen can be used to generate and update Key Revocation + Lists, and to test whether given keys have been revoked by one. See the + KEY REVOCATION LISTS section for details. + + Normally each user wishing to use SSH with public key authentication runs + this once to create the authentication key in ~/.ssh/id_ecdsa, + ~/.ssh/id_ecdsa_sk, ~/.ssh/id_ed25519, ~/.ssh/id_ed25519_sk, + ~/.ssh/id_mldsa44-ed25519 or ~/.ssh/id_rsa. Additionally, the system + administrator may use this to generate host keys, as seen in /etc/rc. + + Normally this program generates the key and asks for a file in which to + store the private key. The public key is stored in a file with the same + name but M-bM-^@M-^\.pubM-bM-^@M-^] appended. The program also asks for a passphrase. The + passphrase may be empty to indicate no passphrase (host keys must have an + empty passphrase), or it may be a string of arbitrary length. A + passphrase is similar to a password, except it can be a phrase with a + series of words, punctuation, numbers, whitespace, or any string of + characters you want. Good passphrases are 10-30 characters long, are not + simple sentences or otherwise easily guessable (English prose has only + 1-2 bits of entropy per character, and provides very bad passphrases), + and contain a mix of upper and lowercase letters, numbers, and non- + alphanumeric characters. The passphrase can be changed later by using + the -p option. + + There is no way to recover a lost passphrase. If the passphrase is lost + or forgotten, a new key must be generated and the corresponding public + key copied to other machines. + + ssh-keygen will by default write keys in an OpenSSH-specific format. + This format is preferred as it offers better protection for keys at rest + as well as allowing storage of key comments within the private key file + itself. The key comment may be useful to help identify the key. The + comment is initialized to M-bM-^@M-^\user@hostM-bM-^@M-^] when the key is created, but can be + changed using the -c option. + + It is still possible for ssh-keygen to write the previously-used PEM + format private keys using the -m flag. This may be used when generating + new keys, and existing new-format keys may be converted using this option + in conjunction with the -p (change passphrase) flag. + + After a key is generated, ssh-keygen will ask where the keys should be + placed to be activated. + + The options are as follows: + + -A Generate host keys of all default key types (rsa, ecdsa, + mldsa44-ed25519 and ed25519) if they do not already exist. The + host keys are generated with the default key file path, an empty + passphrase, default bits for the key type, and default comment. + If -f has also been specified, its argument is used as a prefix + to the default path for the resulting host key files. This is + used by /etc/rc to generate new host keys. + + -a rounds + When saving a private key, this option specifies the number of + KDF (key derivation function, currently bcrypt_pbkdf(3)) rounds + used. Higher numbers result in slower passphrase verification + and increased resistance to brute-force password cracking (should + the keys be stolen). The default is 16 rounds. + + -B Show the bubblebabble digest of specified private or public key + file. + + -b bits + Specifies the number of bits in the key to create. For RSA keys, + the minimum size is 1024 bits and the default is 3072 bits. + Generally, 3072 bits is considered sufficient. For ECDSA keys, + the -b flag determines the key length by selecting from one of + three elliptic curve sizes: 256, 384 or 521 bits. Attempting to + use bit lengths other than these three values for ECDSA keys will + fail. ECDSA-SK, Ed25519 and Ed25519-SK keys have a fixed length + and the -b flag will be ignored. + + -C comment + Provides a new comment. + + -c Requests changing the comment in the private and public key + files. The program will prompt for the file containing the + private keys, for the passphrase if the key has one, and for the + new comment. + + -D pkcs11 + Download the public keys provided by the PKCS#11 shared library + pkcs11. When used in combination with -s, this option indicates + that a CA key resides in a PKCS#11 token (see the CERTIFICATES + section for details). + + -E fingerprint_hash + Specifies the hash algorithm used when displaying key + fingerprints. Valid options are: M-bM-^@M-^\md5M-bM-^@M-^] and M-bM-^@M-^\sha256M-bM-^@M-^]. The + default is M-bM-^@M-^\sha256M-bM-^@M-^]. + + -e This option will read a private or public OpenSSH key file and + print to stdout a public key in one of the formats specified by + the -m option. The default export format is M-bM-^@M-^\RFC4716M-bM-^@M-^]. This + option allows exporting OpenSSH keys for use by other programs, + including several commercial SSH implementations. + + -F hostname | [hostname]:port + Search for the specified hostname (with optional port number) in + a known_hosts file, listing any occurrences found. This option + is useful to find hashed host names or addresses and may also be + used in conjunction with the -H option to print found keys in a + hashed format. + + -f filename + Specifies the filename of the key file. + + -g Use generic DNS format when printing fingerprint resource records + using the -r command. + + -H Hash a known_hosts file. This replaces all hostnames and + addresses with hashed representations within the specified file; + the original content is moved to a file with a .old suffix. + These hashes may be used normally by ssh and sshd, but they do + not reveal identifying information should the file's contents be + disclosed. This option will not modify existing hashed hostnames + and is therefore safe to use on files that mix hashed and non- + hashed names. + + -h When signing a key, create a host certificate instead of a user + certificate. See the CERTIFICATES section for details. + + -I certificate_identity + Specify the key identity when signing a public key. See the + CERTIFICATES section for details. + + -i This option will read an unencrypted private (or public) key file + in the format specified by the -m option and print an OpenSSH + compatible private (or public) key to stdout. This option allows + importing keys from other software, including several commercial + SSH implementations. The default import format is M-bM-^@M-^\RFC4716M-bM-^@M-^]. + + -K Download resident keys from a FIDO authenticator. Public and + private key files will be written to the current directory for + each downloaded key. If multiple FIDO authenticators are + attached, keys will be downloaded from the first touched + authenticator. See the FIDO AUTHENTICATOR section for more + information. + + -k Generate a KRL file. In this mode, ssh-keygen will generate a + KRL file at the location specified via the -f flag that revokes + every key or certificate presented on the command line. + Keys/certificates to be revoked may be specified by public key + file or using the format described in the KEY REVOCATION LISTS + section. + + -L Prints the contents of one or more certificates. + + -l Show fingerprint of specified public key file. ssh-keygen will + try to find the matching public key file and prints its + fingerprint. If combined with -v, a visual ASCII art + representation of the key is supplied with the fingerprint. + + -M generate + Generate candidate Diffie-Hellman Group Exchange (DH-GEX) + parameters for eventual use by the + M-bM-^@M-^Xdiffie-hellman-group-exchange-*M-bM-^@M-^Y key exchange methods. The + numbers generated by this operation must be further screened + before use. See the MODULI GENERATION section for more + information. + + -M screen + Screen candidate parameters for Diffie-Hellman Group Exchange. + This will accept a list of candidate numbers and test that they + are safe (Sophie Germain) primes with acceptable group + generators. The results of this operation may be added to the + /etc/moduli file. See the MODULI GENERATION section for more + information. + + -m key_format + Specify a key format for key generation, the -i (import), -e + (export) conversion options, and the -p change passphrase + operation. The latter may be used to convert between OpenSSH + private key and PEM private key formats. The supported key + formats are: M-bM-^@M-^\RFC4716M-bM-^@M-^] (RFC 4716/SSH2 public or private key), + M-bM-^@M-^\PKCS8M-bM-^@M-^] (PKCS8 public or private key) or M-bM-^@M-^\PEMM-bM-^@M-^] (PEM public key). + By default OpenSSH will write newly-generated private keys in its + own format, but when converting public keys for export the + default format is M-bM-^@M-^\RFC4716M-bM-^@M-^]. Setting a format of M-bM-^@M-^\PEMM-bM-^@M-^] when + generating or updating a supported private key type will cause + the key to be stored in the legacy PEM private key format. + + -N new_passphrase + Provides the new passphrase. + + -n principals + Specify one or more principals (user or host names) to be + included in a certificate when signing a key. Multiple + principals may be specified, separated by commas. See the + CERTIFICATES section for details. + + -O option + Specify a key/value option. These are specific to the operation + that ssh-keygen has been requested to perform. + + When signing certificates, one of the options listed in the + CERTIFICATES section may be specified here. + + When performing moduli generation or screening, one of the + options listed in the MODULI GENERATION section may be specified. + + When generating FIDO authenticator-backed keys, the options + listed in the FIDO AUTHENTICATOR section may be specified. + + When performing signature-related options using the -Y flag, the + following options are accepted: + + hashalg=algorithm + Selects the hash algorithm to use for hashing the message + to be signed. Valid algorithms are M-bM-^@M-^\sha256M-bM-^@M-^] and + M-bM-^@M-^\sha512.M-bM-^@M-^] The default is M-bM-^@M-^\sha512.M-bM-^@M-^] + + print-pubkey + Print the full public key to standard output after + signature verification. + + verify-time=timestamp + Specifies a time to use when validating signatures + instead of the current time. The time may be specified + as a date or time in the YYYYMMDD[Z] or in + YYYYMMDDHHMM[SS][Z] formats. Dates and times will be + interpreted in the current system time zone unless + suffixed with a Z character, which causes them to be + interpreted in the UTC time zone. + + When generating SSHFP DNS records from public keys using the -r + flag, the following options are accepted: + + hashalg=algorithm + Selects a hash algorithm to use when printing SSHFP + records using the -D flag. Valid algorithms are M-bM-^@M-^\sha1M-bM-^@M-^] + and M-bM-^@M-^\sha256M-bM-^@M-^]. The default is to print both. + + The -O option may be specified multiple times. + + -P passphrase + Provides the (old) passphrase. + + -p Requests changing the passphrase of a private key file instead of + creating a new private key. The program will prompt for the file + containing the private key, for the old passphrase, and twice for + the new passphrase. + + -Q Test whether keys have been revoked in a KRL. If the -l option + is also specified then the contents of the KRL will be printed. + + -q Silence ssh-keygen. + + -R hostname | [hostname]:port + Removes all keys belonging to the specified hostname (with + optional port number) from a known_hosts file. This option is + useful to delete hashed hosts (see the -H option above). + + -r hostname + Print the SSHFP fingerprint resource record named hostname for + the specified public key file. + + -s ca_key + Certify (sign) a public key using the specified CA key. See the + CERTIFICATES section for details. + + When generating a KRL, -s specifies a path to a CA public key + file used to revoke certificates directly by key ID or serial + number. See the KEY REVOCATION LISTS section for details. + + -t ecdsa | ecdsa-sk | ed25519 | ed25519-sk | mldsa44-ed25519 | rsa + Specifies the type of key to create. The possible values are + M-bM-^@M-^\ecdsaM-bM-^@M-^], M-bM-^@M-^\ecdsa-skM-bM-^@M-^], M-bM-^@M-^\ed25519 (the default),M-bM-^@M-^] M-bM-^@M-^\ed25519-skM-bM-^@M-^], + M-bM-^@M-^\mldsa44-ed25519M-bM-^@M-^] or M-bM-^@M-^\rsaM-bM-^@M-^]. + + This flag may also be used to specify the desired signature type + when signing certificates using an RSA CA key. The available RSA + signature variants are M-bM-^@M-^\ssh-rsaM-bM-^@M-^] (SHA1 signatures, not + recommended), M-bM-^@M-^\rsa-sha2-256M-bM-^@M-^], and M-bM-^@M-^\rsa-sha2-512M-bM-^@M-^] (the default for + RSA keys). + + -U When used in combination with -s or -Y sign, this option + indicates that a CA key resides in an ssh-agent(1). See the + CERTIFICATES section for more information. + + -u Update a KRL. When specified with -k, keys listed via the + command line are added to the existing KRL rather than a new KRL + being created. + + -V validity_interval + Specify a validity interval when signing a certificate. A + validity interval may consist of a single time, indicating that + the certificate is valid beginning now and expiring at that time, + or may consist of two times separated by a colon to indicate an + explicit time interval. + + The start time may be specified as: + M-bM-^@M-M-bM-^@M-" The string M-bM-^@M-^\alwaysM-bM-^@M-^] to indicate the certificate has no + specified start time. + M-bM-^@M-M-bM-^@M-" A date or time in the system time zone formatted as YYYYMMDD + or YYYYMMDDHHMM[SS]. + M-bM-^@M-M-bM-^@M-" A date or time in the UTC time zone as YYYYMMDDZ or + YYYYMMDDHHMM[SS]Z. + M-bM-^@M-M-bM-^@M-" A relative time before the current system time consisting of + a minus sign followed by an interval in the format described + in the TIME FORMATS section of sshd_config(5). + M-bM-^@M-M-bM-^@M-" A raw seconds since epoch (Jan 1 1970 00:00:00 UTC) as a + hexadecimal number beginning with M-bM-^@M-^\0xM-bM-^@M-^]. + + The end time may be specified similarly to the start time: + M-bM-^@M-M-bM-^@M-" The string M-bM-^@M-^\foreverM-bM-^@M-^] to indicate the certificate has no + specified end time. + M-bM-^@M-M-bM-^@M-" A date or time in the system time zone formatted as YYYYMMDD + or YYYYMMDDHHMM[SS]. + M-bM-^@M-M-bM-^@M-" A date or time in the UTC time zone as YYYYMMDDZ or + YYYYMMDDHHMM[SS]Z. + M-bM-^@M-M-bM-^@M-" A relative time after the current system time consisting of a + plus sign followed by an interval in the format described in + the TIME FORMATS section of sshd_config(5). + M-bM-^@M-M-bM-^@M-" A raw seconds since epoch (Jan 1 1970 00:00:00 UTC) as a + hexadecimal number beginning with M-bM-^@M-^\0xM-bM-^@M-^]. + + For example: + + +52w1d Valid from now to 52 weeks and one day from now. + + -4w:+4w + Valid from four weeks ago to four weeks from now. + + 20100101123000:20110101123000 + Valid from 12:30 PM, January 1st, 2010 to 12:30 PM, + January 1st, 2011. + + 20100101123000Z:20110101123000Z + Similar, but interpreted in the UTC time zone rather than + the system time zone. + + -1d:20110101 + Valid from yesterday to midnight, January 1st, 2011. + + 0x1:0x2000000000 + Valid from roughly early 1970 to May 2033. + + -1m:forever + Valid from one minute ago and never expiring. + + -v Verbose mode. Causes ssh-keygen to print debugging messages + about its progress. This is helpful for debugging moduli + generation. Multiple -v options increase the verbosity. The + maximum is 3. + + -w provider + Specifies a path to a library that will be used when creating + FIDO authenticator-hosted keys, overriding the default of using + the internal USB HID support. + + -Y find-principals + Find the principal(s) associated with the public key of a + signature, provided using the -s flag in an authorized signers + file provided using the -f flag. The format of the allowed + signers file is documented in the ALLOWED SIGNERS section below. + If one or more matching principals are found, they are returned + on standard output. + + -Y match-principals + Find principal matching the principal name provided using the -I + flag in the authorized signers file specified using the -f flag. + If one or more matching principals are found, they are returned + on standard output. + + -Y check-novalidate + Checks that a signature generated using ssh-keygen -Y sign has a + valid structure. This does not validate if a signature comes + from an authorized signer. When testing a signature, ssh-keygen + accepts a message on standard input and a signature namespace + using -n. A file containing the corresponding signature must + also be supplied using the -s flag. Successful testing of the + signature is signalled by ssh-keygen returning a zero exit + status. + + -Y sign + Cryptographically sign a file or some data using an SSH key. + When signing, ssh-keygen accepts zero or more files to sign on + the command-line - if no files are specified then ssh-keygen will + sign data presented on standard input. Signatures are written to + the path of the input file with M-bM-^@M-^\.sigM-bM-^@M-^] appended, or to standard + output if the message to be signed was read from standard input. + + The key used for signing is specified using the -f option and may + refer to either a private key, or a public key with the private + half available via ssh-agent(1). An additional signature + namespace, used to prevent signature confusion across different + domains of use (e.g. file signing vs email signing) must be + provided via the -n flag. Namespaces are arbitrary strings, and + may include: M-bM-^@M-^\fileM-bM-^@M-^] for file signing, M-bM-^@M-^\emailM-bM-^@M-^] for email signing. + For custom uses, it is recommended to use names following a + NAMESPACE@YOUR.DOMAIN pattern to generate unambiguous namespaces. + + -Y verify + Request to verify a signature generated using ssh-keygen -Y sign + as described above. When verifying a signature, ssh-keygen + accepts a message on standard input and a signature namespace + using -n. A file containing the corresponding signature must + also be supplied using the -s flag, along with the identity of + the signer using -I and a list of allowed signers via the -f + flag. The format of the allowed signers file is documented in + the ALLOWED SIGNERS section below. A file containing revoked + keys can be passed using the -r flag. The revocation file may be + a KRL or a one-per-line list of public keys. Successful + verification by an authorized signer is signalled by ssh-keygen + returning a zero exit status. + + -y This option will read a private OpenSSH format file and print an + OpenSSH public key to stdout. + + -Z cipher + Specifies the cipher to use for encryption when writing an + OpenSSH-format private key file. The list of available ciphers + may be obtained using "ssh -Q cipher". The default is + M-bM-^@M-^\aes256-ctrM-bM-^@M-^]. + + -z serial_number + Specifies a serial number to be embedded in the certificate to + distinguish this certificate from others from the same CA. If + the serial_number is prefixed with a M-bM-^@M-^X+M-bM-^@M-^Y character, then the + serial number will be incremented for each certificate signed on + a single command-line. The default serial number is zero. + + When generating a KRL, the -z flag is used to specify a KRL + version number. + +MODULI GENERATION + ssh-keygen may be used to generate groups for the Diffie-Hellman Group + Exchange (DH-GEX) protocol. Generating these groups is a two-step + process: first, candidate primes are generated using a fast, but memory + intensive process. These candidate primes are then tested for + suitability (a CPU-intensive process). + + Generation of primes is performed using the -M generate option. The + desired length of the primes may be specified by the -O bits option. For + example: + + # ssh-keygen -M generate -O bits=2048 moduli-2048.candidates + + By default, the search for primes begins at a random point in the desired + length range. This may be overridden using the -O start option, which + specifies a different start point (in hex). + + Once a set of candidates have been generated, they must be screened for + suitability. This may be performed using the -M screen option. In this + mode ssh-keygen will read candidates from standard input (or a file + specified using the -f option). For example: + + # ssh-keygen -M screen -f moduli-2048.candidates moduli-2048 + + By default, each candidate will be subjected to 100 primality tests. + This may be overridden using the -O prime-tests option. The DH generator + value will be chosen automatically for the prime under consideration. If + a specific generator is desired, it may be requested using the -O + generator option. Valid generator values are 2, 3, and 5. + + Screened DH groups may be installed in /etc/moduli. It is important that + this file contains moduli of a range of bit lengths. + + A number of options are available for moduli generation and screening via + the -O flag: + + lines=number + Exit after screening the specified number of lines while + performing DH candidate screening. + + start-line=line-number + Start screening at the specified line number while performing DH + candidate screening. + + checkpoint=filename + Write the last line processed to the specified file while + performing DH candidate screening. This will be used to skip + lines in the input file that have already been processed if the + job is restarted. + + start=hex-value + Specify start point (in hex) when generating candidate moduli for + DH-GEX. + + generator=value + Specify desired generator (in decimal) when testing candidate + moduli for DH-GEX. + +CERTIFICATES + ssh-keygen supports signing of keys to produce certificates that may be + used for user or host authentication. Certificates consist of a public + key, some identity information, zero or more principal (user or host) + names and a set of options that are signed by a Certification Authority + (CA) key. Clients or servers may then trust only the CA key and verify + its signature on a certificate rather than trusting many user/host keys. + Note that OpenSSH certificates are a different, and much simpler, format + to the X.509 certificates used in ssl(8). + + ssh-keygen supports two types of certificates: user and host. User + certificates authenticate users to servers, whereas host certificates + authenticate server hosts to users. To generate a user certificate: + + $ ssh-keygen -s /path/to/ca_key -I id -n user \ + M-BM- M-BM- M-BM- M-BM- M-BM- M-BM- /path/to/user_key.pub + + The resultant certificate will be placed in /path/to/user_key-cert.pub. + The argument to -I is a key identifier that will be used in logs and may + be used to revoke keys. The argument to -n is one or more (comma- + separated) principals, typically usernames, that the certificate + represents. A host certificate requires the -h option: + + $ ssh-keygen -s /path/to/ca_key -I id -h -n foo.example.org \ + M-BM- M-BM- M-BM- M-BM- M-BM- M-BM- /path/to/host_key.pub + + For host certificates, the principals specified using the -n argument are + hostnames and may contain wildcard characters. + + The host certificate will be output to /path/to/host_key-cert.pub. + + It is possible to sign using a CA key stored in a PKCS#11 token by + providing the token library using -D and identifying the CA key by + providing its public half as an argument to -s: + + $ ssh-keygen -s ca_key.pub -D libpkcs11.so -I id -n user \ + M-BM- M-BM- M-BM- M-BM- M-BM- M-BM- user_key.pub + + Similarly, it is possible for the CA key to be hosted in an ssh-agent(1). + This is indicated by the -U flag and, again, the CA key must be + identified by its public half. + + $ ssh-keygen -Us ca_key.pub -I id -n user user_key.pub + + In all cases, key_id is a "key identifier" that is logged by the server + when the certificate is used for authentication. + + Certificates are limited to be valid for a set of principal (user/host) + names. To generate a certificate for a specified set of principals: + + $ ssh-keygen -s ca_key -I id -n user1,user2 user_key.pub + $ ssh-keygen -s ca_key -I id -h -n host.domain host_key.pub + + Additional limitations on the validity and use of user certificates may + be specified through certificate options. A certificate option may + disable features of the SSH session, may be valid only when presented + from particular source addresses or may force the use of a specific + command. + + The options that are valid for user certificates are: + + clear Clear all enabled permissions. This is useful for clearing the + default set of permissions so permissions may be added + individually. + + critical:name[=contents] + extension:name[=contents] + Includes an arbitrary certificate critical option or extension. + The specified name should include a domain suffix, e.g. + M-bM-^@M-^\name@example.comM-bM-^@M-^]. If contents is specified then it is included + as the contents of the extension/option encoded as a string, + otherwise the extension/option is created with no contents + (usually indicating a flag). Extensions may be ignored by a + client or server that does not recognise them, whereas unknown + critical options will cause the certificate to be refused. + + force-command=command + Forces the execution of command instead of any shell or command + specified by the user when the certificate is used for + authentication. + + no-agent-forwarding + Disable ssh-agent(1) forwarding (permitted by default). + + no-port-forwarding + Disable port forwarding (permitted by default). + + no-pty Disable PTY allocation (permitted by default). + + no-user-rc + Disable execution of ~/.ssh/rc by sshd(8) (permitted by default). + + no-x11-forwarding + Disable X11 forwarding (permitted by default). + + permit-agent-forwarding + Allows ssh-agent(1) forwarding. + + permit-port-forwarding + Allows port forwarding. + + permit-pty + Allows PTY allocation. + + permit-user-rc + Allows execution of ~/.ssh/rc by sshd(8). + + permit-X11-forwarding + Allows X11 forwarding. + + no-touch-required + Do not require signatures made using this key include + demonstration of user presence (e.g. by having the user touch the + authenticator). This option only makes sense for the FIDO + authenticator algorithms ecdsa-sk and ed25519-sk. + + source-address=address_list + Restrict the source addresses from which the certificate is + considered valid. The address_list is a comma-separated list of + one or more address/netmask pairs in CIDR format. + + verify-required + Require signatures made using this key indicate that the user was + first verified, e.g. by PIN or on-token biometrics. This option + only makes sense for the FIDO authenticator algorithms ecdsa-sk + and ed25519-sk. + + At present, no standard options are valid for host keys. + + Finally, certificates may be defined with a validity lifetime. The -V + option allows specification of certificate start and end times. A + certificate that is presented at a time outside this range will not be + considered valid. By default, certificates are valid from the Unix Epoch + to the distant future. + + For certificates to be used for user or host authentication, the CA + public key must be trusted by sshd(8) or ssh(1). Refer to those manual + pages for details. + +FIDO AUTHENTICATOR + ssh-keygen is able to generate FIDO authenticator-backed keys, after + which they may be used much like any other key type supported by OpenSSH, + so long as the hardware authenticator is attached when the keys are used. + FIDO authenticators generally require the user to explicitly authorise + operations by touching or tapping them. FIDO keys consist of two parts: + a key handle part stored in the private key file on disk, and a per- + device private key that is unique to each FIDO authenticator and that + cannot be exported from the authenticator hardware. These are combined + by the hardware at authentication time to derive the real key that is + used to sign authentication challenges. Supported key types are ecdsa-sk + and ed25519-sk. + + The options that are valid for FIDO keys are: + + application + Override the default FIDO application/origin string of M-bM-^@M-^\ssh:M-bM-^@M-^]. + This may be useful when generating host or domain-specific + resident keys. The specified application string must begin with + M-bM-^@M-^\ssh:M-bM-^@M-^]. + + challenge=path + Specifies a path to a challenge string that will be passed to the + FIDO authenticator during key generation. The challenge string + may be used as part of an out-of-band protocol for key enrollment + (a random challenge is used by default). + + device Explicitly specify a fido(4) device to use, rather than letting + the authenticator middleware select one. + + no-touch-required + Indicate that the generated private key should not require touch + events (user presence) when making signatures. Note that sshd(8) + will refuse such signatures by default, unless overridden via an + authorized_keys option. + + resident + Indicate that the key handle should be stored on the FIDO + authenticator itself. This makes it easier to use the + authenticator on multiple computers. Resident keys may be + supported on FIDO2 authenticators and typically require that a + PIN be set on the authenticator prior to generation. Resident + keys may be loaded off the authenticator using ssh-add(1). + Storing both parts of a key on a FIDO authenticator increases the + likelihood of an attacker being able to use a stolen + authenticator device. + + user A username to be associated with a resident key, overriding the + empty default username. Specifying a username may be useful when + generating multiple resident keys for the same application name. + + verify-required + Indicate that this private key should require user verification + for each signature. Not all FIDO authenticators support this + option. Currently PIN authentication is the only supported + verification method, but other methods may be supported in the + future. + + write-attestation=path + May be used at key generation time to record the attestation data + returned from FIDO authenticators during key generation. This + information is potentially sensitive. By default, this + information is discarded. + +KEY REVOCATION LISTS + ssh-keygen is able to manage OpenSSH format Key Revocation Lists (KRLs). + These binary files specify keys or certificates to be revoked using a + compact format, taking as little as one bit per certificate if they are + being revoked by serial number. + + KRLs may be generated using the -k flag. This option reads one or more + files from the command line and generates a new KRL. The files may + either contain a KRL specification (see below) or public keys, listed one + per line. Plain public keys are revoked by listing their hash or + contents in the KRL and certificates revoked by serial number or key ID + (if the serial is zero or not available). + + Revoking keys using a KRL specification offers explicit control over the + types of record used to revoke keys and may be used to directly revoke + certificates by serial number or key ID without having the complete + original certificate on hand. A KRL specification consists of lines + containing one of the following directives followed by a colon and some + directive-specific information. + + serial: serial_number[-serial_number] + Revokes a certificate with the specified serial number. Serial + numbers are 64-bit values, not including zero and may be + expressed in decimal, hex or octal. If two serial numbers are + specified separated by a hyphen, then the range of serial numbers + including and between each is revoked. The CA key must have been + specified on the ssh-keygen command line using the -s option. + + id: key_id + Revokes a certificate with the specified key ID string. The CA + key must have been specified on the ssh-keygen command line using + the -s option. + + key: public_key + Revokes the specified key. If a certificate is listed, then it + is revoked as a plain public key. + + sha1: public_key + Revokes the specified key by including its SHA1 hash in the KRL. + + sha256: public_key + Revokes the specified key by including its SHA256 hash in the + KRL. KRLs that revoke keys by SHA256 hash are not supported by + OpenSSH versions prior to 7.9. + + hash: fingerprint + Revokes a key using a fingerprint hash, as obtained from an + sshd(8) authentication log message or the ssh-keygen -l flag. + Only SHA256 fingerprints are supported here and resultant KRLs + are not supported by OpenSSH versions prior to 7.9. + + KRLs may be updated using the -u flag in addition to -k. When this + option is specified, keys listed via the command line are merged into the + KRL, adding to those already there. + + It is also possible, given a KRL, to test whether it revokes a particular + key (or keys). The -Q flag will query an existing KRL, testing each key + specified on the command line. If any key listed on the command line has + been revoked (or an error encountered) then ssh-keygen will exit with a + non-zero exit status. A zero exit status will only be returned if no key + was revoked. + +ALLOWED SIGNERS + When verifying signatures, ssh-keygen uses a simple list of identities + and keys to determine whether a signature comes from an authorized + source. This "allowed signers" file uses a format patterned after the + AUTHORIZED_KEYS FILE FORMAT described in sshd(8). Each line of the file + contains the following space-separated fields: principals, options, + keytype, base64-encoded key. Empty lines and lines starting with a M-bM-^@M-^X#M-bM-^@M-^Y + are ignored as comments. + + The principals field is a pattern-list (see PATTERNS in ssh_config(5)) + consisting of one or more comma-separated USER@DOMAIN identity patterns + that are accepted for signing. When verifying, the identity presented + via the -I option must match a principals pattern in order for the + corresponding key to be considered acceptable for verification. + + The options (if present) consist of comma-separated option + specifications. No spaces are permitted, except within double quotes. + The following option specifications are supported (note that option + keywords are case-insensitive): + + cert-authority + Indicates that this key is accepted as a certificate authority + (CA) and that certificates signed by this CA may be accepted for + verification. + + namespaces=namespace-list + Specifies a pattern-list of namespaces that are accepted for this + key. If this option is present, the signature namespace embedded + in the signature object and presented on the verification + command-line must match the specified list before the key will be + considered acceptable. + + valid-after=timestamp + Indicates that the key is valid for use at or after the specified + timestamp, which may be a date or time in the YYYYMMDD[Z] or + YYYYMMDDHHMM[SS][Z] formats. Dates and times will be interpreted + in the current system time zone unless suffixed with a Z + character, which causes them to be interpreted in the UTC time + zone. + + valid-before=timestamp + Indicates that the key is valid for use at or before the + specified timestamp. + + When verifying signatures made by certificates, the expected principal + name must match both the principals pattern in the allowed signers file + and the principals embedded in the certificate itself. + + An example allowed signers file: + + # Comments allowed at start of line + user1@example.com,user2@example.com ssh-rsa AAAAX1... + # A certificate authority, trusted for all principals in a domain. + *@example.com cert-authority ssh-ed25519 AAAB4... + # A key that is accepted only for file signing. + user2@example.com namespaces="file" ssh-ed25519 AAA41... + +ENVIRONMENT + SSH_SK_PROVIDER + Specifies a path to a library that will be used when loading any + FIDO authenticator-hosted keys, overriding the default of using + the built-in USB HID support. + +FILES + ~/.ssh/id_ecdsa + ~/.ssh/id_ecdsa_sk + ~/.ssh/id_ed25519 + ~/.ssh/id_ed25519_sk + ~/.ssh/id_mldsa44-ed25519 + ~/.ssh/id_rsa + Contains the ECDSA, authenticator-hosted ECDSA, Ed25519, + authenticator-hosted Ed25519 or RSA authentication identity of + the user. This file should not be readable by anyone but the + user. It is possible to specify a passphrase when generating the + key; that passphrase will be used to encrypt the private part of + this file using 128-bit AES. This file is not automatically + accessed by ssh-keygen but it is offered as the default file for + the private key. ssh(1) will read this file when a login attempt + is made. + + ~/.ssh/id_ecdsa.pub + ~/.ssh/id_ecdsa_sk.pub + ~/.ssh/id_ed25519.pub + ~/.ssh/id_ed25519_sk.pub + ~/.ssh/id_mldsa44-ed25519.pub + ~/.ssh/id_rsa.pub + Contains the ECDSA, authenticator-hosted ECDSA, Ed25519, + authenticator-hosted Ed25519 or RSA public key for + authentication. The contents of this file should be added to + ~/.ssh/authorized_keys on all machines where the user wishes to + log in using public key authentication. There is no need to keep + the contents of this file secret. + + /etc/moduli + Contains Diffie-Hellman groups used for DH-GEX. The file format + is described in moduli(5). + +SEE ALSO + ssh(1), ssh-add(1), ssh-agent(1), moduli(5), sshd(8) + + The Secure Shell (SSH) Public Key File Format, RFC 4716, 2006. + +AUTHORS + OpenSSH is a derivative of the original and free ssh 1.2.12 release by + Tatu Ylonen. Aaron Campbell, Bob Beck, Markus Friedl, Niels Provos, Theo + de Raadt and Dug Song removed many bugs, re-added newer features and + created OpenSSH. Markus Friedl contributed the support for SSH protocol + versions 1.5 and 2.0. + +OpenBSD 7.9 July 1, 2026 SSH-KEYGEN(1) diff --git a/ssh-keyscan.0 b/ssh-keyscan.0 new file mode 100644 index 000000000000..a575fa135c36 --- /dev/null +++ b/ssh-keyscan.0 @@ -0,0 +1,129 @@ +SSH-KEYSCAN(1) General Commands Manual SSH-KEYSCAN(1) + +NAME + ssh-keyscan M-bM-^@M-^S gather SSH public keys from servers + +SYNOPSIS + ssh-keyscan [-46cDHqv] [-f file] [-O option] [-p port] [-T timeout] + [-t type] [host | addrlist namelist] + +DESCRIPTION + ssh-keyscan is a utility for gathering the public SSH host keys of a + number of hosts. It was designed to aid in building and verifying + ssh_known_hosts files, the format of which is documented in sshd(8). + ssh-keyscan provides a minimal interface suitable for use by shell and + perl scripts. + + ssh-keyscan uses non-blocking socket I/O to contact as many hosts as + possible in parallel, so it is very efficient. The keys from a domain of + 1,000 hosts can be collected in tens of seconds, even when some of those + hosts are down or do not run sshd(8). For scanning, one does not need + login access to the machines that are being scanned, nor does the + scanning process involve any encryption. + + Hosts to be scanned may be specified by hostname, address or by CIDR + network range (e.g. 192.168.16/28). If a network range is specified, + then all addresses in that range will be scanned. + + ssh-keyscan cannot verify the authenticity of the host keys it obtains, + and an attacker on the network with the ability to intercept traffic + could substitute their own host keys to enable impersonation of servers. + Because of this, ssh-keyscan output should be verified out of band, or + only used directly for host authentication if the network is trusted. + + The options are as follows: + + -4 Force ssh-keyscan to use IPv4 addresses only. + + -6 Force ssh-keyscan to use IPv6 addresses only. + + -c Request certificates from target hosts instead of plain keys. + + -D Print keys found as SSHFP DNS records. The default is to print + keys in a format usable as an ssh(1) known_hosts file. + + -f file + Read hosts or M-bM-^@M-^\addrlist namelistM-bM-^@M-^] pairs from file, one per line. + If M-bM-^@M-^X-M-bM-^@M-^Y is supplied instead of a filename, ssh-keyscan will read + from the standard input. Names read from a file must start with + an address, hostname or CIDR network range to be scanned. + Addresses and hostnames may optionally be followed by comma- + separated name or address aliases that will be copied to the + output. For example: + + 192.168.11.0/24 + 10.20.1.1 + happy.example.org + 10.0.0.1,sad.example.org + + -H Hash all hostnames and addresses in the output. Hashed names may + be used normally by ssh(1) and sshd(8), but they do not reveal + identifying information should the file's contents be disclosed. + + -O option + Specify a key/value option. At present, only a single option is + supported: + + hashalg=algorithm + Selects a hash algorithm to use when printing SSHFP + records using the -D flag. Valid algorithms are M-bM-^@M-^\sha1M-bM-^@M-^] + and M-bM-^@M-^\sha256M-bM-^@M-^]. The default is to print both. + + -p port + Connect to port on the remote host. + + -q Quiet mode: do not print server host name and banners in + comments. + + -T timeout + Set the timeout for connection attempts. If timeout seconds have + elapsed since a connection was initiated to a host or since the + last time anything was read from that host, the connection is + closed and the host in question considered unavailable. The + default is 5 seconds. + + -t type + Specify the type of the key to fetch from the scanned hosts. The + possible values are M-bM-^@M-^\ecdsaM-bM-^@M-^], M-bM-^@M-^\ed25519M-bM-^@M-^], M-bM-^@M-^\ecdsa-skM-bM-^@M-^], M-bM-^@M-^\ed25519-skM-bM-^@M-^], + or M-bM-^@M-^\rsaM-bM-^@M-^]. Multiple values may be specified by separating them + with commas. The default is to fetch all the above key types. + + -v Verbose mode: print debugging messages about progress. + + If an ssh_known_hosts file is constructed using ssh-keyscan without + verifying the keys, users will be vulnerable to man in the middle + attacks. On the other hand, if the security model allows such a risk, + ssh-keyscan can help in the detection of tampered keyfiles or man in the + middle attacks which have begun after the ssh_known_hosts file was + created. + +FILES + /etc/ssh/ssh_known_hosts + +EXAMPLES + Print the RSA host key for machine hostname: + + $ ssh-keyscan -t rsa hostname + + Search a network range, printing all supported key types: + + $ ssh-keyscan 192.168.0.64/25 + + Find all hosts from the file ssh_hosts which have new or different keys + from those in the sorted file ssh_known_hosts: + + $ ssh-keyscan -t rsa,ecdsa,ed25519 -f ssh_hosts | \ + sort -u - ssh_known_hosts | diff ssh_known_hosts - + +SEE ALSO + ssh(1), sshd(8) + + Using DNS to Securely Publish Secure Shell (SSH) Key Fingerprints, RFC + 4255, 2006. + +AUTHORS + David Mazieres wrote the initial version, and Wayne + Davison added support for protocol version + 2. + +OpenBSD 7.9 June 26, 2026 SSH-KEYSCAN(1) diff --git a/ssh-keysign.0 b/ssh-keysign.0 new file mode 100644 index 000000000000..ba62dbec5cdb --- /dev/null +++ b/ssh-keysign.0 @@ -0,0 +1,50 @@ +SSH-KEYSIGN(8) System Manager's Manual SSH-KEYSIGN(8) + +NAME + ssh-keysign M-bM-^@M-^S OpenSSH helper for host-based authentication + +SYNOPSIS + ssh-keysign + +DESCRIPTION + ssh-keysign is used by ssh(1) to access the local host keys and generate + the digital signature required during host-based authentication. + + ssh-keysign is disabled by default and can only be enabled in the global + client configuration file /etc/ssh/ssh_config by setting EnableSSHKeysign + to M-bM-^@M-^\yesM-bM-^@M-^]. + + ssh-keysign is not intended to be invoked by the user, but from ssh(1). + See ssh(1) and sshd(8) for more information about host-based + authentication. + +FILES + /etc/ssh/ssh_config + Controls whether ssh-keysign is enabled. + + /etc/ssh/ssh_host_ecdsa_key + /etc/ssh/ssh_host_ed25519_key + /etc/ssh/ssh_host_rsa_key + These files contain the private parts of the host keys used to + generate the digital signature. They should be owned by root, + readable only by root, and not accessible to others. Since they + are readable only by root, ssh-keysign must be set-uid root if + host-based authentication is used. + + /etc/ssh/ssh_host_ecdsa_key-cert.pub + /etc/ssh/ssh_host_ed25519_key-cert.pub + /etc/ssh/ssh_host_rsa_key-cert.pub + If these files exist, they are assumed to contain public + certificate information corresponding with the private keys + above. + +SEE ALSO + ssh(1), ssh-keygen(1), ssh_config(5), sshd(8) + +HISTORY + ssh-keysign first appeared in OpenBSD 3.2. + +AUTHORS + Markus Friedl + +OpenBSD 7.9 June 17, 2024 SSH-KEYSIGN(8) diff --git a/ssh-pkcs11-helper.0 b/ssh-pkcs11-helper.0 new file mode 100644 index 000000000000..5449eb1ec9ed --- /dev/null +++ b/ssh-pkcs11-helper.0 @@ -0,0 +1,35 @@ +SSH-PKCS11-HELPER(8) System Manager's Manual SSH-PKCS11-HELPER(8) + +NAME + ssh-pkcs11-helper M-bM-^@M-^S OpenSSH helper for PKCS#11 support + +SYNOPSIS + ssh-pkcs11-helper [-v] + +DESCRIPTION + ssh-pkcs11-helper is used by ssh(1), ssh-agent(1), and ssh-keygen(1) to + access keys provided by a PKCS#11 token. + + ssh-pkcs11-helper is not intended to be invoked directly by the user. + + A single option is supported: + + -v Verbose mode. Causes ssh-pkcs11-helper to print debugging + messages about its progress. This is helpful in debugging + problems. Multiple -v options increase the verbosity. The + maximum is 3. + + Note that ssh(1), ssh-agent(1), and ssh-keygen(1) will + automatically pass the -v flag to ssh-pkcs11-helper when they + have themselves been placed in debug mode. + +SEE ALSO + ssh(1), ssh-agent(1), ssh-keygen(1) + +HISTORY + ssh-pkcs11-helper first appeared in OpenBSD 4.7. + +AUTHORS + Markus Friedl + +OpenBSD 7.9 April 29, 2022 SSH-PKCS11-HELPER(8) diff --git a/ssh-sk-helper.0 b/ssh-sk-helper.0 new file mode 100644 index 000000000000..ed12665f0255 --- /dev/null +++ b/ssh-sk-helper.0 @@ -0,0 +1,34 @@ +SSH-SK-HELPER(8) System Manager's Manual SSH-SK-HELPER(8) + +NAME + ssh-sk-helper M-bM-^@M-^S OpenSSH helper for FIDO authenticator support + +SYNOPSIS + ssh-sk-helper [-v] + +DESCRIPTION + ssh-sk-helper is used by ssh(1), ssh-agent(1), and ssh-keygen(1) to + access keys provided by a FIDO authenticator. + + ssh-sk-helper is not intended to be invoked directly by the user. + + A single option is supported: + + -v Verbose mode. Causes ssh-sk-helper to print debugging messages + about its progress. This is helpful in debugging problems. + Multiple -v options increase the verbosity. The maximum is 3. + + Note that ssh(1), ssh-agent(1), and ssh-keygen(1) will + automatically pass the -v flag to ssh-sk-helper when they have + themselves been placed in debug mode. + +SEE ALSO + ssh(1), ssh-agent(1), ssh-keygen(1) + +HISTORY + ssh-sk-helper first appeared in OpenBSD 6.7. + +AUTHORS + Damien Miller + +OpenBSD 7.9 April 29, 2022 SSH-SK-HELPER(8) diff --git a/ssh.0 b/ssh.0 new file mode 100644 index 000000000000..6f1eac5906d3 --- /dev/null +++ b/ssh.0 @@ -0,0 +1,1034 @@ +SSH(1) General Commands Manual SSH(1) + +NAME + ssh M-bM-^@M-^S OpenSSH remote login client + +SYNOPSIS + ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address] + [-c cipher_spec] [-D [bind_address:]port] [-E log_file] + [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] + [-J destination] [-L address] [-l login_name] [-m mac_spec] + [-O ctl_cmd] [-o option] [-P tag] [-p port] [-R address] + [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] destination + [command [argument ...]] + ssh [-Q query_option] + +DESCRIPTION + ssh (SSH client) is a program for logging into a remote machine and for + executing commands on a remote machine. It is intended to provide secure + encrypted communications between two untrusted hosts over an insecure + network. X11 connections, arbitrary TCP ports and Unix-domain sockets + can also be forwarded over the secure channel. + + ssh connects and logs into the specified destination, which may be + specified as either [user@]hostname or a URI of the form + ssh://[user@]hostname[:port]. The user must prove their identity to the + remote machine using one of several methods (see below). + + If a command is specified, it will be executed on the remote host instead + of a login shell. A complete command line may be specified as command, + or it may have additional arguments. If supplied, the arguments will be + appended to the command, separated by spaces, before it is sent to the + server to be executed. + + The options are as follows: + + -4 Forces ssh to use IPv4 addresses only. + + -6 Forces ssh to use IPv6 addresses only. + + -A Enables forwarding of connections from an authentication agent + such as ssh-agent(1). This can also be specified on a per-host + basis in a configuration file. + + Agent forwarding should be enabled with caution. Users with the + ability to bypass file permissions on the remote host (for the + agent's Unix-domain socket) can access the local agent through + the forwarded connection. An attacker cannot obtain key material + from the agent, however they can perform operations on the keys + that enable them to authenticate using the identities loaded into + the agent. A safer alternative may be to use a jump host (see + -J). + + -a Disables forwarding of the authentication agent connection. + + -B bind_interface + Bind to the address of bind_interface before attempting to + connect to the destination host. This is only useful on systems + with more than one address. + + -b bind_address + Use bind_address on the local machine as the source address of + the connection. Only useful on systems with more than one + address. + + -C Requests compression of all data (including stdin, stdout, + stderr, and data for forwarded X11, TCP and Unix-domain + connections). The compression algorithm is the same used by + gzip(1). Compression is desirable on modem lines and other slow + connections, but will only slow down things on fast networks. + The default value can be set on a host-by-host basis in the + configuration files; see the Compression option in ssh_config(5). + + -c cipher_spec + Selects the cipher specification for encrypting the session. + cipher_spec is a comma-separated list of ciphers listed in order + of preference. See the Ciphers keyword in ssh_config(5) for more + information. + + -D [bind_address:]port + Specifies a local M-bM-^@M-^\dynamicM-bM-^@M-^] application-level port forwarding. + This works by allocating a socket to listen to port on the local + side, optionally bound to the specified bind_address. Whenever a + connection is made to this port, the connection is forwarded over + the secure channel, and the application protocol is then used to + determine where to connect to from the remote machine. Currently + the SOCKS4 and SOCKS5 protocols are supported, and ssh will act + as a SOCKS server. Only root can forward privileged ports. + Dynamic port forwardings can also be specified in the + configuration file. + + IPv6 addresses can be specified by enclosing the address in + square brackets. Only the superuser can forward privileged + ports. By default, the local port is bound in accordance with + the GatewayPorts setting. However, an explicit bind_address may + be used to bind the connection to a specific address. The + bind_address of M-bM-^@M-^\localhostM-bM-^@M-^] indicates that the listening port be + bound for local use only, while an empty address or M-bM-^@M-^X*M-bM-^@M-^Y indicates + that the port should be available from all interfaces. + + -E log_file + Append debug logs to log_file instead of standard error. + + -e escape_char + Sets the escape character for sessions with a pty (default: M-bM-^@M-^X~M-bM-^@M-^Y). + The escape character is only recognized at the beginning of a + line. The escape character followed by a dot (M-bM-^@M-^X.M-bM-^@M-^Y) closes the + connection; followed by control-Z suspends the connection; and + followed by itself sends the escape character once. Setting the + character to M-bM-^@M-^\noneM-bM-^@M-^] disables any escapes and makes the session + fully transparent. + + -F configfile + Specifies an alternative per-user configuration file. If a + configuration file is given on the command line, the system-wide + configuration file (/etc/ssh/ssh_config) will be ignored. The + default for the per-user configuration file is ~/.ssh/config. If + set to M-bM-^@M-^\noneM-bM-^@M-^], no configuration files will be read. + + -f Requests ssh to go to background just before command execution. + This is useful if ssh is going to ask for passwords or + passphrases, but the user wants it in the background. This + implies -n. The recommended way to start X11 programs at a + remote site is with something like ssh -f host xterm. + + If the ExitOnForwardFailure configuration option is set to M-bM-^@M-^\yesM-bM-^@M-^], + then a client started with -f will wait for all remote port + forwards to be successfully established before placing itself in + the background. Refer to the description of + ForkAfterAuthentication in ssh_config(5) for details. + + -G Causes ssh to print its configuration after evaluating Host and + Match blocks and exit. + + -g Allows remote hosts to connect to local forwarded ports. If used + on a multiplexed connection, then this option must be specified + on the master process. + + -I pkcs11 + Specify the PKCS#11 shared library ssh should use to communicate + with a PKCS#11 token providing keys for user authentication. + + -i identity_file + Selects a file from which the identity (private key) for public + key authentication is read. You can also specify a public key + file to use the corresponding private key that is loaded in + ssh-agent(1) when the private key file is not present locally. + The default is ~/.ssh/id_rsa, ~/.ssh/id_ecdsa, + ~/.ssh/id_ecdsa_sk, ~/.ssh/id_ed25519 and ~/.ssh/id_ed25519_sk. + Identity files may also be specified on a per-host basis in the + configuration file. It is possible to have multiple -i options + (and multiple identities specified in configuration files). If + no certificates have been explicitly specified by the + CertificateFile directive, ssh will also try to load certificate + information from the filename obtained by appending -cert.pub to + identity filenames. + + -J destination + Connect to the target host by first making an ssh connection to + the jump host described by destination and then establishing a + TCP forwarding to the ultimate destination from there. Multiple + jump hops may be specified separated by comma characters. IPv6 + addresses can be specified by enclosing the address in square + brackets. This is a shortcut to specify a ProxyJump + configuration directive. Note that configuration directives + supplied on the command-line generally apply to the destination + host and not any specified jump hosts. Use ~/.ssh/config to + specify configuration for jump hosts. + + -K Enables GSSAPI-based authentication and forwarding (delegation) + of GSSAPI credentials to the server. + + -k Disables forwarding (delegation) of GSSAPI credentials to the + server. + + -L [bind_address:]port:host:hostport + -L [bind_address:]port:remote_socket + -L local_socket:host:hostport + -L local_socket:remote_socket + Specifies that connections to the given TCP port or Unix socket + on the local (client) host are to be forwarded to the given host + and port, or Unix socket, on the remote side. This works by + allocating a socket to listen to either a TCP port on the local + side, optionally bound to the specified bind_address, or to a + Unix socket. Whenever a connection is made to the local port or + socket, the connection is forwarded over the secure channel, and + a connection is made to either host port hostport, or the Unix + socket remote_socket, from the remote machine. + + Port forwardings can also be specified in the configuration file. + Only the superuser can forward privileged ports. IPv6 addresses + can be specified by enclosing the address in square brackets. + + By default, the local port is bound in accordance with the + GatewayPorts setting. However, an explicit bind_address may be + used to bind the connection to a specific address. The + bind_address of M-bM-^@M-^\localhostM-bM-^@M-^] indicates that the listening port be + bound for local use only, while an empty address or M-bM-^@M-^X*M-bM-^@M-^Y indicates + that the port should be available from all interfaces. + + -l login_name + Specifies the user to log in as on the remote machine. This also + may be specified on a per-host basis in the configuration file. + + -M Places the ssh client into M-bM-^@M-^\masterM-bM-^@M-^] mode for connection sharing. + Multiple -M options places ssh into M-bM-^@M-^\masterM-bM-^@M-^] mode but with + confirmation required using ssh-askpass(1) before each operation + that changes the multiplexing state (e.g. opening a new session). + Refer to the description of ControlMaster in ssh_config(5) for + details. + + -m mac_spec + A comma-separated list of MAC (message authentication code) + algorithms, specified in order of preference. See the MACs + keyword in ssh_config(5) for more information. + + -N Do not execute a remote command. This is useful for just + forwarding ports. Refer to the description of SessionType in + ssh_config(5) for details. + + -n Redirects stdin from /dev/null (actually, prevents reading from + stdin). This must be used when ssh is run in the background. A + common trick is to use this to run X11 programs on a remote + machine. For example, ssh -n shadows.cs.hut.fi emacs & will + start an emacs on shadows.cs.hut.fi, and the X11 connection will + be automatically forwarded over an encrypted channel. The ssh + program will be put in the background. (This does not work if + ssh needs to ask for a password or passphrase; see also the -f + option.) Refer to the description of StdinNull in ssh_config(5) + for details. + + -O ctl_cmd + Control an active connection multiplexing master process. When + the -O option is specified, the ctl_cmd argument is interpreted + and passed to the master process. Valid commands are: M-bM-^@M-^\checkM-bM-^@M-^] + (check that the master process is running), M-bM-^@M-^\conninfoM-bM-^@M-^] (report + information about the master connection), M-bM-^@M-^\channelsM-bM-^@M-^] (report + information about open channels), M-bM-^@M-^\forwardM-bM-^@M-^] (request forwardings + without command execution), M-bM-^@M-^\cancelM-bM-^@M-^] (cancel forwardings), + M-bM-^@M-^\proxyM-bM-^@M-^] (connect to a running multiplexing master in proxy mode), + M-bM-^@M-^\exitM-bM-^@M-^] (request the master to exit), and M-bM-^@M-^\stopM-bM-^@M-^] (request the + master to stop accepting further multiplexing requests). + + -o option + Can be used to give options in the format used in the + configuration file. This is useful for specifying options for + which there is no separate command-line flag. For full details + of the options listed below, and their possible values, see + ssh_config(5). + + AddKeysToAgent + AddressFamily + BatchMode + BindAddress + BindInterface + CASignatureAlgorithms + CanonicalDomains + CanonicalizeFallbackLocal + CanonicalizeHostname + CanonicalizeMaxDots + CanonicalizePermittedCNAMEs + CertificateFile + ChannelTimeout + CheckHostIP + Ciphers + ClearAllForwardings + Compression + ConnectTimeout + ConnectionAttempts + ControlMaster + ControlPath + ControlPersist + DynamicForward + EnableEscapeCommandline + EnableSSHKeysign + EscapeChar + ExitOnForwardFailure + FingerprintHash + ForkAfterAuthentication + ForwardAgent + ForwardX11 + ForwardX11Timeout + ForwardX11Trusted + GSSAPIAuthentication + GSSAPIDelegateCredentials + GatewayPorts + GlobalKnownHostsFile + HashKnownHosts + HostKeyAlgorithms + HostKeyAlias + HostbasedAcceptedAlgorithms + HostbasedAuthentication + Hostname + IPQoS + IdentitiesOnly + IdentityAgent + IdentityFile + IgnoreUnknown + KbdInteractiveAuthentication + KbdInteractiveDevices + KexAlgorithms + KnownHostsCommand + LocalCommand + LocalForward + LogLevel + LogVerbose + MACs + NoHostAuthenticationForLocalhost + NumberOfPasswordPrompts + ObscureKeystrokeTiming + PKCS11Provider + PasswordAuthentication + PermitLocalCommand + PermitRemoteOpen + Port + PreferredAuthentications + ProxyCommand + ProxyJump + ProxyUseFdpass + PubkeyAcceptedAlgorithms + PubkeyAuthentication + RefuseConnection + RekeyLimit + RemoteCommand + RemoteForward + RequestTTY + RequiredRSASize + RevokedHostKeys + SecurityKeyProvider + SendEnv + ServerAliveCountMax + ServerAliveInterval + SessionType + SetEnv + StdinNull + StreamLocalBindMask + StreamLocalBindUnlink + StrictHostKeyChecking + SyslogFacility + TCPKeepAlive + Tag + Tunnel + TunnelDevice + UpdateHostKeys + User + UserKnownHostsFile + VerifyHostKeyDNS + VersionAddendum + VisualHostKey + WarnWeakCrypto + XAuthLocation + + -P tag Specify a tag name that may be used to select configuration in + ssh_config(5). Refer to the Tag and Match keywords in + ssh_config(5) for more information. + -p port + Port to connect to on the remote host. This can be specified on + a per-host basis in the configuration file. + + -Q query_option + Queries for the algorithms supported by one of the following + features: cipher (supported symmetric ciphers), cipher-auth + (supported symmetric ciphers that support authenticated + encryption), help (supported query terms for use with the -Q + flag), mac (supported message integrity codes), kex (key exchange + algorithms), key (key types), key-ca-sign (valid CA signature + algorithms for certificates), key-cert (certificate key types), + key-plain (non-certificate key types), key-sig (all key types and + signature algorithms), protocol-version (supported SSH protocol + versions), and sig (supported signature algorithms). + Alternatively, any keyword from ssh_config(5) or sshd_config(5) + that takes an algorithm list may be used as an alias for the + corresponding query_option. + + -q Quiet mode. Causes most warning and diagnostic messages to be + suppressed. + + -R [bind_address:]port:host:hostport + -R [bind_address:]port:local_socket + -R remote_socket:host:hostport + -R remote_socket:local_socket + -R [bind_address:]port + Specifies that connections to the given TCP port or Unix socket + on the remote (server) host are to be forwarded to the local + side. + + This works by allocating a socket to listen to either a TCP port + or to a Unix socket on the remote side. Whenever a connection is + made to this port or Unix socket, the connection is forwarded + over the secure channel, and a connection is made from the local + machine to either an explicit destination specified by host port + hostport, or local_socket, or, if no explicit destination was + specified, ssh will act as a SOCKS 4/5 proxy and forward + connections to the destinations requested by the remote SOCKS + client. + + Port forwardings can also be specified in the configuration file. + Privileged ports can be forwarded only when logging in as root on + the remote machine. IPv6 addresses can be specified by enclosing + the address in square brackets. + + By default, TCP listening sockets on the server will be bound to + the loopback interface only. This may be overridden by + specifying a bind_address. An empty bind_address, or the address + M-bM-^@M-^X*M-bM-^@M-^Y, indicates that the remote socket should listen on all + interfaces. Specifying a remote bind_address will only succeed + if the server's GatewayPorts option is enabled (see + sshd_config(5)). + + If the port argument is M-bM-^@M-^X0M-bM-^@M-^Y, the listen port will be dynamically + allocated on the server and reported to the client at run time. + When used together with -O forward, the allocated port will be + printed to the standard output. + + -S ctl_path + Specifies the location of a control socket for connection + sharing, or the string M-bM-^@M-^\noneM-bM-^@M-^] to disable connection sharing. + Refer to the description of ControlPath and ControlMaster in + ssh_config(5) for details. + + -s May be used to request invocation of a subsystem on the remote + system. Subsystems facilitate the use of SSH as a secure + transport for other applications (e.g. sftp(1)). The subsystem + is specified as the remote command. Refer to the description of + SessionType in ssh_config(5) for details. + + -T Disable pseudo-terminal allocation. + + -t Force pseudo-terminal allocation. This can be used to execute + arbitrary screen-based programs on a remote machine, which can be + very useful, e.g. when implementing menu services. Multiple -t + options force tty allocation, even if ssh has no local tty. + + -V Display the version number and exit. + + -v Verbose mode. Causes ssh to print debugging messages about its + progress. This is helpful in debugging connection, + authentication, and configuration problems. Multiple -v options + increase the verbosity. The maximum is 3. + + -W host:port + Requests that standard input and output on the client be + forwarded to host on port over the secure channel. Implies -N, + -T, ExitOnForwardFailure and ClearAllForwardings, though these + can be overridden in the configuration file or using -o command + line options. + + -w local_tun[:remote_tun] + Requests tunnel device forwarding with the specified tun(4) + devices between the client (local_tun) and the server + (remote_tun). + + The devices may be specified by numerical ID or the keyword + M-bM-^@M-^\anyM-bM-^@M-^], which uses the next available tunnel device. If + remote_tun is not specified, it defaults to M-bM-^@M-^\anyM-bM-^@M-^]. See also the + Tunnel and TunnelDevice directives in ssh_config(5). + + If the Tunnel directive is unset, it will be set to the default + tunnel mode, which is M-bM-^@M-^\point-to-pointM-bM-^@M-^]. If a different Tunnel + forwarding mode it desired, then it should be specified before + -w. + + -X Enables X11 forwarding. This can also be specified on a per-host + basis in a configuration file. + + X11 forwarding should be enabled with caution. Users with the + ability to bypass file permissions on the remote host (for the + user's X authorization database) can access the local X11 display + through the forwarded connection. An attacker may then be able + to perform activities such as keystroke monitoring. + + For this reason, X11 forwarding is subjected to X11 SECURITY + extension restrictions by default. Refer to the ssh -Y option + and the ForwardX11Trusted directive in ssh_config(5) for more + information. + + -x Disables X11 forwarding. + + -Y Enables trusted X11 forwarding. Trusted X11 forwardings are not + subjected to the X11 SECURITY extension controls. + + -y Send log information using the syslog(3) system module. By + default this information is sent to stderr. + + ssh may additionally obtain configuration data from a per-user + configuration file and a system-wide configuration file. The file format + and configuration options are described in ssh_config(5). + +AUTHENTICATION + The OpenSSH SSH client supports SSH protocol 2. + + The methods available for authentication are: GSSAPI-based + authentication, host-based authentication, public key authentication, + keyboard-interactive authentication, and password authentication. + Authentication methods are tried in the order specified above, though + PreferredAuthentications can be used to change the default order. + + Host-based authentication works as follows: If the machine the user logs + in from is listed in /etc/hosts.equiv or /etc/shosts.equiv on the remote + machine, the user is non-root and the user names are the same on both + sides, or if the files ~/.rhosts or ~/.shosts exist in the user's home + directory on the remote machine and contain a line containing the name of + the client machine and the name of the user on that machine, the user is + considered for login. Additionally, the server must be able to verify + the client's host key (see the description of /etc/ssh/ssh_known_hosts + and ~/.ssh/known_hosts, below) for login to be permitted. This + authentication method closes security holes due to IP spoofing, DNS + spoofing, and routing spoofing. [Note to the administrator: + /etc/hosts.equiv, ~/.rhosts, and the rlogin/rsh protocol in general, are + inherently insecure and should be disabled if security is desired.] + + Public key authentication works as follows: The scheme is based on + public-key cryptography, using cryptosystems where encryption and + decryption are done using separate keys, and it is unfeasible to derive + the decryption key from the encryption key. The idea is that each user + creates a public/private key pair for authentication purposes. The + server knows the public key, and only the user knows the private key. + ssh implements public key authentication protocol automatically, using + one of the ECDSA, Ed25519 or RSA algorithms. + + The file ~/.ssh/authorized_keys lists the public keys that are permitted + for logging in. When the user logs in, the ssh program tells the server + which key pair it would like to use for authentication. The client + proves that it has access to the private key and the server checks that + the corresponding public key is authorized to accept the account. + + The server may inform the client of errors that prevented public key + authentication from succeeding after authentication completes using a + different method. These may be viewed by increasing the LogLevel to + DEBUG or higher (e.g. by using the -v flag). + + The user creates their key pair by running ssh-keygen(1). This stores + the private key in ~/.ssh/id_ecdsa (ECDSA), ~/.ssh/id_ecdsa_sk + (authenticator-hosted ECDSA), ~/.ssh/id_ed25519 (Ed25519), + ~/.ssh/id_ed25519_sk (authenticator-hosted Ed25519), or ~/.ssh/id_rsa + (RSA) and stores the public key in ~/.ssh/id_ecdsa.pub (ECDSA), + ~/.ssh/id_ecdsa_sk.pub (authenticator-hosted ECDSA), + ~/.ssh/id_ed25519.pub (Ed25519), ~/.ssh/id_ed25519_sk.pub (authenticator- + hosted Ed25519), or ~/.ssh/id_rsa.pub (RSA) in the user's home directory. + The user should then copy the public key to ~/.ssh/authorized_keys in + their home directory on the remote machine. The authorized_keys file + corresponds to the conventional ~/.rhosts file, and has one key per line, + though the lines can be very long. After this, the user can log in + without giving the password. + + A variation on public key authentication is available in the form of + certificate authentication: instead of a set of public/private keys, + signed certificates are used. This has the advantage that a single + trusted certification authority can be used in place of many + public/private keys. See the CERTIFICATES section of ssh-keygen(1) for + more information. + + The most convenient way to use public key or certificate authentication + may be with an authentication agent. See ssh-agent(1) and (optionally) + the AddKeysToAgent directive in ssh_config(5) for more information. + + Keyboard-interactive authentication works as follows: The server sends an + arbitrary "challenge" text and prompts for a response, possibly multiple + times. Examples of keyboard-interactive authentication include BSD + Authentication (see login.conf(5)) and PAM (some non-OpenBSD systems). + + Finally, if other authentication methods fail, ssh prompts the user for a + password. The password is sent to the remote host for checking; however, + since all communications are encrypted, the password cannot be seen by + someone listening on the network. + + ssh automatically maintains and checks a database containing + identification for all hosts it has ever been used with. Host keys are + stored in ~/.ssh/known_hosts in the user's home directory. Additionally, + the file /etc/ssh/ssh_known_hosts is automatically checked for known + hosts. Any new hosts are automatically added to the user's file. If a + host's identification ever changes, ssh warns about this and disables + password authentication to prevent server spoofing or man-in-the-middle + attacks, which could otherwise be used to circumvent the encryption. The + StrictHostKeyChecking option can be used to control logins to machines + whose host key is not known or has changed. + + When the user's identity has been accepted by the server, the server + either executes the given command in a non-interactive session or, if no + command has been specified, logs into the machine and gives the user a + normal shell as an interactive session. All communication with the + remote command or shell will be automatically encrypted. + + If an interactive session is requested, ssh by default will only request + a pseudo-terminal (pty) for interactive sessions when the client has one. + The flags -T and -t can be used to override this behaviour. + + If a pseudo-terminal has been allocated, the user may use the escape + characters noted below. + + If no pseudo-terminal has been allocated, the session is transparent and + can be used to reliably transfer binary data. On most systems, setting + the escape character to M-bM-^@M-^\noneM-bM-^@M-^] will also make the session transparent + even if a tty is used. + + The session terminates when the command or shell on the remote machine + exits and all X11 and TCP connections have been closed. + +ESCAPE CHARACTERS + When a pseudo-terminal has been requested, ssh supports a number of + functions through the use of an escape character. + + A single tilde character can be sent as ~~ or by following the tilde by a + character other than those described below. The escape character must + always follow a newline to be interpreted as special. The escape + character can be changed in configuration files using the EscapeChar + configuration directive or on the command line by the -e option. + + The supported escapes (assuming the default M-bM-^@M-^X~M-bM-^@M-^Y) are: + + ~. Disconnect. + + ~^Z Background ssh. + + ~# List forwarded connections. + + ~& Background ssh at logout when waiting for forwarded connection / + X11 sessions to terminate. + + ~? Display a list of escape characters. + + ~B Send a BREAK to the remote system (only useful if the peer + supports it). + + ~C Open command line. Currently this allows the addition of port + forwardings using the -L, -R and -D options (see above). It also + allows the cancellation of existing port-forwardings with + -KL[bind_address:]port for local, -KR[bind_address:]port for + remote and -KD[bind_address:]port for dynamic port-forwardings. + !command allows the user to execute a local command if the + PermitLocalCommand option is enabled in ssh_config(5). Basic + help is available, using the -h option. + + ~I Show information about the current SSH connection. + + ~R Request rekeying of the connection (only useful if the peer + supports it). + + ~V Decrease the verbosity (LogLevel) when errors are being written + to stderr. + + ~v Increase the verbosity (LogLevel) when errors are being written + to stderr. + +TCP FORWARDING + Forwarding of arbitrary TCP connections over a secure channel can be + specified either on the command line or in a configuration file. One + possible application of TCP forwarding is a secure connection to a mail + server; another is going through firewalls. + + In the example below, we look at encrypting communication for an IRC + client, even though the IRC server it connects to does not directly + support encrypted communication. This works as follows: the user + connects to the remote host using ssh, specifying the ports to be used to + forward the connection. After that it is possible to start the program + locally, and ssh will encrypt and forward the connection to the remote + server. + + The following example tunnels an IRC session from the client to an IRC + server at M-bM-^@M-^\server.example.comM-bM-^@M-^], joining channel M-bM-^@M-^\#usersM-bM-^@M-^], nickname + M-bM-^@M-^\pinkyM-bM-^@M-^], using the standard IRC port, 6667: + + $ ssh -f -L 6667:localhost:6667 server.example.com sleep 10 + $ irc -c '#users' pinky IRC/127.0.0.1 + + The -f option backgrounds ssh and the remote command M-bM-^@M-^\sleep 10M-bM-^@M-^] is + specified to allow an amount of time (10 seconds, in the example) to + start the program which is going to use the tunnel. If no connections + are made within the time specified, ssh will exit. + +X11 FORWARDING + If the ForwardX11 variable is set to M-bM-^@M-^\yesM-bM-^@M-^] (or see the description of the + -X, -x, and -Y options above) and the user is using X11 (the DISPLAY + environment variable is set), the connection to the X11 display is + automatically forwarded to the remote side in such a way that any X11 + programs started from the shell (or command) will go through the + encrypted channel, and the connection to the real X server will be made + from the local machine. The user should not manually set DISPLAY. + Forwarding of X11 connections can be configured on the command line or in + configuration files. + + The DISPLAY value set by ssh will point to the server machine, but with a + display number greater than zero. This is normal, and happens because + ssh creates a M-bM-^@M-^\proxyM-bM-^@M-^] X server on the server machine for forwarding the + connections over the encrypted channel. + + ssh will also automatically set up Xauthority data on the server machine. + For this purpose, it will generate a random authorization cookie, store + it in Xauthority on the server, and verify that any forwarded connections + carry this cookie and replace it by the real cookie when the connection + is opened. The real authentication cookie is never sent to the server + machine (and no cookies are sent in the plain). + + If the ForwardAgent variable is set to M-bM-^@M-^\yesM-bM-^@M-^] (or see the description of + the -A and -a options above) and the user is using an authentication + agent, the connection to the agent is automatically forwarded to the + remote side. + +VERIFYING HOST KEYS + When connecting to a server for the first time, a fingerprint of the + server's public key is presented to the user (unless the option + StrictHostKeyChecking has been disabled). Fingerprints can be determined + using ssh-keygen(1): + + $ ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key + + If the fingerprint is already known, it can be matched and the key can be + accepted or rejected. If only legacy (MD5) fingerprints for the server + are available, the ssh-keygen(1) -E option may be used to downgrade the + fingerprint algorithm to match. + + Because of the difficulty of comparing host keys just by looking at + fingerprint strings, there is also support to compare host keys visually, + using random art. By setting the VisualHostKey option to M-bM-^@M-^\yesM-bM-^@M-^], a small + ASCII graphic gets displayed on every login to a server, no matter if the + session itself is interactive or not. By learning the pattern a known + server produces, a user can easily find out that the host key has changed + when a completely different pattern is displayed. Because these patterns + are not unambiguous however, a pattern that looks similar to the pattern + remembered only gives a good probability that the host key is the same, + not guaranteed proof. + + To get a listing of the fingerprints along with their random art for all + known hosts, the following command line can be used: + + $ ssh-keygen -lv -f ~/.ssh/known_hosts + + If the fingerprint is unknown, an alternative method of verification is + available: SSH fingerprints verified by DNS. An additional resource + record (RR), SSHFP, is added to a zonefile and the connecting client is + able to match the fingerprint with that of the key presented. + + In this example, we are connecting a client to a server, + M-bM-^@M-^\host.example.comM-bM-^@M-^]. The SSHFP resource records should first be added to + the zonefile for host.example.com: + + $ ssh-keygen -r host.example.com. + + The output lines will have to be added to the zonefile. To check that + the zone is answering fingerprint queries: + + $ dig -t SSHFP host.example.com + + Finally the client connects: + + $ ssh -o "VerifyHostKeyDNS ask" host.example.com + [...] + Matching host key fingerprint found in DNS. + Are you sure you want to continue connecting (yes/no)? + + See the VerifyHostKeyDNS option in ssh_config(5) for more information. + +SSH-BASED VIRTUAL PRIVATE NETWORKS + ssh contains support for Virtual Private Network (VPN) tunnelling using + the tun(4) network pseudo-device, allowing two networks to be joined + securely. The sshd_config(5) configuration option PermitTunnel controls + whether the server supports this, and at what level (layer 2 or 3 + traffic). + + The following example would connect client network 10.0.50.0/24 with + remote network 10.0.99.0/24 using a point-to-point connection from + 10.1.1.1 to 10.1.1.2, provided that the SSH server running on the gateway + to the remote network, at 192.168.1.15, allows it. + + On the client: + + # ssh -f -w 0:1 192.168.1.15 true + # ifconfig tun0 10.1.1.1 10.1.1.2 netmask 255.255.255.252 + # route add 10.0.99.0/24 10.1.1.2 + + On the server: + + # ifconfig tun1 10.1.1.2 10.1.1.1 netmask 255.255.255.252 + # route add 10.0.50.0/24 10.1.1.1 + + Client access may be more finely tuned via the /root/.ssh/authorized_keys + file (see below) and the PermitRootLogin server option. The following + entry would permit connections on tun(4) device 1 from user M-bM-^@M-^\janeM-bM-^@M-^] and on + tun device 2 from user M-bM-^@M-^\johnM-bM-^@M-^], if PermitRootLogin is set to + M-bM-^@M-^\forced-commands-onlyM-bM-^@M-^]: + + tunnel="1",command="sh /etc/netstart tun1" ssh-rsa ... jane + tunnel="2",command="sh /etc/netstart tun2" ssh-rsa ... john + + Since an SSH-based setup entails a fair amount of overhead, it may be + more suited to temporary setups, such as for wireless VPNs. More + permanent VPNs are better provided by tools such as ipsecctl(8) and + isakmpd(8). + +ENVIRONMENT + ssh will normally set the following environment variables: + + DISPLAY The DISPLAY variable indicates the location of the + X11 server. It is automatically set by ssh to + point to a value of the form M-bM-^@M-^\hostname:nM-bM-^@M-^], where + M-bM-^@M-^\hostnameM-bM-^@M-^] indicates the host where the shell runs, + and M-bM-^@M-^XnM-bM-^@M-^Y is an integer M-bM-^IM-% 1. ssh uses this special + value to forward X11 connections over the secure + channel. The user should normally not set DISPLAY + explicitly, as that will render the X11 connection + insecure (and will require the user to manually + copy any required authorization cookies). + + HOME Set to the path of the user's home directory. + + LOGNAME Synonym for USER; set for compatibility with + systems that use this variable. + + MAIL Set to the path of the user's mailbox. + + PATH Set to the default PATH, as specified when + compiling ssh. + + SSH_ASKPASS If ssh needs a passphrase, it will read the + passphrase from the current terminal if it was run + from a terminal. If ssh does not have a terminal + associated with it but DISPLAY and SSH_ASKPASS are + set, it will execute the program specified by + SSH_ASKPASS and open an X11 window to read the + passphrase. This is particularly useful when + calling ssh from a .xsession or related script. + (Note that on some machines it may be necessary to + redirect the input from /dev/null to make this + work.) + + SSH_ASKPASS_REQUIRE Allows further control over the use of an askpass + program. If this variable is set to M-bM-^@M-^\neverM-bM-^@M-^] then + ssh will never attempt to use one. If it is set to + M-bM-^@M-^\preferM-bM-^@M-^], then ssh will prefer to use the askpass + program instead of the TTY when requesting + passwords. Finally, if the variable is set to + M-bM-^@M-^\forceM-bM-^@M-^], then the askpass program will be used for + all passphrase input regardless of whether DISPLAY + is set. + + SSH_AUTH_SOCK Identifies the path of a Unix-domain socket used to + communicate with the agent. + + SSH_CONNECTION Identifies the client and server ends of the + connection. The variable contains four space- + separated values: client IP address, client port + number, server IP address, and server port number. + + SSH_ORIGINAL_COMMAND This variable contains the original command line if + a forced command is executed. It can be used to + extract the original arguments. + + SSH_TTY This is set to the name of the tty (path to the + device) associated with the current shell or + command. If the current session has no tty, this + variable is not set. + + SSH_TUNNEL Optionally set by sshd(8) to contain the interface + names assigned if tunnel forwarding was requested + by the client. + + SSH_USER_AUTH Optionally set by sshd(8), this variable may + contain a pathname to a file that lists the + authentication methods successfully used when the + session was established, including any public keys + that were used. + + TZ This variable is set to indicate the present time + zone if it was set when the daemon was started + (i.e. the daemon passes the value on to new + connections). + + USER Set to the name of the user logging in. + + Additionally, ssh reads ~/.ssh/environment, and adds lines of the format + M-bM-^@M-^\VARNAME=valueM-bM-^@M-^] to the environment if the file exists and users are + allowed to change their environment. For more information, see the + PermitUserEnvironment option in sshd_config(5). + +FILES + ~/.rhosts + This file is used for host-based authentication (see above). On + some machines this file may need to be world-readable if the + user's home directory is on an NFS partition, because sshd(8) + reads it as root. Additionally, this file must be owned by the + user, and must not have write permissions for anyone else. The + recommended permission for most machines is read/write for the + user, and not accessible by others. + + ~/.shosts + This file is used in exactly the same way as .rhosts, but allows + host-based authentication without permitting login with + rlogin/rsh. + + ~/.ssh/ + This directory is the default location for all user-specific + configuration and authentication information. There is no + general requirement to keep the entire contents of this directory + secret, but the recommended permissions are read/write/execute + for the user, and not accessible by others. + + ~/.ssh/authorized_keys + Lists the public keys (ECDSA, Ed25519, RSA) that can be used for + logging in as this user. The format of this file is described in + the sshd(8) manual page. This file is not highly sensitive, but + the recommended permissions are read/write for the user, and not + accessible by others. + + ~/.ssh/config + This is the per-user configuration file. The file format and + configuration options are described in ssh_config(5). Because of + the potential for abuse, this file must have strict permissions: + read/write for the user, and not writable by others. + + ~/.ssh/environment + Contains additional definitions for environment variables; see + ENVIRONMENT, above. + + ~/.ssh/id_ecdsa + ~/.ssh/id_ecdsa_sk + ~/.ssh/id_ed25519 + ~/.ssh/id_ed25519_sk + ~/.ssh/id_rsa + Contains the private key for authentication. These files contain + sensitive data and should be readable by the user but not + accessible by others (read/write/execute). ssh will simply + ignore a private key file if it is accessible by others. It is + possible to specify a passphrase when generating the key which + will be used to encrypt the sensitive part of this file using + AES-128. + + ~/.ssh/id_ecdsa.pub + ~/.ssh/id_ecdsa_sk.pub + ~/.ssh/id_ed25519.pub + ~/.ssh/id_ed25519_sk.pub + ~/.ssh/id_rsa.pub + Contains the public key for authentication. These files are not + sensitive and can (but need not) be readable by anyone. + + ~/.ssh/known_hosts + Contains a list of host keys for all hosts the user has logged + into that are not already in the systemwide list of known host + keys. See sshd(8) for further details of the format of this + file. + + ~/.ssh/rc + Commands in this file are executed by ssh when the user logs in, + just before the user's shell (or command) is started. See the + sshd(8) manual page for more information. + + /etc/hosts.equiv + This file is for host-based authentication (see above). It + should only be writable by root. + + /etc/shosts.equiv + This file is used in exactly the same way as hosts.equiv, but + allows host-based authentication without permitting login with + rlogin/rsh. + + /etc/ssh/ssh_config + Systemwide configuration file. The file format and configuration + options are described in ssh_config(5). + + /etc/ssh/ssh_host_ecdsa_key + /etc/ssh/ssh_host_ed25519_key + /etc/ssh/ssh_host_rsa_key + These files contain the private parts of the host keys and are + used for host-based authentication. + + /etc/ssh/ssh_known_hosts + Systemwide list of known host keys. This file should be prepared + by the system administrator to contain the public host keys of + all machines in the organization. It should be world-readable. + See sshd(8) for further details of the format of this file. + + /etc/ssh/sshrc + Commands in this file are executed by ssh when the user logs in, + just before the user's shell (or command) is started. See the + sshd(8) manual page for more information. + +EXIT STATUS + ssh exits with the exit status of the remote command or with 255 if an + error occurred. + +SEE ALSO + scp(1), sftp(1), ssh-add(1), ssh-agent(1), ssh-keygen(1), ssh-keyscan(1), + tun(4), ssh_config(5), ssh-keysign(8), sshd(8) + +STANDARDS + S. Lehtinen and C. Lonvick, The Secure Shell (SSH) Protocol Assigned + Numbers, RFC 4250, January 2006. + + T. Ylonen and C. Lonvick, The Secure Shell (SSH) Protocol Architecture, + RFC 4251, January 2006. + + T. Ylonen and C. Lonvick, The Secure Shell (SSH) Authentication Protocol, + RFC 4252, January 2006. + + T. Ylonen and C. Lonvick, The Secure Shell (SSH) Transport Layer + Protocol, RFC 4253, January 2006. + + T. Ylonen and C. Lonvick, The Secure Shell (SSH) Connection Protocol, RFC + 4254, January 2006. + + J. Schlyter and W. Griffin, Using DNS to Securely Publish Secure Shell + (SSH) Key Fingerprints, RFC 4255, January 2006. + + F. Cusack and M. Forssen, Generic Message Exchange Authentication for the + Secure Shell Protocol (SSH), RFC 4256, January 2006. + + J. Galbraith and P. Remaker, The Secure Shell (SSH) Session Channel Break + Extension, RFC 4335, January 2006. + + M. Bellare, T. Kohno, and C. Namprempre, The Secure Shell (SSH) Transport + Layer Encryption Modes, RFC 4344, January 2006. + + B. Harris, Improved Arcfour Modes for the Secure Shell (SSH) Transport + Layer Protocol, RFC 4345, January 2006. + + M. Friedl, N. Provos, and W. Simpson, Diffie-Hellman Group Exchange for + the Secure Shell (SSH) Transport Layer Protocol, RFC 4419, March 2006. + + J. Galbraith and R. Thayer, The Secure Shell (SSH) Public Key File + Format, RFC 4716, November 2006. + + D. Stebila and J. Green, Elliptic Curve Algorithm Integration in the + Secure Shell Transport Layer, RFC 5656, December 2009. + + A. Perrig and D. Song, Hash Visualization: a New Technique to improve + Real-World Security, 1999, International Workshop on Cryptographic + Techniques and E-Commerce (CrypTEC '99). + +AUTHORS + OpenSSH is a derivative of the original and free ssh 1.2.12 release by + Tatu Ylonen. Aaron Campbell, Bob Beck, Markus Friedl, Niels Provos, Theo + de Raadt and Dug Song removed many bugs, re-added newer features and + created OpenSSH. Markus Friedl contributed the support for SSH protocol + versions 1.5 and 2.0. + +OpenBSD 7.9 July 1, 2026 SSH(1) diff --git a/ssh_config.0 b/ssh_config.0 new file mode 100644 index 000000000000..ffa33d4eecd6 --- /dev/null +++ b/ssh_config.0 @@ -0,0 +1,1513 @@ +SSH_CONFIG(5) File Formats Manual SSH_CONFIG(5) + +NAME + ssh_config M-bM-^@M-^S OpenSSH client configuration file + +DESCRIPTION + ssh(1) obtains configuration data from the following sources in the + following order: + + 1. command-line options + 2. user's configuration file (~/.ssh/config) + 3. system-wide configuration file (/etc/ssh/ssh_config) + + Unless noted otherwise, for each configuration directive, the first + specified value will be used. + + The configuration files may contain sections separated by conditional + Host or Match directives. Configuration in these sections is only + applied if the conditional directive that started the section matches. + + Since the first obtained value for each directive is used, more host- + specific declarations should be given near the beginning of the file, and + general defaults at the end. + + The file contains directive/values pairs, one per line. Lines starting + with M-bM-^@M-^X#M-bM-^@M-^Y and empty lines are interpreted as comments. M-bM-^@M-^X#M-bM-^@M-^Y outside of a + quoted string may be used to add a comment to the end of a line. + Whitespace at the beginning or end of lines is ignored. Values may + optionally be enclosed in double quotes (") in order to represent + arguments containing spaces. + + Configuration directives are separated from their values by whitespace or + exactly one M-bM-^@M-^X=M-bM-^@M-^Y character (which may be surrounded by whitespace); the + latter format is useful to avoid the need to quote whitespace when + specifying configuration options using the ssh, scp, and sftp -o option. + + The possible keywords and their meanings are as follows (note that + keywords are case-insensitive and arguments are case-sensitive): + + Host Restricts the following declarations (up to the next Host or + Match keyword) to be only for those hosts that match one of the + patterns given after the keyword. If more than one pattern is + provided, they should be separated by whitespace. A single M-bM-^@M-^X*M-bM-^@M-^Y + as a pattern can be used to provide global defaults for all + hosts. The host is usually the hostname argument given on the + command line (see the CanonicalizeHostname keyword for + exceptions). + + A pattern entry may be negated by prefixing it with an + exclamation mark (M-bM-^@M-^X!M-bM-^@M-^Y). If a negated entry is matched, then the + Host entry is ignored, regardless of whether any other patterns + on the line match. Negated matches are therefore useful to + provide exceptions for wildcard matches. + + See PATTERNS for more information on patterns. + + Match Restricts the following declarations (up to the next Host or + Match keyword) to be used only when the conditions following the + Match keyword are satisfied. Match conditions are specified + using one or more criteria or the single token all which always + matches. The available criteria keywords are: canonical, final, + exec, localnetwork, host, originalhost, tagged, command, user, + localuser, and version. The all criteria must appear alone or + immediately after canonical or final. Other criteria may be + combined arbitrarily. All criteria but all, canonical, and final + require an argument. Criteria may be negated by prepending an + exclamation mark (M-bM-^@M-^X!M-bM-^@M-^Y). + + The canonical keyword matches only when the configuration file is + being re-parsed after hostname canonicalization (see the + CanonicalizeHostname option). This may be useful to specify + conditions that work with canonical host names only. + + The final keyword requests that the configuration be re-parsed + (regardless of whether CanonicalizeHostname is enabled), and + matches only during this final pass. If CanonicalizeHostname is + enabled, then canonical and final match during the same pass. + + The exec keyword executes the specified command under the user's + shell. If the command returns a zero exit status then the + condition is considered true. Commands containing whitespace + characters must be quoted. Arguments to exec accept the tokens + described in the TOKENS section. + + The localnetwork keyword matches the addresses of active local + network interfaces against the supplied list of networks in CIDR + format. This may be convenient for varying the effective + configuration on devices that roam between networks. Note that + network address is not a trustworthy criteria in many situations + (e.g. when the network is automatically configured using DHCP) + and so caution should be applied if using it to control security- + sensitive configuration. + + The other keywords' criteria must be single entries or comma- + separated lists and may use the wildcard and negation operators + described in the PATTERNS section. + + The criteria for the host keyword are matched against the target + hostname, after any substitution by the Hostname or + CanonicalizeHostname options. The originalhost keyword matches + against the hostname as it was specified on the command-line. + + The tagged keyword matches a tag name specified by a prior Tag + directive or on the ssh(1) command-line using the -P flag. The + command keyword matches the remote command that has been + requested, or the subsystem name that is being invoked (e.g. + "sftp" for an SFTP session). The empty string will match the + case where a command or tag has not been specified, i.e. M-bM-^@M-^XMatch + tag ""M-bM-^@M-^Y. The version keyword matches against the version string + of ssh(1), for example M-bM-^@M-^\OpenSSH_10.0M-bM-^@M-^]. + + The user keyword matches against the target username on the + remote host. The localuser keyword matches against the name of + the local user running ssh(1) (this keyword may be useful in + system-wide ssh_config files). + + Finally, the sessiontype keyword matches the requested session + type, which may be one of shell for interactive sessions, exec + for command execution sessions, subsystem for subsystem + invocations such as sftp(1), or none for transport-only sessions, + such as when ssh(1) is started with the -N flag. + + Include + Include the specified configuration file(s). Multiple pathnames + may be specified and each pathname may contain glob(7) wildcards, + tokens as described in the TOKENS section, environment variables + as described in the ENVIRONMENT VARIABLES section and, for user + configurations, shell-like M-bM-^@M-^X~M-bM-^@M-^Y references to user home + directories. Wildcards will be expanded and processed in lexical + order. Files without absolute paths are assumed to be in ~/.ssh + if included in a user configuration file or /etc/ssh if included + from the system configuration file. Include directive may appear + inside a Match or Host block to perform conditional inclusion. + + AddKeysToAgent + Specifies whether keys should be automatically added to a running + ssh-agent(1). If this option is set to yes and a key is loaded + from a file, the key and its passphrase are added to the agent + with the default lifetime, as if by ssh-add(1). If this option + is set to ask, ssh(1) will require confirmation using the + SSH_ASKPASS program before adding a key (see ssh-add(1) for + details). If this option is set to confirm, each use of the key + must be confirmed, as if the -c option was specified to + ssh-add(1). If this option is set to no, no keys are added to + the agent. Alternately, this option may be specified as a time + interval using the format described in the TIME FORMATS section + of sshd_config(5) to specify the key's lifetime in ssh-agent(1), + after which it will automatically be removed. The argument must + be no (the default), yes, confirm (optionally followed by a time + interval), ask or a time interval. + + AddressFamily + Specifies which address family to use when connecting. Valid + arguments are any (the default), inet (use IPv4 only), or inet6 + (use IPv6 only). + + BatchMode + If set to yes, user interaction such as password prompts and host + key confirmation requests will be disabled. This option is + useful in scripts and other batch jobs where no user is present + to interact with ssh(1). The argument must be yes or no (the + default). + + BindAddress + Use the specified address on the local machine as the source + address of the connection. Only useful on systems with more than + one address. + + BindInterface + Use the address of the specified interface on the local machine + as the source address of the connection. + + CanonicalDomains + When CanonicalizeHostname is enabled, this option specifies the + list of domain suffixes in which to search for the specified + destination host. + + CanonicalizeFallbackLocal + Specifies whether to fail with an error when hostname + canonicalization fails. The default, yes, will attempt to look + up the unqualified hostname using the system resolver's search + rules. A value of no will cause ssh(1) to fail instantly if + CanonicalizeHostname is enabled and the target hostname cannot be + found in any of the domains specified by CanonicalDomains. + + CanonicalizeHostname + Controls whether explicit hostname canonicalization is performed. + The default, no, is not to perform any name rewriting and let the + system resolver handle all hostname lookups. If set to yes then, + for connections that do not use a ProxyCommand or ProxyJump, + ssh(1) will attempt to canonicalize the hostname specified on the + command line using the CanonicalDomains suffixes and + CanonicalizePermittedCNAMEs rules. If CanonicalizeHostname is + set to always, then canonicalization is applied to proxied + connections too. + + If this option is enabled, then the configuration files are + processed again using the new target name to pick up any new + configuration in matching Host and Match stanzas. A value of + none disables the use of a ProxyJump host. + + CanonicalizeMaxDots + Specifies the maximum number of dot characters in a hostname + before canonicalization is disabled. The default, 1, allows a + single dot (i.e. hostname.subdomain). + + CanonicalizePermittedCNAMEs + Specifies rules to determine whether CNAMEs should be followed + when canonicalizing hostnames. The rules consist of one or more + arguments of source_domain_list:target_domain_list, where + source_domain_list is a pattern-list of domains that may follow + CNAMEs in canonicalization, and target_domain_list is a pattern- + list of domains that they may resolve to. + + For example, "*.a.example.com:*.b.example.com,*.c.example.com" + will allow hostnames matching "*.a.example.com" to be + canonicalized to names in the "*.b.example.com" or + "*.c.example.com" domains. + + A single argument of "none" causes no CNAMEs to be considered for + canonicalization. This is the default behaviour. + + CASignatureAlgorithms + Specifies which algorithms are allowed for signing of + certificates by certificate authorities (CAs). The default is: + + ssh-ed25519,ecdsa-sha2-nistp256, + ecdsa-sha2-nistp384,ecdsa-sha2-nistp521, + sk-ssh-ed25519@openssh.com, + sk-ecdsa-sha2-nistp256@openssh.com, + rsa-sha2-512,rsa-sha2-256 + + If the specified list begins with a M-bM-^@M-^X+M-bM-^@M-^Y character, then the + specified algorithms will be appended to the default set instead + of replacing them. If the specified list begins with a M-bM-^@M-^X-M-bM-^@M-^Y + character, then the specified algorithms (including wildcards) + will be removed from the default set instead of replacing them. + + ssh(1) will not accept host certificates signed using algorithms + other than those specified. + + CertificateFile + Specifies a file from which the user's certificate is read. A + corresponding private key must be provided separately in order to + use this certificate either from an IdentityFile directive or -i + flag to ssh(1), via ssh-agent(1), or via a PKCS11Provider or + SecurityKeyProvider. + + Arguments to CertificateFile may use the tilde syntax to refer to + a user's home directory, the tokens described in the TOKENS + section and environment variables as described in the ENVIRONMENT + VARIABLES section. + + It is possible to have multiple certificate files specified in + configuration files; these certificates will be tried in + sequence. Multiple CertificateFile directives will add to the + list of certificates used for authentication. + + ChannelTimeout + Specifies whether and how quickly ssh(1) should close inactive + channels. Timeouts are specified as one or more M-bM-^@M-^\type=intervalM-bM-^@M-^] + pairs separated by whitespace, where the M-bM-^@M-^\typeM-bM-^@M-^] must be the + special keyword M-bM-^@M-^\globalM-bM-^@M-^] or a channel type name from the list + below, optionally containing wildcard characters. + + The timeout value M-bM-^@M-^\intervalM-bM-^@M-^] is specified in seconds or may use + any of the units documented in the TIME FORMATS section. For + example, M-bM-^@M-^\session=5mM-bM-^@M-^] would cause interactive sessions to + terminate after five minutes of inactivity. Specifying a zero + value disables the inactivity timeout. + + The special timeout M-bM-^@M-^\globalM-bM-^@M-^] applies to all active channels, + taken together. Traffic on any active channel will reset the + timeout, but when the timeout expires then all open channels will + be closed. Note that this global timeout is not matched by + wildcards and must be specified explicitly. + + The available channel type names include: + + agent-connection + Open connections to ssh-agent(1). + + direct-tcpip, direct-streamlocal@openssh.com + Open TCP or Unix socket (respectively) connections that + have been established from an ssh(1) local forwarding, + i.e. LocalForward or DynamicForward. + + forwarded-tcpip, forwarded-streamlocal@openssh.com + Open TCP or Unix socket (respectively) connections that + have been established to an sshd(8) listening on behalf + of an ssh(1) remote forwarding, i.e. RemoteForward. + + session + The interactive main session, including shell session, + command execution, scp(1), sftp(1), etc. + + tun-connection + Open TunnelForward connections. + + x11-connection + Open X11 forwarding sessions. + + Note that in all the above cases, terminating an inactive session + does not guarantee to remove all resources associated with the + session, e.g. shell processes or X11 clients relating to the + session may continue to execute. + + Moreover, terminating an inactive channel or session does not + necessarily close the SSH connection, nor does it prevent a + client from requesting another channel of the same type. In + particular, expiring an inactive forwarding session does not + prevent another identical forwarding from being subsequently + created. + + The default is not to expire channels of any type for inactivity. + + CheckHostIP + If set to yes, ssh(1) will additionally check the host IP address + in the known_hosts file. This allows it to detect if a host key + changed due to DNS spoofing and will add addresses of destination + hosts to ~/.ssh/known_hosts in the process, regardless of the + setting of StrictHostKeyChecking. If the option is set to no + (the default), the check will not be executed. + + Ciphers + Specifies the ciphers allowed and their order of preference. + Multiple ciphers must be comma-separated. If the specified list + begins with a M-bM-^@M-^X+M-bM-^@M-^Y character, then the specified ciphers will be + appended to the default set instead of replacing them. If the + specified list begins with a M-bM-^@M-^X-M-bM-^@M-^Y character, then the specified + ciphers (including wildcards) will be removed from the default + set instead of replacing them. If the specified list begins with + a M-bM-^@M-^X^M-bM-^@M-^Y character, then the specified ciphers will be placed at the + head of the default set. + + The supported ciphers are: + + 3des-cbc + aes128-cbc + aes192-cbc + aes256-cbc + aes128-ctr + aes192-ctr + aes256-ctr + aes128-gcm@openssh.com + aes256-gcm@openssh.com + chacha20-poly1305@openssh.com + + The default is: + + chacha20-poly1305@openssh.com, + aes128-gcm@openssh.com,aes256-gcm@openssh.com, + aes128-ctr,aes192-ctr,aes256-ctr + + The list of available ciphers may also be obtained using "ssh -Q + cipher". + + ClearAllForwardings + Specifies that all local, remote, and dynamic port forwardings + specified in the configuration files or on the command line be + cleared. This option is primarily useful when used from the + ssh(1) command line to clear port forwardings set in + configuration files, and is automatically set by scp(1) and + sftp(1). The argument must be yes or no (the default). + + Compression + Specifies whether to use compression. The argument must be yes + or no (the default). + + Compression applies to all traffic that flows over the SSH + connection. If untrusted traffic (such as an open port-forward) + is permitted over the connection alongside trusted traffic, then + compression may leak information about session contents. For + this reason, it is not recommended to enable compression for + connections that share trusted and untrusted traffic. + + ConnectionAttempts + Specifies the number of tries (one per second) to make before + exiting. The argument must be an integer. This may be useful in + scripts if the connection sometimes fails. The default is 1. + + ConnectTimeout + Specifies the timeout (in seconds) used when connecting to the + SSH server, instead of using the default system TCP timeout. + This timeout is applied both to establishing the connection and + to performing the initial SSH protocol handshake and key + exchange. + + ControlMaster + Enables the sharing of multiple sessions over a single network + connection. When set to yes, ssh(1) will listen for connections + on a control socket specified using the ControlPath argument. + Additional sessions can connect to this socket using the same + ControlPath with ControlMaster set to no (the default). These + sessions will try to reuse the master instance's network + connection rather than initiating new ones, but will fall back to + connecting normally if the control socket does not exist, or is + not listening. + + Setting this to ask will cause ssh(1) to listen for control + connections, but require confirmation using ssh-askpass(1). If + the ControlPath cannot be opened, ssh(1) will continue without + connecting to a master instance. + + X11 and ssh-agent(1) forwarding is supported over these + multiplexed connections, however the display and agent forwarded + will be the one belonging to the master connection i.e. it is not + possible to forward multiple displays or agents. + + Two additional options allow for opportunistic multiplexing: try + to use a master connection but fall back to creating a new one if + one does not already exist. These options are: auto and autoask. + The latter requires confirmation like the ask option. + + ControlPath + Specify the path to the control socket used for connection + sharing as described in the ControlMaster section above or the + string none to disable connection sharing. Arguments to + ControlPath may use the tilde syntax to refer to a user's home + directory, the tokens described in the TOKENS section and + environment variables as described in the ENVIRONMENT VARIABLES + section. It is recommended that any ControlPath used for + opportunistic connection sharing include at least %h, %p, and %r + (or alternatively %C) and be placed in a directory that is not + writable by other users. This ensures that shared connections + are uniquely identified. + + ControlPersist + When used in conjunction with ControlMaster, specifies that the + master connection should remain open in the background (waiting + for future client connections) after the initial client + connection has been closed. If set to no (the default), then the + master connection will not be placed into the background, and + will close as soon as the initial client connection is closed. + If set to yes or 0, then the master connection will remain in the + background indefinitely (until killed or closed via a mechanism + such as the "ssh -O exit"). If set to a time in seconds, or a + time in any of the formats documented in sshd_config(5), then the + backgrounded master connection will automatically terminate after + it has remained idle (with no client connections) for the + specified time. + + DynamicForward + Specifies that a TCP port on the local machine be forwarded over + the secure channel, and the application protocol is then used to + determine where to connect to from the remote machine. + + The argument must be [bind_address:]port. IPv6 addresses can be + specified by enclosing addresses in square brackets. By default, + the local port is bound in accordance with the GatewayPorts + setting. However, an explicit bind_address may be used to bind + the connection to a specific address. The bind_address of + localhost indicates that the listening port be bound for local + use only, while an empty address or M-bM-^@M-^X*M-bM-^@M-^Y indicates that the port + should be available from all interfaces. + + Currently the SOCKS4 and SOCKS5 protocols are supported, and + ssh(1) will act as a SOCKS server. Multiple forwardings may be + specified, and additional forwardings can be given on the command + line. Only the superuser can forward privileged ports. + + EnableEscapeCommandline + Enables the command line option in the EscapeChar menu for + interactive sessions (default M-bM-^@M-^X~CM-bM-^@M-^Y). By default, the command + line is disabled. + + EnableSSHKeysign + Setting this option to yes in the global client configuration + file /etc/ssh/ssh_config enables the use of the helper program + ssh-keysign(8) during HostbasedAuthentication. The argument must + be yes or no (the default). This option should be placed in the + non-hostspecific section. See ssh-keysign(8) for more + information. + + EscapeChar + Sets the escape character (default: M-bM-^@M-^X~M-bM-^@M-^Y). The escape character + can also be set on the command line. The argument should be a + single character, M-bM-^@M-^X^M-bM-^@M-^Y followed by a letter, or none to disable + the escape character entirely (making the connection transparent + for binary data). + + ExitOnForwardFailure + Specifies whether ssh(1) should terminate the connection if it + cannot set up all requested dynamic, tunnel, local, and remote + port forwardings, (e.g. if either end is unable to bind and + listen on a specified port). Note that ExitOnForwardFailure does + not apply to connections made over port forwardings and will not, + for example, cause ssh(1) to exit if TCP connections to the + ultimate forwarding destination fail. The argument must be yes + or no (the default). + + FingerprintHash + Specifies the hash algorithm used when displaying key + fingerprints. Valid options are: md5 and sha256 (the default). + + ForkAfterAuthentication + Requests ssh to go to background just before command execution. + This is useful if ssh is going to ask for passwords or + passphrases, but the user wants it in the background. This + implies the StdinNull configuration option being set to M-bM-^@M-^\yesM-bM-^@M-^]. + The recommended way to start X11 programs at a remote site is + with something like ssh -f host xterm, which is the same as ssh + host xterm if the ForkAfterAuthentication configuration option is + set to M-bM-^@M-^\yesM-bM-^@M-^]. + + If the ExitOnForwardFailure configuration option is set to M-bM-^@M-^\yesM-bM-^@M-^], + then a client started with the ForkAfterAuthentication + configuration option being set to M-bM-^@M-^\yesM-bM-^@M-^] will wait for all remote + port forwards to be successfully established before placing + itself in the background. The argument to this keyword must be + yes (same as the -f option) or no (the default). + + ForwardAgent + Specifies whether the connection to the authentication agent (if + any) will be forwarded to the remote machine. The argument may + be yes, no (the default), an explicit path to an agent socket or + the name of an environment variable (beginning with M-bM-^@M-^X$M-bM-^@M-^Y) in which + to find the path. + + Agent forwarding should be enabled with caution. Users with the + ability to bypass file permissions on the remote host (for the + agent's Unix-domain socket) can access the local agent through + the forwarded connection. An attacker cannot obtain key material + from the agent, however they can perform operations on the keys + that enable them to authenticate using the identities loaded into + the agent. + + ForwardX11 + Specifies whether X11 connections will be automatically + redirected over the secure channel and DISPLAY set. The argument + must be yes or no (the default). + + X11 forwarding should be enabled with caution. Users with the + ability to bypass file permissions on the remote host (for the + user's X11 authorization database) can access the local X11 + display through the forwarded connection. An attacker may then + be able to perform activities such as keystroke monitoring if the + ForwardX11Trusted option is also enabled. + + ForwardX11Timeout + Specify a timeout for untrusted X11 forwarding using the format + described in the TIME FORMATS section of sshd_config(5). X11 + connections received by ssh(1) after this time will be refused. + Setting ForwardX11Timeout to zero will disable the timeout and + permit X11 forwarding for the life of the connection. The + default is to disable untrusted X11 forwarding after twenty + minutes has elapsed. + + ForwardX11Trusted + If this option is set to yes, remote X11 clients will have full + access to the original X11 display. + + If this option is set to no (the default), remote X11 clients + will be considered untrusted and prevented from stealing or + tampering with data belonging to trusted X11 clients. + Furthermore, the xauth(1) token used for the session will be set + to expire after 20 minutes. Remote clients will be refused + access after this time. + + See the X11 SECURITY extension specification for full details on + the restrictions imposed on untrusted clients. + + GatewayPorts + Specifies whether remote hosts are allowed to connect to local + forwarded ports. By default, ssh(1) binds local port forwardings + to the loopback address. This prevents other remote hosts from + connecting to forwarded ports. GatewayPorts can be used to + specify that ssh should bind local port forwardings to the + wildcard address, thus allowing remote hosts to connect to + forwarded ports. The argument must be yes or no (the default). + + GlobalKnownHostsFile + Specifies one or more files to use for the global host key + database, separated by whitespace. The default is + /etc/ssh/ssh_known_hosts, /etc/ssh/ssh_known_hosts2. + + GSSAPIAuthentication + Specifies whether user authentication based on GSSAPI is allowed. + The default is no. + + GSSAPIDelegateCredentials + Forward (delegate) credentials to the server. The default is no. + + HashKnownHosts + Indicates that ssh(1) should hash host names and addresses when + they are added to ~/.ssh/known_hosts. These hashed names may be + used normally by ssh(1) and sshd(8), but they do not visually + reveal identifying information if the file's contents are + disclosed. The default is no. Note that existing names and + addresses in known hosts files will not be converted + automatically, but may be manually hashed using ssh-keygen(1). + + HostbasedAcceptedAlgorithms + Specifies the signature algorithms that will be used for + hostbased authentication as a comma-separated list of patterns. + Alternately if the specified list begins with a M-bM-^@M-^X+M-bM-^@M-^Y character, + then the specified signature algorithms will be appended to the + default set instead of replacing them. If the specified list + begins with a M-bM-^@M-^X-M-bM-^@M-^Y character, then the specified signature + algorithms (including wildcards) will be removed from the default + set instead of replacing them. If the specified list begins with + a M-bM-^@M-^X^M-bM-^@M-^Y character, then the specified signature algorithms will be + placed at the head of the default set. The default for this + option is: + + ssh-ed25519-cert-v01@openssh.com, + ecdsa-sha2-nistp256-cert-v01@openssh.com, + ecdsa-sha2-nistp384-cert-v01@openssh.com, + ecdsa-sha2-nistp521-cert-v01@openssh.com, + sk-ssh-ed25519-cert-v01@openssh.com, + sk-ecdsa-sha2-nistp256-cert-v01@openssh.com, + webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com, + rsa-sha2-512-cert-v01@openssh.com, + rsa-sha2-256-cert-v01@openssh.com, + ssh-ed25519, + ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521, + sk-ssh-ed25519@openssh.com, + sk-ecdsa-sha2-nistp256@openssh.com, + webauthn-sk-ecdsa-sha2-nistp256@openssh.com, + rsa-sha2-512,rsa-sha2-256 + + The -Q option of ssh(1) may be used to list supported signature + algorithms. This was formerly named HostbasedKeyTypes. + + HostbasedAuthentication + Specifies whether to try rhosts based authentication with public + key authentication. The argument must be yes or no (the + default). + + HostKeyAlgorithms + Specifies the host key signature algorithms that the client wants + to use in order of preference. Alternately if the specified list + begins with a M-bM-^@M-^X+M-bM-^@M-^Y character, then the specified signature + algorithms will be appended to the default set instead of + replacing them. If the specified list begins with a M-bM-^@M-^X-M-bM-^@M-^Y + character, then the specified signature algorithms (including + wildcards) will be removed from the default set instead of + replacing them. If the specified list begins with a M-bM-^@M-^X^M-bM-^@M-^Y + character, then the specified signature algorithms will be placed + at the head of the default set. The default for this option is: + + ssh-ed25519-cert-v01@openssh.com, + ecdsa-sha2-nistp256-cert-v01@openssh.com, + ecdsa-sha2-nistp384-cert-v01@openssh.com, + ecdsa-sha2-nistp521-cert-v01@openssh.com, + sk-ssh-ed25519-cert-v01@openssh.com, + sk-ecdsa-sha2-nistp256-cert-v01@openssh.com, + webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com, + rsa-sha2-512-cert-v01@openssh.com, + rsa-sha2-256-cert-v01@openssh.com, + ssh-ed25519, + ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521, + sk-ecdsa-sha2-nistp256@openssh.com, + webauthn-sk-ecdsa-sha2-nistp256@openssh.com + sk-ssh-ed25519@openssh.com, + rsa-sha2-512,rsa-sha2-256 + + If hostkeys are known for the destination host then this default + is modified to prefer their algorithms. + + The list of available signature algorithms may also be obtained + using "ssh -Q HostKeyAlgorithms". + + HostKeyAlias + Specifies an alias that should be used instead of the real host + name when looking up or saving the host key in the host key + database files and when validating host certificates. This + option is useful for tunneling SSH connections or for multiple + servers running on a single host. + + Hostname + Specifies the real host name to log into. This can be used to + specify nicknames or abbreviations for hosts. Arguments to + Hostname accept the tokens described in the TOKENS section. + Numeric IP addresses are also permitted (both on the command line + and in Hostname specifications). The default is the name given + on the command line. + + IdentitiesOnly + Specifies that ssh(1) should only use the configured + authentication identity and certificate files (either the default + files, or those explicitly configured in the ssh_config files or + passed on the ssh(1) command-line), even if ssh-agent(1) or a + PKCS11Provider or SecurityKeyProvider offers more identities. + The argument to this keyword must be yes or no (the default). + This option is intended for situations where ssh-agent offers + many different identities. + + IdentityAgent + Specifies the Unix-domain socket used to communicate with the + authentication agent. + + This option overrides the SSH_AUTH_SOCK environment variable and + can be used to select a specific agent. Setting the socket name + to none disables the use of an authentication agent. If the + string "SSH_AUTH_SOCK" is specified, the location of the socket + will be read from the SSH_AUTH_SOCK environment variable. + Otherwise if the specified value begins with a M-bM-^@M-^X$M-bM-^@M-^Y character, + then it will be treated as an environment variable containing the + location of the socket. + + Arguments to IdentityAgent may use the tilde syntax to refer to a + user's home directory, the tokens described in the TOKENS section + and environment variables as described in the ENVIRONMENT + VARIABLES section. + + IdentityFile + Specifies a file from which the user's ECDSA, authenticator- + hosted ECDSA, Ed25519, authenticator-hosted Ed25519 or RSA + authentication identity is read. You can also specify a public + key file to use the corresponding private key that is loaded in + ssh-agent(1) when the private key file is not present locally. + The default is ~/.ssh/id_rsa, ~/.ssh/id_ecdsa, + ~/.ssh/id_ecdsa_sk, ~/.ssh/id_ed25519 and ~/.ssh/id_ed25519_sk. + Additionally, any identities represented by the authentication + agent will be used for authentication unless IdentitiesOnly is + set. If no certificates have been explicitly specified by + CertificateFile, ssh(1) will try to load certificate information + from the filename obtained by appending -cert.pub to the path of + a specified IdentityFile. + + Arguments to IdentityFile may use the tilde syntax to refer to a + user's home directory or the tokens described in the TOKENS + section. Alternately an argument of none may be used to indicate + no identity files should be loaded. + + It is possible to have multiple identity files specified in + configuration files; all these identities will be tried in + sequence. Multiple IdentityFile directives will add to the list + of identities tried (this behaviour differs from that of other + configuration directives). + + IdentityFile may be used in conjunction with IdentitiesOnly to + select which identities in an agent are offered during + authentication. IdentityFile may also be used in conjunction + with CertificateFile in order to provide any certificate also + needed for authentication with the identity. + + IgnoreUnknown + Specifies a pattern-list of unknown options to be ignored if they + are encountered in configuration parsing. This may be used to + suppress errors if ssh_config contains options that are + unrecognised by ssh(1). It is recommended that IgnoreUnknown be + listed early in the configuration file as it will not be applied + to unknown options that appear before it. + + IPQoS Specifies the Differentiated Services Field Codepoint (DSCP) + value for connections. Accepted values are af11, af12, af13, + af21, af22, af23, af31, af32, af33, af41, af42, af43, cs0, cs1, + cs2, cs3, cs4, cs5, cs6, cs7, ef, le, a numeric value, or none to + use the operating system default. This option may take one or + two arguments, separated by whitespace. If one argument is + specified, it is used as the packet class unconditionally. If + two values are specified, the first is automatically selected for + interactive sessions and the second for non-interactive sessions. + The default is ef (Expedited Forwarding) for interactive sessions + and none (the operating system default) for non-interactive + sessions. + + KbdInteractiveAuthentication + Specifies whether to use keyboard-interactive authentication. + The argument to this keyword must be yes (the default) or no. + ChallengeResponseAuthentication is a deprecated alias for this. + + KbdInteractiveDevices + Specifies the list of methods to use in keyboard-interactive + authentication. Multiple method names must be comma-separated. + The default is to use the server specified list. The methods + available vary depending on what the server supports. For an + OpenSSH server, it may be zero or more of: bsdauth and pam. + + KexAlgorithms + Specifies the permitted KEX (Key Exchange) algorithms that will + be used and their preference order. The selected algorithm will + be the first algorithm in this list that the server also + supports. Multiple algorithms must be comma-separated. + + If the specified list begins with a M-bM-^@M-^X+M-bM-^@M-^Y character, then the + specified algorithms will be appended to the default set instead + of replacing them. If the specified list begins with a M-bM-^@M-^X-M-bM-^@M-^Y + character, then the specified algorithms (including wildcards) + will be removed from the default set instead of replacing them. + If the specified list begins with a M-bM-^@M-^X^M-bM-^@M-^Y character, then the + specified algorithms will be placed at the head of the default + set. + + The default is: + + mlkem768x25519-sha256, + sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com, + curve25519-sha256,curve25519-sha256@libssh.org, + ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521, + diffie-hellman-group-exchange-sha256, + diffie-hellman-group16-sha512, + diffie-hellman-group18-sha512, + diffie-hellman-group14-sha256 + + The list of supported key exchange algorithms may also be + obtained using "ssh -Q kex". + + KnownHostsCommand + Specifies a command to use to obtain a list of host keys, in + addition to those listed in UserKnownHostsFile and + GlobalKnownHostsFile. This command is executed after the files + have been read. It may write host key lines to standard output + in identical format to the usual files (described in the + VERIFYING HOST KEYS section in ssh(1)). Arguments to + KnownHostsCommand accept the tokens described in the TOKENS + section. The command may be invoked multiple times per + connection: once when preparing the preference list of host key + algorithms to use, again to obtain the host key for the requested + host name and, if CheckHostIP is enabled, one more time to obtain + the host key matching the server's address. If the command exits + abnormally or returns a non-zero exit status then the connection + is terminated. + + LocalCommand + Specifies a command to execute on the local machine after + successfully connecting to the server. The command string + extends to the end of the line, and is executed with the user's + shell. Arguments to LocalCommand accept the tokens described in + the TOKENS section. + + The command is run synchronously and does not have access to the + session of the ssh(1) that spawned it. It should not be used for + interactive commands. + + This directive is ignored unless PermitLocalCommand has been + enabled. + + LocalForward + Specifies that a TCP port or Unix-domain socket on the local + machine be forwarded over the secure channel to the specified + host and port (or Unix-domain socket) from the remote machine. + For a TCP port, the first argument must be [bind_address:]port or + a Unix domain socket path. The second argument is the + destination and may be host:hostport or a Unix domain socket path + if the remote host supports it. + + IPv6 addresses can be specified by enclosing addresses in square + brackets. + + If either argument contains a '/' in it, that argument will be + interpreted as a Unix-domain socket (on the corresponding host) + rather than a TCP port. + + Multiple forwardings may be specified, and additional forwardings + can be given on the command line. Only the superuser can forward + privileged ports. By default, the local port is bound in + accordance with the GatewayPorts setting. However, an explicit + bind_address may be used to bind the connection to a specific + address. The bind_address of localhost indicates that the + listening port be bound for local use only, while an empty + address or M-bM-^@M-^X*M-bM-^@M-^Y indicates that the port should be available from + all interfaces. Unix domain socket paths may use the tokens + described in the TOKENS section and environment variables as + described in the ENVIRONMENT VARIABLES section. + + LogLevel + Gives the verbosity level that is used when logging messages from + ssh(1). The possible values are: QUIET, FATAL, ERROR, INFO, + VERBOSE, DEBUG, DEBUG1, DEBUG2, and DEBUG3. The default is INFO. + DEBUG and DEBUG1 are equivalent. DEBUG2 and DEBUG3 each specify + higher levels of verbose output. + + LogVerbose + Specify one or more overrides to LogLevel. An override consists + of one or more pattern lists that matches the source file, + function and line number to force detailed logging for. For + example, an override pattern of: + + kex.c:*:1000,*:kex_exchange_identification():*,packet.c:* + + would enable detailed logging for line 1000 of kex.c, everything + in the kex_exchange_identification() function, and all code in + the packet.c file. This option is intended for debugging and no + overrides are enabled by default. + + MACs Specifies the MAC (message authentication code) algorithms in + order of preference. The MAC algorithm is used for data + integrity protection. Multiple algorithms must be comma- + separated. If the specified list begins with a M-bM-^@M-^X+M-bM-^@M-^Y character, + then the specified algorithms will be appended to the default set + instead of replacing them. If the specified list begins with a + M-bM-^@M-^X-M-bM-^@M-^Y character, then the specified algorithms (including + wildcards) will be removed from the default set instead of + replacing them. If the specified list begins with a M-bM-^@M-^X^M-bM-^@M-^Y + character, then the specified algorithms will be placed at the + head of the default set. + + The algorithms that contain "-etm" calculate the MAC after + encryption (encrypt-then-mac). These are considered safer and + their use recommended. + + The default is: + + umac-64-etm@openssh.com,umac-128-etm@openssh.com, + hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com, + hmac-sha1-etm@openssh.com, + umac-64@openssh.com,umac-128@openssh.com, + hmac-sha2-256,hmac-sha2-512,hmac-sha1 + + The list of available MAC algorithms may also be obtained using + "ssh -Q mac". + + NoHostAuthenticationForLocalhost + Disable host authentication for localhost (loopback addresses). + The argument to this keyword must be yes or no (the default). + + NumberOfPasswordPrompts + Specifies the number of password prompts before giving up. The + argument to this keyword must be an integer. The default is 3. + + ObscureKeystrokeTiming + Specifies whether ssh(1) should try to obscure inter-keystroke + timings from passive observers of network traffic. If enabled, + then for interactive sessions, ssh(1) will send keystrokes at + fixed intervals of a few tens of milliseconds and will send fake + keystroke packets for some time after typing ceases. The + argument to this keyword must be yes, no or an interval specifier + of the form interval:milliseconds (e.g. interval:80 for 80 + milliseconds). The default is to obscure keystrokes using a 20ms + packet interval. Note that smaller intervals will result in + higher fake keystroke packet rates. + + PasswordAuthentication + Specifies whether to use password authentication. The argument + to this keyword must be yes (the default) or no. + + PermitLocalCommand + Allow local command execution via the LocalCommand option or + using the !command escape sequence in ssh(1). The argument must + be yes or no (the default). + + PermitRemoteOpen + Specifies the destinations to which remote TCP port forwarding is + permitted when RemoteForward is used as a SOCKS proxy. The + forwarding specification must be one of the following forms: + + PermitRemoteOpen host:port + PermitRemoteOpen IPv4_addr:port + PermitRemoteOpen [IPv6_addr]:port + + Multiple forwards may be specified by separating them with + whitespace. An argument of any can be used to remove all + restrictions and permit any forwarding requests. An argument of + none can be used to prohibit all forwarding requests. The + wildcard M-bM-^@M-^X*M-bM-^@M-^Y can be used for host or port to allow all hosts or + ports respectively. Otherwise, no pattern matching or address + lookups are performed on supplied names. + + PKCS11Provider + Specifies which PKCS#11 provider to use or none to indicate that + no provider should be used (the default). The argument to this + keyword is a path to the PKCS#11 shared library ssh(1) should use + to communicate with a PKCS#11 token providing keys for user + authentication. + + Port Specifies the port number to connect on the remote host. The + default is 22. + + PreferredAuthentications + Specifies the order in which the client should try authentication + methods. This allows a client to prefer one method (e.g. + keyboard-interactive) over another method (e.g. password). The + default is: + + gssapi-with-mic,hostbased,publickey, + keyboard-interactive,password + + ProxyCommand + Specifies the command to use to connect to the server. The + command string extends to the end of the line, and is executed + using the user's shell M-bM-^@M-^XexecM-bM-^@M-^Y directive to avoid a lingering + shell process. + + Arguments to ProxyCommand accept the tokens described in the + TOKENS section. The command can be basically anything, and + should read from its standard input and write to its standard + output. It should eventually connect an sshd(8) server running + on some machine, or execute sshd -i somewhere. Host key + management will be done using the Hostname of the host being + connected (defaulting to the name typed by the user). Setting + the command to none disables this option entirely. Note that + CheckHostIP is not available for connects with a proxy command. + + This directive is useful in conjunction with nc(1) and its proxy + support. For example, the following directive would connect via + an HTTP proxy at 192.0.2.0: + + ProxyCommand /usr/bin/nc -X connect -x 192.0.2.0:8080 %h %p + + ProxyJump + Specifies one or more jump proxies as either [user@]host[:port] + or an ssh URI. Multiple proxies may be separated by comma + characters and will be visited sequentially. Setting this option + will cause ssh(1) to connect to the target host by first making + an ssh(1) connection to the specified ProxyJump host and then + establishing a TCP forwarding to the ultimate target from there. + Setting the host to none disables this option entirely. + + Note that this option will compete with the ProxyCommand option - + whichever is specified first will prevent later instances of the + other from taking effect. + + Note also that the configuration for the destination host (either + supplied via the command-line or the configuration file) is not + generally applied to jump hosts. ~/.ssh/config should be used if + specific configuration is required for jump hosts. + + ProxyUseFdpass + Specifies that ProxyCommand will pass a connected file descriptor + back to ssh(1) instead of continuing to execute and pass data. + The default is no. + + PubkeyAcceptedAlgorithms + Specifies the signature algorithms that will be used for public + key authentication as a comma-separated list of patterns. If the + specified list begins with a M-bM-^@M-^X+M-bM-^@M-^Y character, then the algorithms + after it will be appended to the default instead of replacing it. + If the specified list begins with a M-bM-^@M-^X-M-bM-^@M-^Y character, then the + specified algorithms (including wildcards) will be removed from + the default set instead of replacing them. If the specified list + begins with a M-bM-^@M-^X^M-bM-^@M-^Y character, then the specified algorithms will + be placed at the head of the default set. The default for this + option is: + + ssh-ed25519-cert-v01@openssh.com, + ecdsa-sha2-nistp256-cert-v01@openssh.com, + ecdsa-sha2-nistp384-cert-v01@openssh.com, + ecdsa-sha2-nistp521-cert-v01@openssh.com, + sk-ssh-ed25519-cert-v01@openssh.com, + sk-ecdsa-sha2-nistp256-cert-v01@openssh.com, + webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com, + rsa-sha2-512-cert-v01@openssh.com, + rsa-sha2-256-cert-v01@openssh.com, + ssh-ed25519, + ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521, + sk-ssh-ed25519@openssh.com, + sk-ecdsa-sha2-nistp256@openssh.com, + webauthn-sk-ecdsa-sha2-nistp256@openssh.com, + rsa-sha2-512,rsa-sha2-256 + + The list of available signature algorithms may also be obtained + using "ssh -Q PubkeyAcceptedAlgorithms". + + PubkeyAuthentication + Specifies whether to try public key authentication. The argument + to this keyword must be yes (the default), no, unbound or + host-bound. The final two options enable public key + authentication while respectively disabling or enabling the + OpenSSH host-bound authentication protocol extension required for + restricted ssh-agent(1) forwarding. + + RefuseConnection + Allows a connection to be refused by the configuration file. If + this option is specified, then ssh(1) will terminate immediately + before attempting to connect to the remote host, display an error + message that contains the argument to this keyword and return a + non-zero exit status. This option may be useful to express + reminders or warnings to the user via ssh_config. + + RekeyLimit + Specifies the maximum amount of data that may be transmitted or + received before the session key is renegotiated, optionally + followed by a maximum amount of time that may pass before the + session key is renegotiated. The first argument is specified in + bytes and may have a suffix of M-bM-^@M-^XKM-bM-^@M-^Y, M-bM-^@M-^XMM-bM-^@M-^Y, or M-bM-^@M-^XGM-bM-^@M-^Y to indicate + Kilobytes, Megabytes, or Gigabytes, respectively. The default is + between M-bM-^@M-^X1GM-bM-^@M-^Y and M-bM-^@M-^X4GM-bM-^@M-^Y, depending on the cipher. The optional + second value is specified in seconds and may use any of the units + documented in the TIME FORMATS section of sshd_config(5). The + default value for RekeyLimit is default none, which means that + rekeying is performed after the cipher's default amount of data + has been sent or received and no time based rekeying is done. + + RemoteCommand + Specifies a command to execute on the remote machine after + successfully connecting to the server. The command string + extends to the end of the line, and is executed with the user's + shell. Arguments to RemoteCommand accept the tokens described in + the TOKENS section. + + RemoteForward + Specifies that a TCP port or Unix-domain socket on the remote + machine be forwarded over the secure channel. The remote port + may either be forwarded to a specified host and port or Unix- + domain socket from the local machine, or may act as a SOCKS 4/5 + proxy that allows a remote client to connect to arbitrary + destinations from the local machine. The first argument is the + listening specification and may be [bind_address:]port or, if the + remote host supports it, a Unix domain socket path. If + forwarding to a specific destination then the second argument + must be host:hostport or a Unix domain socket path, otherwise if + no destination argument is specified then the remote forwarding + will be established as a SOCKS proxy. When acting as a SOCKS + proxy, the destination of the connection can be restricted by + PermitRemoteOpen. + + IPv6 addresses can be specified by enclosing addresses in square + brackets. + + If either argument contains a '/' in it, that argument will be + interpreted as a Unix-domain socket (on the corresponding host) + rather than a TCP port. + + Multiple forwardings may be specified, and additional forwardings + can be given on the command line. Privileged ports can be + forwarded only when logging in as root on the remote machine. + Unix domain socket paths may use the tokens described in the + TOKENS section and environment variables as described in the + ENVIRONMENT VARIABLES section. + + If the port argument is 0, the listen port will be dynamically + allocated on the server and reported to the client at run time. + + If the bind_address is not specified, the default is to only bind + to loopback addresses. If the bind_address is M-bM-^@M-^X*M-bM-^@M-^Y or an empty + string, then the forwarding is requested to listen on all + interfaces. Specifying a remote bind_address will only succeed + if the server's GatewayPorts option is enabled (see + sshd_config(5)). + + RequestTTY + Specifies whether to request a pseudo-tty for the session. The + argument may be one of: no (never request a TTY), yes (always + request a TTY when standard input is a TTY), force (always + request a TTY) or auto (request a TTY when opening a login + session). This option mirrors the -t and -T flags for ssh(1). + + RequiredRSASize + Specifies the minimum RSA key size (in bits) that ssh(1) will + accept. User authentication keys smaller than this limit will be + ignored. Servers that present host keys smaller than this limit + will cause the connection to be terminated. The default is 1024 + bits. Note that this limit may only be raised from the default. + + RevokedHostKeys + Specifies revoked host public keys. Keys listed in this file + will be refused for host authentication. Note that if this file + does not exist or is not readable, then host authentication will + be refused for all hosts. Keys may be specified as a text file, + listing one public key per line, or as an OpenSSH Key Revocation + List (KRL) as generated by ssh-keygen(1). For more information + on KRLs, see the KEY REVOCATION LISTS section in ssh-keygen(1). + Arguments to RevokedHostKeys may use the tilde syntax to refer to + a user's home directory, the tokens described in the TOKENS + section and environment variables as described in the ENVIRONMENT + VARIABLES section. + + SecurityKeyProvider + Specifies a path to a library that will be used when loading any + FIDO authenticator-hosted keys, overriding the default of using + the built-in USB HID support. + + If the specified value begins with a M-bM-^@M-^X$M-bM-^@M-^Y character, then it will + be treated as an environment variable containing the path to the + library. + + SendEnv + Specifies what variables from the local environ(7) should be sent + to the server. The server must also support it, and the server + must be configured to accept these environment variables. Note + that the TERM environment variable is always sent whenever a + pseudo-terminal is requested as it is required by the protocol. + Refer to AcceptEnv in sshd_config(5) for how to configure the + server. Variables are specified by name, which may contain + wildcard characters. Multiple environment variables may be + separated by whitespace or spread across multiple SendEnv + directives. + + See PATTERNS for more information on patterns. + + It is possible to clear previously set SendEnv variable names by + prefixing patterns with -. The default is not to send any + environment variables. + + ServerAliveCountMax + Sets the number of server alive messages (see below) which may be + sent without ssh(1) receiving any messages back from the server. + If this threshold is reached while server alive messages are + being sent, ssh will disconnect from the server, terminating the + session. It is important to note that the use of server alive + messages is very different from TCPKeepAlive (below). The server + alive messages are sent through the encrypted channel and + therefore will not be spoofable. The TCP keepalive option + enabled by TCPKeepAlive is spoofable. The server alive mechanism + is valuable when the client or server depend on knowing when a + connection has become unresponsive. + + The default value is 3. If, for example, ServerAliveInterval + (see below) is set to 15 and ServerAliveCountMax is left at the + default, if the server becomes unresponsive, ssh will disconnect + after approximately 45 seconds. + + ServerAliveInterval + Sets a timeout interval in seconds after which if no data has + been received from the server, ssh(1) will send a message through + the encrypted channel to request a response from the server. The + default is 0, indicating that these messages will not be sent to + the server. + + SessionType + May be used to either request invocation of a subsystem on the + remote system, or to prevent the execution of a remote command at + all. The latter is useful for just forwarding ports. The + argument to this keyword must be none (same as the -N option), + subsystem (same as the -s option) or default (shell or command + execution). + + SetEnv Directly specify one or more environment variables and their + contents to be sent to the server in the form M-bM-^@M-^\NAME=VALUEM-bM-^@M-^]. + Similarly to SendEnv, with the exception of the TERM variable, + the server must be prepared to accept the environment variable. + + The M-bM-^@M-^\VALUEM-bM-^@M-^] may use the tokens described in the TOKENS section + and environment variables as described in the ENVIRONMENT + VARIABLES section. + + StdinNull + Redirects stdin from /dev/null (actually, prevents reading from + stdin). Either this or the equivalent -n option must be used + when ssh is run in the background. The argument to this keyword + must be yes (same as the -n option) or no (the default). + + StreamLocalBindMask + Sets the octal file creation mode mask (umask) used when creating + a Unix-domain socket file for local or remote port forwarding. + This option is only used for port forwarding to a Unix-domain + socket file. + + The default value is 0177, which creates a Unix-domain socket + file that is readable and writable only by the owner. Note that + not all operating systems honor the file mode on Unix-domain + socket files. + + StreamLocalBindUnlink + Specifies whether to remove an existing Unix-domain socket file + for local or remote port forwarding before creating a new one. + If the socket file already exists and StreamLocalBindUnlink is + not enabled, ssh will be unable to forward the port to the Unix- + domain socket file. This option is only used for port forwarding + to a Unix-domain socket file. + + The argument must be yes or no (the default). + + StrictHostKeyChecking + If this flag is set to yes, ssh(1) will never automatically add + host keys to the ~/.ssh/known_hosts file, and refuses to connect + to hosts whose host key has changed. This provides maximum + protection against man-in-the-middle (MITM) attacks, though it + can be annoying when the /etc/ssh/ssh_known_hosts file is poorly + maintained or when connections to new hosts are frequently made. + This option forces the user to manually add all new hosts. + + If this flag is set to accept-new then ssh will automatically add + new host keys to the user's known_hosts file, but will not permit + connections to hosts with changed host keys. If this flag is set + to no or off, ssh will automatically add new host keys to the + user known hosts files and allow connections to hosts with + changed hostkeys to proceed, subject to some restrictions. If + this flag is set to ask (the default), new host keys will be + added to the user known host files only after the user has + confirmed that is what they really want to do, and ssh will + refuse to connect to hosts whose host key has changed. The host + keys of known hosts will be verified automatically in all cases. + + SyslogFacility + Gives the facility code that is used when logging messages from + ssh(1). The possible values are: DAEMON, USER, AUTH, LOCAL0, + LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7. The + default is USER. + + TCPKeepAlive + Specifies whether the system should send TCP keepalive messages + to the other side. If they are sent, death of the connection or + crash of one of the machines will be properly noticed. However, + this means that connections will die if the route is down + temporarily, and some people find it annoying. + + The default is yes (to send TCP keepalive messages), and the + client will notice if the network goes down or the remote host + dies. This is important in scripts, and many users want it too. + + To disable TCP keepalive messages, the value should be set to no. + See also ServerAliveInterval for protocol-level keepalives. + + Tag Specify a configuration tag name that may be later used by a + Match directive to select a block of configuration. + + Tunnel Request tun(4) device forwarding between the client and the + server. The argument must be yes, point-to-point (layer 3), + ethernet (layer 2), or no (the default). Specifying yes requests + the default tunnel mode, which is point-to-point. + + TunnelDevice + Specifies the tun(4) devices to open on the client (local_tun) + and the server (remote_tun). + + The argument must be local_tun[:remote_tun]. The devices may be + specified by numerical ID or the keyword any, which uses the next + available tunnel device. If remote_tun is not specified, it + defaults to any. The default is any:any. + + UpdateHostKeys + Specifies whether ssh(1) should accept notifications of + additional hostkeys from the server sent after authentication has + completed and add them to UserKnownHostsFile. The argument must + be yes, no or ask. This option allows learning alternate + hostkeys for a server and supports graceful key rotation by + allowing a server to send replacement public keys before old ones + are removed. + + Additional hostkeys are only accepted if the key used to + authenticate the host was already trusted or explicitly accepted + by the user, the host was authenticated via UserKnownHostsFile + (i.e. not GlobalKnownHostsFile) and the host was authenticated + using a plain key and not a certificate. + + UpdateHostKeys is enabled by default if the user has not + overridden the default UserKnownHostsFile setting and has not + enabled VerifyHostKeyDNS, otherwise UpdateHostKeys will be set to + no. + + If UpdateHostKeys is set to ask, then the user is asked to + confirm the modifications to the known_hosts file. Confirmation + is currently incompatible with ControlPersist, and will be + disabled if it is enabled. + + Presently, only sshd(8) from OpenSSH 6.8 and greater support the + "hostkeys@openssh.com" protocol extension used to inform the + client of all the server's hostkeys. + + User Specifies the user to log in as. This can be useful when a + different user name is used on different machines. This saves + the trouble of having to remember to give the user name on the + command line. Arguments to User may use the tokens described in + the TOKENS section (with the exception of %r and %C) and + environment variables as described in the ENVIRONMENT VARIABLES + section. + + UserKnownHostsFile + Specifies one or more files to use for the user host key + database, separated by whitespace. Each filename may use tilde + notation to refer to the user's home directory, the tokens + described in the TOKENS section and environment variables as + described in the ENVIRONMENT VARIABLES section. A value of none + causes ssh(1) to ignore any user-specific known hosts files. The + default is ~/.ssh/known_hosts, ~/.ssh/known_hosts2. + + VerifyHostKeyDNS + Specifies whether to verify the remote key using DNS and SSHFP + resource records. If this option is set to yes, the client will + implicitly trust keys that match a secure fingerprint from DNS. + Insecure fingerprints will be handled as if this option was set + to ask. If this option is set to ask, information on fingerprint + match will be displayed, but the user will still need to confirm + new host keys according to the StrictHostKeyChecking option. The + default is no. + + See also VERIFYING HOST KEYS in ssh(1). + + VersionAddendum + Optionally specifies additional text to append to the SSH + protocol banner sent by the client upon connection. The default + is none. + + VisualHostKey + If this flag is set to yes, an ASCII art representation of the + remote host key fingerprint is printed in addition to the + fingerprint string at login and for unknown host keys. If this + flag is set to no (the default), no fingerprint strings are + printed at login and only the fingerprint string will be printed + for unknown host keys. + + WarnWeakCrypto + controls whether the user is warned when the cryptographic + algorithms negotiated for the connection are weak or otherwise + recommended against. Warnings may be disabled by turning off a + specific warning or by disabling all warnings. Warnings about + connections that don't use a post-quantum key exchange may be + disabled using the no-pq-kex flag. no will disable all warnings. + The default, equivalent to yes, is to enable all warnings. + + XAuthLocation + Specifies the full pathname of the xauth(1) program. The default + is /usr/X11R6/bin/xauth. + +PATTERNS + A pattern consists of zero or more non-whitespace characters, M-bM-^@M-^X*M-bM-^@M-^Y (a + wildcard that matches zero or more characters), or M-bM-^@M-^X?M-bM-^@M-^Y (a wildcard that + matches exactly one character). For example, to specify a set of + declarations for any host in the ".co.uk" set of domains, the following + pattern could be used: + + Host *.co.uk + + The following pattern would match any host in the 192.168.0.[0-9] network + range: + + Host 192.168.0.? + + A pattern-list is a comma-separated list of patterns. Patterns within + pattern-lists may be negated by preceding them with an exclamation mark + (M-bM-^@M-^X!M-bM-^@M-^Y). For example, to allow a key to be used from anywhere within an + organization except from the "dialup" pool, the following entry (in + authorized_keys) could be used: + + from="!*.dialup.example.com,*.example.com" + + Note that a negated match will never produce a positive result by itself. + For example, attempting to match "host3" against the following pattern- + list will fail: + + from="!host1,!host2" + + The solution here is to include a term that will yield a positive match, + such as a wildcard: + + from="!host1,!host2,*" + +TOKENS + Arguments to some keywords can make use of tokens, which are expanded at + runtime. Tokens are expanded without quoting or escaping of shell + characters. It is the user's responsibility to ensure they are safe in + the context of their use. + + The supported tokens in ssh_config are: + + %% A literal M-bM-^@M-^X%M-bM-^@M-^Y. + %C Hash of %l%h%p%r%j. + %d Local user's home directory. + %f The fingerprint of the server's host key. + %H The known_hosts hostname or address that is being searched + for. + %h The remote hostname. + %I A string describing the reason for a KnownHostsCommand + execution: either ADDRESS when looking up a host by address + (only when CheckHostIP is enabled), HOSTNAME when searching + by hostname, or ORDER when preparing the host key algorithm + preference list to use for the destination host. + %i The local user ID. + %j The contents of the ProxyJump option, or the empty string if + this option is unset. + %K The base64 encoded host key. + %k The host key alias if specified, otherwise the original + remote hostname given on the command line. + %L The local hostname. + %l The local hostname, including the domain name. + %n The original remote hostname, as given on the command line. + %p The remote port. + %r The remote username. + %T The local tun(4) or tap(4) network interface assigned if + tunnel forwarding was requested, or "NONE" otherwise. + %t The type of the server host key, e.g. ssh-ed25519. + %u The local username. + + CertificateFile, ControlPath, IdentityAgent, IdentityFile, Include, + KnownHostsCommand, LocalForward, Match exec, RemoteCommand, + RemoteForward, RevokedHostKeys, UserKnownHostsFile and VersionAddendum + accept the tokens %%, %C, %d, %h, %i, %j, %k, %L, %l, %n, %p, %r, and %u. + + KnownHostsCommand additionally accepts the tokens %f, %H, %I, %K and %t. + + Hostname accepts the tokens %% and %h. + + LocalCommand accepts all tokens. + + ProxyCommand and ProxyJump accept the tokens %%, %h, %n, %p, and %r. + + Note that some of these directives build commands for execution via the + shell. Because ssh(1) performs no filtering or escaping of characters + that have special meaning in shell commands (e.g. quotes), it is the + user's responsibility to ensure that the arguments passed to ssh(1) do + not contain such characters and that tokens are appropriately quoted when + used. + +ENVIRONMENT VARIABLES + Arguments to some keywords can be expanded at runtime from environment + variables on the client by enclosing them in ${}, for example + ${HOME}/.ssh would refer to the user's .ssh directory. If a specified + environment variable does not exist then an error will be returned and + the setting for that keyword will be ignored. + + The keywords CertificateFile, ControlPath, IdentityAgent, IdentityFile, + Include, KnownHostsCommand, and UserKnownHostsFile support environment + variables. The keywords LocalForward and RemoteForward support + environment variables only for Unix domain socket paths. + +FILES + ~/.ssh/config + This is the per-user configuration file. The format of this file + is described above. This file is used by the SSH client. + Because of the potential for abuse, this file must have strict + permissions: read/write for the user, and not writable by others. + + /etc/ssh/ssh_config + Systemwide configuration file. This file provides defaults for + those values that are not specified in the user's configuration + file, and for those users who do not have a configuration file. + This file must be world-readable. + +SEE ALSO + ssh(1) + +AUTHORS + OpenSSH is a derivative of the original and free ssh 1.2.12 release by + Tatu Ylonen. Aaron Campbell, Bob Beck, Markus Friedl, Niels Provos, Theo + de Raadt and Dug Song removed many bugs, re-added newer features and + created OpenSSH. Markus Friedl contributed the support for SSH protocol + versions 1.5 and 2.0. + +OpenBSD 7.9 July 1, 2026 SSH_CONFIG(5) diff --git a/sshd.0 b/sshd.0 new file mode 100644 index 000000000000..c6c78c963372 --- /dev/null +++ b/sshd.0 @@ -0,0 +1,687 @@ +SSHD(8) System Manager's Manual SSHD(8) + +NAME + sshd M-bM-^@M-^S OpenSSH daemon + +SYNOPSIS + sshd [-46DdeGiqTtV] [-C connection_spec] [-c host_certificate_file] + [-E log_file] [-f config_file] [-g login_grace_time] + [-h host_key_file] [-o option] [-p port] [-u len] + +DESCRIPTION + sshd (OpenSSH Daemon) is the daemon program for ssh(1). It provides + secure encrypted communications between two untrusted hosts over an + insecure network. + + sshd listens for connections from clients. It is normally started at + boot from /etc/rc. It forks a new daemon for each incoming connection. + The forked daemons handle key exchange, encryption, authentication, + command execution, and data exchange. + + sshd can be configured using command-line options or a configuration file + (by default sshd_config(5)); command-line options override values + specified in the configuration file. sshd rereads its configuration file + when it receives a hangup signal, SIGHUP, by executing itself with the + name and options it was started with, e.g. /usr/sbin/sshd. + + The options are as follows: + + -4 Forces sshd to use IPv4 addresses only. + + -6 Forces sshd to use IPv6 addresses only. + + -C connection_spec + Specify the connection parameters to use for the -T extended test + mode. If provided, any Match directives in the configuration + file that would apply are applied before the configuration is + written to standard output. The connection parameters are + supplied as keyword=value pairs and may be supplied in any order, + either with multiple -C options or as a comma-separated list. + The keywords are M-bM-^@M-^\addrM-bM-^@M-^], M-bM-^@M-^\userM-bM-^@M-^], M-bM-^@M-^\hostM-bM-^@M-^], M-bM-^@M-^\laddrM-bM-^@M-^], M-bM-^@M-^\lportM-bM-^@M-^], and + M-bM-^@M-^\rdomainM-bM-^@M-^] and correspond to source address, user, resolved source + host name, local address, local port number and routing domain + respectively. Additionally the M-bM-^@M-^\invalid-userM-bM-^@M-^] flag (which does + not take a value argument) may be specified to simulate a + connection from an unrecognised username. + + -c host_certificate_file + Specifies a path to a certificate file to identify sshd during + key exchange. The certificate file must match a host key file + specified using the -h option or the HostKey configuration + directive. + + -D When this option is specified, sshd will not detach and does not + become a daemon. This allows easy monitoring of sshd. + + -d Debug mode. The server sends verbose debug output to standard + error, and does not put itself in the background. The server + also will not fork(2) and will only process one connection. This + option is only intended for debugging for the server. Multiple + -d options increase the debugging level. Maximum is 3. + + -E log_file + Append debug logs to log_file instead of the system log. + + -e Write debug logs to standard error instead of the system log. + + -f config_file + Specifies the name of the configuration file. The default is + /etc/ssh/sshd_config. sshd refuses to start if there is no + configuration file. + + -G Parse and print configuration file. Check the validity of the + configuration file, output the effective configuration to stdout + and then exit. Optionally, Match rules may be applied by + specifying the connection parameters using one or more -C + options. + + -g login_grace_time + Gives the grace time for clients to authenticate themselves + (default 120 seconds). If the client fails to authenticate the + user within this many seconds, the server disconnects and exits. + A value of zero indicates no limit. + + -h host_key_file + Specifies a file from which a host key is read. This option must + be given if sshd is not run as root (as the normal host key files + are normally not readable by anyone but root). The default is + /etc/ssh/ssh_host_ecdsa_key, /etc/ssh/ssh_host_ed25519_key and + /etc/ssh/ssh_host_rsa_key. It is possible to have multiple host + key files for the different host key algorithms. + + -i Specifies that sshd is being run from inetd(8). + + -o option + Can be used to give options in the format used in the + configuration file. This is useful for specifying options for + which there is no separate command-line flag. For full details + of the options, and their values, see sshd_config(5). + + -p port + Specifies the port on which the server listens for connections + (default 22). Multiple port options are permitted. Ports + specified in the configuration file with the Port option are + ignored when a command-line port is specified. Ports specified + using the ListenAddress option override command-line ports. + + -q Quiet mode. Nothing is sent to the system log. Normally the + beginning, authentication, and termination of each connection is + logged. + + -T Extended test mode. Check the validity of the configuration + file, output the effective configuration to stdout and then exit. + Optionally, Match rules may be applied by specifying the + connection parameters using one or more -C options. This is + similar to the -G flag, but it includes the additional testing + performed by the -t flag. + + -t Test mode. Only check the validity of the configuration file and + sanity of the keys. This is useful for updating sshd reliably as + configuration options may change. + + -u len This option is used to specify the size of the field in the utmp + structure that holds the remote host name. If the resolved host + name is longer than len, the dotted decimal value will be used + instead. This allows hosts with very long host names that + overflow this field to still be uniquely identified. Specifying + -u0 indicates that only dotted decimal addresses should be put + into the utmp file. -u0 may also be used to prevent sshd from + making DNS requests unless the authentication mechanism or + configuration requires it. Authentication mechanisms that may + require DNS include HostbasedAuthentication and using a + from="pattern-list" option in a key file. Configuration options + that require DNS include using a USER@HOST pattern in AllowUsers + or DenyUsers. + + -V Display the version number and exit. + +AUTHENTICATION + The OpenSSH SSH daemon supports SSH protocol 2 only. Each host has a + host-specific key, used to identify the host. Whenever a client + connects, the daemon responds with its public host key. The client + compares the host key against its own database to verify that it has not + changed. Forward secrecy is provided through a Diffie-Hellman key + agreement. This key agreement results in a shared session key. The rest + of the session is encrypted using a symmetric cipher. The client selects + the encryption algorithm to use from those offered by the server. + Additionally, session integrity is provided through a cryptographic + message authentication code (MAC). + + Finally, the server and the client enter an authentication dialog. The + client tries to authenticate itself using host-based authentication, + public key authentication, challenge-response authentication, or password + authentication. + + Regardless of the authentication type, the account is checked to ensure + that it is accessible. An account is not accessible if it is locked, + listed in DenyUsers or its group is listed in DenyGroups . The + definition of a locked account is system dependent. Some platforms have + their own account database (eg AIX) and some modify the passwd field ( + M-bM-^@M-^X*LK*M-bM-^@M-^Y on Solaris and UnixWare, M-bM-^@M-^X*M-bM-^@M-^Y on HP-UX, containing M-bM-^@M-^XNologinM-bM-^@M-^Y on + Tru64, a leading M-bM-^@M-^X*LOCKED*M-bM-^@M-^Y on FreeBSD and a leading M-bM-^@M-^X!M-bM-^@M-^Y on most + Linuxes). If there is a requirement to disable password authentication + for the account while allowing still public-key, then the passwd field + should be set to something other than these values (eg M-bM-^@M-^XNPM-bM-^@M-^Y or M-bM-^@M-^X*NP*M-bM-^@M-^Y ). + + If the client successfully authenticates itself, a dialog for preparing + the session is entered. At this time the client may request things like + allocating a pseudo-tty, forwarding X11 connections, forwarding TCP + connections, or forwarding the authentication agent connection over the + secure channel. + + After this, the client either requests an interactive shell or execution + of a non-interactive command, which sshd will execute via the user's + shell using its -c option. The sides then enter session mode. In this + mode, either side may send data at any time, and such data is forwarded + to/from the shell or command on the server side, and the user terminal in + the client side. + + When the user program terminates and all forwarded X11 and other + connections have been closed, the server sends command exit status to the + client, and both sides exit. + +LOGIN PROCESS + When a user successfully logs in, sshd does the following: + + 1. If the login is on a tty, and no command has been specified, + prints last login time and /etc/motd (unless prevented in the + configuration file or by ~/.hushlogin; see the FILES section). + + 2. If the login is on a tty, records login time. + + 3. Checks /etc/nologin; if it exists, prints contents and quits + (unless root). + + 4. Changes to run with normal user privileges. + + 5. Sets up basic environment. + + 6. Reads the file ~/.ssh/environment, if it exists, and users are + allowed to change their environment. See the + PermitUserEnvironment option in sshd_config(5). + + 7. Changes to user's home directory. + + 8. If ~/.ssh/rc exists and the sshd_config(5) PermitUserRC option + is set, runs it; else if /etc/ssh/sshrc exists, runs it; + otherwise runs xauth(1). The M-bM-^@M-^\rcM-bM-^@M-^] files are given the X11 + authentication protocol and cookie in standard input. See + SSHRC, below. + + 9. Runs user's shell or command. All commands are run under the + user's login shell as specified in the system password + database. + +SSHRC + If the file ~/.ssh/rc exists, sh(1) runs it after reading the environment + files but before starting the user's shell or command. It must not + produce any output on stdout; stderr must be used instead. If X11 + forwarding is in use, it will receive the "proto cookie" pair in its + standard input (and DISPLAY in its environment). The script must call + xauth(1) because sshd will not run xauth automatically to add X11 + cookies. + + The primary purpose of this file is to run any initialization routines + which may be needed before the user's home directory becomes accessible; + AFS is a particular example of such an environment. + + This file will probably contain some initialization code followed by + something similar to: + + if read proto cookie && [ -n "$DISPLAY" ]; then + if [ `echo $DISPLAY | cut -c1-10` = 'localhost:' ]; then + # X11UseLocalhost=yes + echo add unix:`echo $DISPLAY | + cut -c11-` $proto $cookie + else + # X11UseLocalhost=no + echo add $DISPLAY $proto $cookie + fi | xauth -q - + fi + + If this file does not exist, /etc/ssh/sshrc is run, and if that does not + exist either, xauth is used to add the cookie. + +AUTHORIZED_KEYS FILE FORMAT + AuthorizedKeysFile specifies the files containing public keys for public + key authentication; if this option is not specified, the default is + ~/.ssh/authorized_keys and ~/.ssh/authorized_keys2. Each line of the + file contains one key (empty lines and lines starting with a M-bM-^@M-^X#M-bM-^@M-^Y are + ignored as comments). Public keys consist of the following space- + separated fields: options, keytype, base64-encoded key, comment. The + options field is optional. The supported key types are: + + sk-ecdsa-sha2-nistp256@openssh.com + ecdsa-sha2-nistp256 + ecdsa-sha2-nistp384 + ecdsa-sha2-nistp521 + sk-ssh-ed25519@openssh.com + ssh-ed25519 + ssh-rsa + + The comment field is not used for anything (but may be convenient for the + user to identify the key). + + Note that lines in this file can be several hundred bytes long (because + of the size of the public key encoding) up to a limit of 8 kilobytes, + which permits RSA keys up to 16 kilobits. You don't want to type them + in; instead, copy the id_ecdsa.pub, id_ecdsa_sk.pub, id_ed25519.pub, + id_ed25519_sk.pub, or the id_rsa.pub file and edit it. + + sshd enforces a minimum RSA key modulus size of 1024 bits. + + The options (if present) consist of comma-separated option + specifications. No spaces are permitted, except within double quotes. + The following option specifications are supported (note that option + keywords are case-insensitive): + + agent-forwarding + Enable authentication agent forwarding previously disabled by the + restrict option. + + cert-authority + Specifies that the listed key is a certification authority (CA) + that is trusted to validate signed certificates for user + authentication. + + Certificates may encode access restrictions similar to these key + options. If both certificate restrictions and key options are + present, the most restrictive union of the two is applied. + + command="command" + Specifies that the command is executed whenever this key is used + for authentication. The command supplied by the user (if any) is + ignored. The command is run on a pty if the client requests a + pty; otherwise it is run without a tty. If an 8-bit clean + channel is required, one must not request a pty or should specify + no-pty. A quote may be included in the command by quoting it + with a backslash. + + This option might be useful to restrict certain public keys to + perform just a specific operation. An example might be a key + that permits remote backups but nothing else. Note that the + client may specify TCP and/or X11 forwarding unless they are + explicitly prohibited, e.g. using the restrict key option. + + The command originally supplied by the client is available in the + SSH_ORIGINAL_COMMAND environment variable. Note that this option + applies to shell, command or subsystem execution. Also note that + this command may be superseded by an sshd_config(5) ForceCommand + directive. + + If a command is specified and a forced-command is embedded in a + certificate used for authentication, then the certificate will be + accepted only if the two commands are identical. + + environment="NAME=value" + Specifies that the string is to be added to the environment when + logging in using this key. Environment variables set this way + override other default environment values. Multiple options of + this type are permitted. Environment processing is disabled by + default and is controlled via the PermitUserEnvironment option. + + expiry-time="timespec" + Specifies a time after which the key will not be accepted. The + time may be specified as a YYYYMMDD[Z] date or a + YYYYMMDDHHMM[SS][Z] time. Dates and times will be interpreted in + the system time zone unless suffixed by a Z character, in which + case they will be interpreted in the UTC time zone. + + from="pattern-list" + Specifies that in addition to public key authentication, either + the canonical name of the remote host or its IP address must be + present in the comma-separated list of patterns. See PATTERNS in + ssh_config(5) for more information on patterns. + + In addition to the wildcard matching that may be applied to + hostnames or addresses, a from stanza may match IP addresses + using CIDR address/masklen notation. + + The purpose of this option is to optionally increase security: + public key authentication by itself does not trust the network or + name servers or anything (but the key); however, if somebody + somehow steals the key, the key permits an intruder to log in + from anywhere in the world. This additional option makes using a + stolen key more difficult (name servers and/or routers would have + to be compromised in addition to just the key). + + no-agent-forwarding + Forbids authentication agent forwarding when this key is used for + authentication. + + no-port-forwarding + Forbids TCP forwarding when this key is used for authentication. + Any port forward requests by the client will return an error. + This might be used, e.g. in connection with the command option. + + no-pty Prevents tty allocation (a request to allocate a pty will fail). + + no-user-rc + Disables execution of ~/.ssh/rc. + + no-X11-forwarding + Forbids X11 forwarding when this key is used for authentication. + Any X11 forward requests by the client will return an error. + + permitlisten="[host:]port" + Limit remote port forwarding with the ssh(1) -R option such that + it may only listen on the specified host (optional) and port. + IPv6 addresses can be specified by enclosing the address in + square brackets. Multiple permitlisten options may be applied + separated by commas. Hostnames may include wildcards as + described in the PATTERNS section in ssh_config(5). A port + specification of * matches any port. Note that the setting of + GatewayPorts may further restrict listen addresses. Note that + ssh(1) will send a hostname of M-bM-^@M-^\localhostM-bM-^@M-^] if a listen host was + not specified when the forwarding was requested, and that this + name is treated differently to the explicit localhost addresses + M-bM-^@M-^\127.0.0.1M-bM-^@M-^] and M-bM-^@M-^\::1M-bM-^@M-^]. + + permitopen="host:port" + Limit local port forwarding with the ssh(1) -L option such that + it may only connect to the specified host and port. IPv6 + addresses can be specified by enclosing the address in square + brackets. Multiple permitopen options may be applied separated + by commas. No pattern matching or name lookup is performed on + the specified hostnames, they must be literal host names and/or + addresses. A port specification of * matches any port. + + port-forwarding + Enable port forwarding previously disabled by the restrict + option. + + principals="principals" + On a cert-authority line, specifies allowed principals for + certificate authentication as a comma-separated list. At least + one name from the list must appear in the certificate's list of + principals for the certificate to be accepted. This option is + ignored for keys that are not marked as trusted certificate + signers using the cert-authority option. + + pty Permits tty allocation previously disabled by the restrict + option. + + no-touch-required + Do not require demonstration of user presence for signatures made + using this key. This option only makes sense for the FIDO + authenticator algorithms ecdsa-sk and ed25519-sk. + + verify-required + Require that signatures made using this key attest that they + verified the user, e.g. via a PIN. This option only makes sense + for the FIDO authenticator algorithms ecdsa-sk and ed25519-sk. + + restrict + Enable all restrictions, i.e. disable port, agent and X11 + forwarding, as well as disabling PTY allocation and execution of + ~/.ssh/rc. If any future restriction capabilities are added to + authorized_keys files, they will be included in this set. + + tunnel="n" + Force a tun(4) device on the server. Without this option, the + next available device will be used if the client requests a + tunnel. + + user-rc + Enables execution of ~/.ssh/rc previously disabled by the + restrict option. + + X11-forwarding + Permits X11 forwarding previously disabled by the restrict + option. + + An example authorized_keys file: + + # Comments are allowed at start of line. Blank lines are allowed. + # Plain key, no restrictions + ssh-rsa ... + # Forced command, disable PTY and all forwarding + restrict,command="dump /home" ssh-rsa ... + # Restriction of ssh -L forwarding destinations + permitopen="192.0.2.1:80",permitopen="192.0.2.2:25" ssh-rsa ... + # Restriction of ssh -R forwarding listeners + permitlisten="localhost:8080",permitlisten="[::1]:22000" ssh-rsa ... + # Configuration for tunnel forwarding + tunnel="0",command="sh /etc/netstart tun0" ssh-rsa ... + # Override of restriction to allow PTY allocation + restrict,pty,command="nethack" ssh-rsa ... + # Allow FIDO key without requiring touch + no-touch-required sk-ecdsa-sha2-nistp256@openssh.com ... + # Require user-verification (e.g. PIN or biometric) for FIDO key + verify-required sk-ecdsa-sha2-nistp256@openssh.com ... + # Trust CA key, allow touch-less FIDO if requested in certificate + cert-authority,no-touch-required,principals="user_a" ssh-rsa ... + +SSH_KNOWN_HOSTS FILE FORMAT + The /etc/ssh/ssh_known_hosts and ~/.ssh/known_hosts files contain host + public keys for all known hosts. The global file should be prepared by + the administrator (optional), and the per-user file is maintained + automatically: whenever the user connects to an unknown host, its key is + added to the per-user file. + + Each line in these files contains the following fields: marker + (optional), hostnames, keytype, base64-encoded key, comment. The fields + are separated by spaces. + + The marker is optional, but if it is present then it must be one of + M-bM-^@M-^\@cert-authorityM-bM-^@M-^], to indicate that the line contains a certification + authority (CA) key, or M-bM-^@M-^\@revokedM-bM-^@M-^], to indicate that the key contained on + the line is revoked and must not ever be accepted. Only one marker + should be used on a key line. + + Hostnames is a comma-separated list of patterns (M-bM-^@M-^X*M-bM-^@M-^Y and M-bM-^@M-^X?M-bM-^@M-^Y act as + wildcards); each pattern in turn is matched against the host name. When + sshd is authenticating a client, such as when using + HostbasedAuthentication, this will be the canonical client host name. + When ssh(1) is authenticating a server, this will be the host name given + by the user, the value of the ssh(1) HostkeyAlias if it was specified, or + the canonical server hostname if the ssh(1) CanonicalizeHostname option + was used. + + A pattern may also be preceded by M-bM-^@M-^X!M-bM-^@M-^Y to indicate negation: if the host + name matches a negated pattern, it is not accepted (by that line) even if + it matched another pattern on the line. A hostname or address may + optionally be enclosed within M-bM-^@M-^X[M-bM-^@M-^Y and M-bM-^@M-^X]M-bM-^@M-^Y brackets then followed by M-bM-^@M-^X:M-bM-^@M-^Y + and a non-standard port number. + + Alternately, hostnames may be stored in a hashed form which hides host + names and addresses should the file's contents be disclosed. Hashed + hostnames start with a M-bM-^@M-^X|M-bM-^@M-^Y character. Only one hashed hostname may + appear on a single line and none of the above negation or wildcard + operators may be applied. + + The keytype and base64-encoded key are taken directly from the host key; + they can be obtained, for example, from /etc/ssh/ssh_host_rsa_key.pub. + The optional comment field continues to the end of the line, and is not + used. + + Lines starting with M-bM-^@M-^X#M-bM-^@M-^Y and empty lines are ignored as comments. + + When performing host authentication, authentication is accepted if any + matching line has the proper key; either one that matches exactly or, if + the server has presented a certificate for authentication, the key of the + certification authority that signed the certificate. For a key to be + trusted as a certification authority, it must use the M-bM-^@M-^\@cert-authorityM-bM-^@M-^] + marker described above. + + The known hosts file also provides a facility to mark keys as revoked, + for example when it is known that the associated private key has been + stolen. Revoked keys are specified by including the M-bM-^@M-^\@revokedM-bM-^@M-^] marker at + the beginning of the key line, and are never accepted for authentication + or as certification authorities, but instead will produce a warning from + ssh(1) when they are encountered. + + It is permissible (but not recommended) to have several lines or + different host keys for the same names. This will inevitably happen when + short forms of host names from different domains are put in the file. It + is possible that the files contain conflicting information; + authentication is accepted if valid information can be found from either + file. + + Note that the lines in these files are typically hundreds of characters + long, and you definitely don't want to type in the host keys by hand. + Rather, generate them by a script, ssh-keyscan(1) or by taking, for + example, /etc/ssh/ssh_host_rsa_key.pub and adding the host names at the + front. ssh-keygen(1) also offers some basic automated editing for + ~/.ssh/known_hosts including removing hosts matching a host name and + converting all host names to their hashed representations. + + An example ssh_known_hosts file: + + # Comments allowed at start of line + cvs.example.net,192.0.2.10 ssh-rsa AAAA1234.....= + # A hashed hostname + |1|JfKTdBh7rNbXkVAQCRp4OQoPfmI=|USECr3SWf1JUPsms5AqfD5QfxkM= ssh-rsa + AAAA1234.....= + # A revoked key + @revoked * ssh-rsa AAAAB5W... + # A CA key, accepted for any host in *.mydomain.com or *.mydomain.org + @cert-authority *.mydomain.org,*.mydomain.com ssh-rsa AAAAB5W... + +FILES + ~/.hushlogin + This file is used to suppress printing the last login time and + /etc/motd, if PrintLastLog and PrintMotd, respectively, are + enabled. It does not suppress printing of the banner specified + by Banner. + + ~/.rhosts + This file is used for host-based authentication (see ssh(1) for + more information). On some machines this file may need to be + world-readable if the user's home directory is on an NFS + partition, because sshd reads it as root. Additionally, this + file must be owned by the user, and must not have write + permissions for anyone else. The recommended permission for most + machines is read/write for the user, and not accessible by + others. + + ~/.shosts + This file is used in exactly the same way as .rhosts, but allows + host-based authentication without permitting login with + rlogin/rsh. + + ~/.ssh/ + This directory is the default location for all user-specific + configuration and authentication information. There is no + general requirement to keep the entire contents of this directory + secret, but the recommended permissions are read/write/execute + for the user, and not accessible by others. + + ~/.ssh/authorized_keys + Lists the public keys (ECDSA, Ed25519, RSA) that can be used for + logging in as this user. The format of this file is described + above. The content of the file is not highly sensitive, but the + recommended permissions are read/write for the user, and not + accessible by others. + + If this file, the ~/.ssh directory, or the user's home directory + are writable by other users, then the file could be modified or + replaced by unauthorized users. In this case, sshd will not + allow it to be used unless the StrictModes option has been set to + M-bM-^@M-^\noM-bM-^@M-^]. + + ~/.ssh/environment + This file is read into the environment at login (if it exists). + It can only contain empty lines, comment lines (that start with + M-bM-^@M-^X#M-bM-^@M-^Y), and assignment lines of the form name=value. The file + should be writable only by the user; it need not be readable by + anyone else. Environment processing is disabled by default and + is controlled via the PermitUserEnvironment option. + + ~/.ssh/known_hosts + Contains a list of host keys for all hosts the user has logged + into that are not already in the systemwide list of known host + keys. The format of this file is described above. This file + should be writable only by root/the owner and can, but need not + be, world-readable. + + ~/.ssh/rc + Contains initialization routines to be run before the user's home + directory becomes accessible. This file should be writable only + by the user, and need not be readable by anyone else. + + /etc/hosts.equiv + This file is for host-based authentication (see ssh(1)). It + should only be writable by root. + + /etc/moduli + Contains Diffie-Hellman groups used for the "Diffie-Hellman Group + Exchange" key exchange method. The file format is described in + moduli(5). If no usable groups are found in this file then fixed + internal groups will be used. + + /etc/motd + See motd(5). + + /etc/nologin + If this file exists, sshd refuses to let anyone except root log + in. The contents of the file are displayed to anyone trying to + log in, and non-root connections are refused. The file should be + world-readable. + + /etc/shosts.equiv + This file is used in exactly the same way as hosts.equiv, but + allows host-based authentication without permitting login with + rlogin/rsh. + + /etc/ssh/ssh_host_ecdsa_key + /etc/ssh/ssh_host_ed25519_key + /etc/ssh/ssh_host_rsa_key + These files contain the private parts of the host keys. These + files should only be owned by root, readable only by root, and + not accessible to others. Note that sshd does not start if these + files are group/world-accessible. + + /etc/ssh/ssh_host_ecdsa_key.pub + /etc/ssh/ssh_host_ed25519_key.pub + /etc/ssh/ssh_host_rsa_key.pub + These files contain the public parts of the host keys. These + files should be world-readable but writable only by root. Their + contents should match the respective private parts. These files + are not really used for anything; they are provided for the + convenience of the user so their contents can be copied to known + hosts files. These files are created using ssh-keygen(1). + + /etc/ssh/ssh_known_hosts + Systemwide list of known host keys. This file should be prepared + by the system administrator to contain the public host keys of + all machines in the organization. The format of this file is + described above. This file should be writable only by root/the + owner and should be world-readable. + + /etc/ssh/sshd_config + Contains configuration data for sshd. The file format and + configuration options are described in sshd_config(5). + + /etc/ssh/sshrc + Similar to ~/.ssh/rc, it can be used to specify machine-specific + login-time initializations globally. This file should be + writable only by root, and should be world-readable. + + /var/empty + chroot(2) directory used by sshd during privilege separation in + the pre-authentication phase. The directory should not contain + any files and must be owned by root and not group or world- + writable. + + /var/run/sshd.pid + Contains the process ID of the sshd listening for connections (if + there are several daemons running concurrently for different + ports, this contains the process ID of the one started last). + The content of this file is not sensitive; it can be world- + readable. + +SEE ALSO + scp(1), sftp(1), ssh(1), ssh-add(1), ssh-agent(1), ssh-keygen(1), + ssh-keyscan(1), chroot(2), login.conf(5), moduli(5), sshd_config(5), + inetd(8), sftp-server(8) + +AUTHORS + OpenSSH is a derivative of the original and free ssh 1.2.12 release by + Tatu Ylonen. Aaron Campbell, Bob Beck, Markus Friedl, Niels Provos, Theo + de Raadt and Dug Song removed many bugs, re-added newer features and + created OpenSSH. Markus Friedl contributed the support for SSH protocol + versions 1.5 and 2.0. Niels Provos and Markus Friedl contributed support + for privilege separation. + +OpenBSD 7.9 October 4, 2025 SSHD(8) diff --git a/sshd_config.0 b/sshd_config.0 new file mode 100644 index 000000000000..9bafd243e534 --- /dev/null +++ b/sshd_config.0 @@ -0,0 +1,1459 @@ +SSHD_CONFIG(5) File Formats Manual SSHD_CONFIG(5) + +NAME + sshd_config M-bM-^@M-^S OpenSSH daemon configuration file + +DESCRIPTION + sshd(8) reads configuration data from /etc/ssh/sshd_config (or the file + specified with -f on the command line). The file contains keyword- + argument pairs, one per line. Unless noted otherwise, for each keyword, + the first obtained value will be used. Lines starting with M-bM-^@M-^X#M-bM-^@M-^Y and empty + lines are interpreted as comments. Arguments may optionally be enclosed + in double quotes (") in order to represent arguments containing spaces. + + The possible keywords and their meanings are as follows (note that + keywords are case-insensitive and arguments are case-sensitive): + + AcceptEnv + Specifies what environment variables sent by the client will be + copied into the session's environ(7). See SendEnv and SetEnv in + ssh_config(5) for how to configure the client. The TERM + environment variable is always accepted whenever the client + requests a pseudo-terminal as it is required by the protocol. + Variables are specified by name, which may contain the wildcard + characters M-bM-^@M-^X*M-bM-^@M-^Y and M-bM-^@M-^X?M-bM-^@M-^Y. Multiple environment variables may be + separated by whitespace or spread across multiple AcceptEnv + directives. Be warned that some environment variables could be + used to bypass restricted user environments. For this reason, + care should be taken in the use of this directive. The default + is not to accept any environment variables. + + AddressFamily + Specifies which address family should be used by sshd(8). Valid + arguments are any (the default), inet (use IPv4 only), or inet6 + (use IPv6 only). + + AllowAgentForwarding + Specifies whether ssh-agent(1) forwarding is permitted. The + default is yes. Note that disabling agent forwarding does not + improve security unless users are also denied shell access, as + they can always install their own forwarders. + + AllowGroups + This keyword can be followed by a list of group name patterns, + separated by spaces. If specified, login is allowed only for + users whose primary group or supplementary group list matches one + of the patterns. Only group names are valid; a numerical group + ID is not recognized. By default, login is allowed for all + groups. AllowGroups is not consulted for groups matched by + DenyGroups. + + See PATTERNS in ssh_config(5) for more information on patterns. + This keyword may appear multiple times in sshd_config with each + instance appending to the list. + + AllowStreamLocalForwarding + Specifies whether StreamLocal (Unix-domain socket) forwarding is + permitted. The available options are yes (the default) or all to + allow StreamLocal forwarding, no to prevent all StreamLocal + forwarding, local to allow local (from the perspective of ssh(1)) + forwarding only or remote to allow remote forwarding only. Note + that disabling StreamLocal forwarding does not improve security + unless users are also denied shell access, as they can always + install their own forwarders. + + AllowTcpForwarding + Specifies whether TCP forwarding is permitted. The available + options are yes (the default) or all to allow TCP forwarding, no + to prevent all TCP forwarding, local to allow local (from the + perspective of ssh(1)) forwarding only or remote to allow remote + forwarding only. Note that disabling TCP forwarding does not + improve security unless users are also denied shell access, as + they can always install their own forwarders. + + AllowUsers + This keyword can be followed by a list of user name patterns, + separated by spaces. If specified, login is allowed only for + user names that match one of the patterns. Only user names are + valid; a numerical user ID is not recognized. By default, login + is allowed for all users. If the pattern takes the form + USER@HOST then USER and HOST are separately checked, restricting + logins to particular users from particular hosts. HOST criteria + may additionally contain addresses to match in CIDR + address/masklen format. AllowUsers is not consulted for users + matched by DenyUsers. + + See PATTERNS in ssh_config(5) for more information on patterns. + This keyword may appear multiple times in sshd_config with each + instance appending to the list. + + AuthenticationMethods + Specifies the authentication methods that must be successfully + completed for a user to be granted access. This option must be + followed by one or more lists of comma-separated authentication + method names, or by the single string any to indicate the default + behaviour of accepting any single authentication method. If the + default is overridden, then successful authentication requires + completion of every method in at least one of these lists. + + For example, "publickey,password publickey,keyboard-interactive" + would require the user to complete public key authentication, + followed by either password or keyboard interactive + authentication. Only methods that are next in one or more lists + are offered at each stage, so for this example it would not be + possible to attempt password or keyboard-interactive + authentication before public key. + + For keyboard interactive authentication it is also possible to + restrict authentication to a specific device by appending a colon + followed by the device identifier bsdauth or pam. depending on + the server configuration. For example, + "keyboard-interactive:bsdauth" would restrict keyboard + interactive authentication to the bsdauth device. + + If the publickey method is listed more than once, sshd(8) + verifies that keys that have been used successfully are not + reused for subsequent authentications. For example, + "publickey,publickey" requires successful authentication using + two different public keys. + + Note that each authentication method listed should also be + explicitly enabled in the configuration. + + The available authentication methods are: "gssapi-with-mic", + "hostbased", "keyboard-interactive", "none" (used for access to + password-less accounts when PermitEmptyPasswords is enabled), + "password" and "publickey". + + AuthorizedKeysCommand + Specifies a program to be used to look up the user's public keys. + The program must be owned by root, not writable by group or + others and specified by an absolute path. Arguments to + AuthorizedKeysCommand accept the tokens described in the TOKENS + section. If no arguments are specified then the username of the + target user is used. + + The program should produce on standard output zero or more lines + of authorized_keys output (see AUTHORIZED_KEYS in sshd(8)). + AuthorizedKeysCommand is tried after the usual AuthorizedKeysFile + files and will not be executed if a matching key is found there. + By default, no AuthorizedKeysCommand is run. This command is + only executed for valid users. + + AuthorizedKeysCommandUser + Specifies the user under whose account the AuthorizedKeysCommand + is run. It is recommended to use a dedicated user that has no + other role on the host than running authorized keys commands. If + AuthorizedKeysCommand is specified but AuthorizedKeysCommandUser + is not, then sshd(8) will refuse to start. + + AuthorizedKeysFile + Specifies the file that contains the public keys used for user + authentication. The format is described in the AUTHORIZED_KEYS + FILE FORMAT section of sshd(8). Arguments to AuthorizedKeysFile + may include wildcards and accept the tokens described in the + TOKENS section. After expansion, AuthorizedKeysFile is taken to + be an absolute path or one relative to the user's home directory. + Multiple files may be listed, separated by whitespace. + Alternately this option may be set to none to skip checking for + user keys in files. The default is ".ssh/authorized_keys + .ssh/authorized_keys2". These files are only checked for valid + users. + + AuthorizedPrincipalsCommand + Specifies a program to be used to generate the list of allowed + certificate principals as per AuthorizedPrincipalsFile. The + program must be owned by root, not writable by group or others + and specified by an absolute path. Arguments to + AuthorizedPrincipalsCommand accept the tokens described in the + TOKENS section. If no arguments are specified then the username + of the target user is used. + + The program should produce on standard output zero or more lines + of AuthorizedPrincipalsFile output. If either + AuthorizedPrincipalsCommand or AuthorizedPrincipalsFile is + specified, then certificates offered by the client for + authentication must contain a principal that is listed. By + default, no AuthorizedPrincipalsCommand is run. This command is + only executed for valid users. + + AuthorizedPrincipalsCommandUser + Specifies the user under whose account the + AuthorizedPrincipalsCommand is run. It is recommended to use a + dedicated user that has no other role on the host than running + authorized principals commands. If AuthorizedPrincipalsCommand + is specified but AuthorizedPrincipalsCommandUser is not, then + sshd(8) will refuse to start. + + AuthorizedPrincipalsFile + Specifies a file that lists principal names that are accepted for + certificate authentication. When using certificates signed by a + key listed in TrustedUserCAKeys, this file lists names, one of + which must appear in the certificate for it to be accepted for + authentication. Names are listed one per line preceded by key + options (as described in AUTHORIZED_KEYS FILE FORMAT in sshd(8)). + Empty lines and comments starting with M-bM-^@M-^X#M-bM-^@M-^Y are ignored. + + Arguments to AuthorizedPrincipalsFile may include wildcards and + accept the tokens described in the TOKENS section. After + expansion, AuthorizedPrincipalsFile is taken to be an absolute + path or one relative to the user's home directory. The default + is none, i.e. not to use a principals file M-bM-^@M-^S in this case, the + username of the user must appear in a certificate's principals + list for it to be accepted. This file is only checked for valid + users. + + Note that AuthorizedPrincipalsFile is only used when + authentication proceeds using a CA listed in TrustedUserCAKeys + and is not consulted for certification authorities trusted via + ~/.ssh/authorized_keys, though the principals= key option offers + a similar facility (see sshd(8) for details). + + Banner The contents of the specified file are sent to the remote user + before authentication is allowed. If the argument is none then + no banner is displayed. By default, no banner is displayed. + + CASignatureAlgorithms + Specifies which algorithms are allowed for signing of + certificates by certificate authorities (CAs). The default is: + + ssh-ed25519,ecdsa-sha2-nistp256, + ecdsa-sha2-nistp384,ecdsa-sha2-nistp521, + sk-ssh-ed25519@openssh.com, + sk-ecdsa-sha2-nistp256@openssh.com, + rsa-sha2-512,rsa-sha2-256 + + If the specified list begins with a M-bM-^@M-^X+M-bM-^@M-^Y character, then the + specified algorithms will be appended to the default set instead + of replacing them. If the specified list begins with a M-bM-^@M-^X-M-bM-^@M-^Y + character, then the specified algorithms (including wildcards) + will be removed from the default set instead of replacing them. + + Certificates signed using other algorithms will not be accepted + for public key or host-based authentication. + + ChannelTimeout + Specifies whether and how quickly sshd(8) should close inactive + channels. Timeouts are specified as one or more M-bM-^@M-^\type=intervalM-bM-^@M-^] + pairs separated by whitespace, where the M-bM-^@M-^\typeM-bM-^@M-^] must be the + special keyword M-bM-^@M-^\globalM-bM-^@M-^] or a channel type name from the list + below, optionally containing wildcard characters. + + The timeout value M-bM-^@M-^\intervalM-bM-^@M-^] is specified in seconds or may use + any of the units documented in the TIME FORMATS section. For + example, M-bM-^@M-^\session=5mM-bM-^@M-^] would cause interactive sessions to + terminate after five minutes of inactivity. Specifying a zero + value disables the inactivity timeout. + + The special timeout M-bM-^@M-^\globalM-bM-^@M-^] applies to all active channels, + taken together. Traffic on any active channel will reset the + timeout, but when the timeout expires then all open channels will + be closed. Note that this global timeout is not matched by + wildcards and must be specified explicitly. + + The available channel type names include: + + agent-connection + Open connections to ssh-agent(1). + + direct-tcpip, direct-streamlocal@openssh.com + Open TCP or Unix socket (respectively) connections that + have been established from an ssh(1) local forwarding, + i.e. LocalForward or DynamicForward. + + forwarded-tcpip, forwarded-streamlocal@openssh.com + Open TCP or Unix socket (respectively) connections that + have been established to an sshd(8) listening on behalf + of an ssh(1) remote forwarding, i.e. RemoteForward. + + session + The interactive main session, including shell session, + command execution, scp(1), sftp(1), etc. + + tun-connection + Open TunnelForward connections. + + x11-connection + Open X11 forwarding sessions. + + Note that in all the above cases, terminating an inactive session + does not guarantee to remove all resources associated with the + session, e.g. shell processes or X11 clients relating to the + session may continue to execute. + + Moreover, terminating an inactive channel or session does not + necessarily close the SSH connection, nor does it prevent a + client from requesting another channel of the same type. In + particular, expiring an inactive forwarding session does not + prevent another identical forwarding from being subsequently + created. + + The default is not to expire channels of any type for inactivity. + + ChrootDirectory + Specifies the pathname of a directory to chroot(2) to after + authentication. At session startup sshd(8) checks that all + components of the pathname are root-owned directories which are + not writable by group or others. After the chroot, sshd(8) + changes the working directory to the user's home directory. + Arguments to ChrootDirectory accept the tokens described in the + TOKENS section. + + The ChrootDirectory must contain the necessary files and + directories to support the user's session. For an interactive + session this requires at least a shell, typically sh(1), and + basic /dev nodes such as null(4), zero(4), stdin(4), stdout(4), + stderr(4), and tty(4) devices. For file transfer sessions using + SFTP no additional configuration of the environment is necessary + if the in-process sftp-server is used, though sessions which use + logging may require /dev/log inside the chroot directory on some + operating systems (see sftp-server(8) for details). + + For safety, it is very important that the directory hierarchy be + prevented from modification by other processes on the system + (especially those outside the jail). Misconfiguration can lead + to unsafe environments which sshd(8) cannot detect. + + The default is none, indicating not to chroot(2). + + Ciphers + Specifies the ciphers allowed. Multiple ciphers must be comma- + separated. If the specified list begins with a M-bM-^@M-^X+M-bM-^@M-^Y character, + then the specified ciphers will be appended to the default set + instead of replacing them. If the specified list begins with a + M-bM-^@M-^X-M-bM-^@M-^Y character, then the specified ciphers (including wildcards) + will be removed from the default set instead of replacing them. + If the specified list begins with a M-bM-^@M-^X^M-bM-^@M-^Y character, then the + specified ciphers will be placed at the head of the default set. + + The supported ciphers are: + + 3des-cbc + aes128-cbc + aes192-cbc + aes256-cbc + aes128-ctr + aes192-ctr + aes256-ctr + aes128-gcm@openssh.com + aes256-gcm@openssh.com + chacha20-poly1305@openssh.com + + The default is: + + chacha20-poly1305@openssh.com, + aes128-gcm@openssh.com,aes256-gcm@openssh.com, + aes128-ctr,aes192-ctr,aes256-ctr + + The list of available ciphers may also be obtained using "ssh -Q + cipher". + + ClientAliveCountMax + Sets the number of client alive messages which may be sent + without sshd(8) receiving any messages back from the client. If + this threshold is reached while client alive messages are being + sent, sshd will disconnect the client, terminating the session. + It is important to note that the use of client alive messages is + very different from TCPKeepAlive. The client alive messages are + sent through the encrypted channel and therefore will not be + spoofable. The TCP keepalive option enabled by TCPKeepAlive is + spoofable. The client alive mechanism is valuable when the + client or server depend on knowing when a connection has become + unresponsive. + + The default value is 3. If ClientAliveInterval is set to 15, and + ClientAliveCountMax is left at the default, unresponsive SSH + clients will be disconnected after approximately 45 seconds. + Setting a zero ClientAliveCountMax disables connection + termination. + + ClientAliveInterval + Sets a timeout interval in seconds after which if no data has + been received from the client, sshd(8) will send a message + through the encrypted channel to request a response from the + client. The default is 0, indicating that these messages will + not be sent to the client. + + Compression + Specifies whether compression is enabled after the user has + authenticated successfully. The argument must be yes, delayed (a + legacy synonym for yes) or no. The default is yes. + + Compression applies to all traffic that flows over the SSH + connection. If untrusted traffic (such as an open port-forward) + is permitted over the connection alongside trusted traffic, then + compression may leak information about session contents. For + this reason, it is not recommended to enable compression for + connections that share trusted and untrusted traffic. + + DenyGroups + This keyword can be followed by a list of group name patterns, + separated by spaces. Login is disallowed for users whose primary + group or supplementary group list matches one of the patterns. + Only group names are valid; a numerical group ID is not + recognized. By default, login is allowed for all groups. + AllowGroups is not consulted for groups matched by DenyGroups. + + See PATTERNS in ssh_config(5) for more information on patterns. + This keyword may appear multiple times in sshd_config with each + instance appending to the list. + + DenyUsers + This keyword can be followed by a list of user name patterns, + separated by spaces. Login is disallowed for user names that + match one of the patterns. Only user names are valid; a + numerical user ID is not recognized. By default, login is + allowed for all users. If the pattern takes the form USER@HOST + then USER and HOST are separately checked, restricting logins to + particular users from particular hosts. HOST criteria may + additionally contain addresses to match in CIDR address/masklen + format. AllowUsers is not consulted for users matched by + DenyUsers. + + See PATTERNS in ssh_config(5) for more information on patterns. + This keyword may appear multiple times in sshd_config with each + instance appending to the list. + + DisableForwarding + Disables all forwarding features, including X11, ssh-agent(1), + TCP and StreamLocal. This option overrides all other forwarding- + related options and may simplify restricted configurations. + + ExposeAuthInfo + Writes a temporary file containing a list of authentication + methods and public credentials (e.g. keys) used to authenticate + the user. The location of the file is exposed to the user + session through the SSH_USER_AUTH environment variable. The + default is no. + + FingerprintHash + Specifies the hash algorithm used when logging key fingerprints. + Valid options are: md5 and sha256. The default is sha256. + + ForceCommand + Forces the execution of the command specified by ForceCommand, + ignoring any command supplied by the client and ~/.ssh/rc if + present. The command is invoked by using the user's login shell + with the -c option. This applies to shell, command, or subsystem + execution. It is most useful inside a Match block. The command + originally supplied by the client is available in the + SSH_ORIGINAL_COMMAND environment variable. Specifying a command + of internal-sftp will force the use of an in-process SFTP server + that requires no support files when used with ChrootDirectory. + The default is none. + + This directive does not limit other kinds of access that a client + may request via their connection, such as TCP, agent, socket or + X11 forwarding. If these are not desired, then they must be + explicitly disabled, either individually via their respective + options or all together using the DisableForwarding option. + + GatewayPorts + Specifies whether remote hosts are allowed to connect to ports + forwarded for the client. By default, sshd(8) binds remote port + forwardings to the loopback address. This prevents other remote + hosts from connecting to forwarded ports. GatewayPorts can be + used to specify that sshd should allow remote port forwardings to + bind to non-loopback addresses, thus allowing other hosts to + connect. The argument may be no to force remote port forwardings + to be available to the local host only, yes to force remote port + forwardings to bind to the wildcard address, or clientspecified + to allow the client to select the address to which the forwarding + is bound. The default is no. + + GSSAPIAuthentication + Specifies whether user authentication based on GSSAPI is allowed. + The default is no. + + GSSAPICleanupCredentials + Specifies whether to automatically destroy the user's credentials + cache on logout. The default is yes. + + GSSAPIDelegateCredentials + Accept delegated credentials on the server side. The default is + yes. + + GSSAPIStrictAcceptorCheck + Determines whether to be strict about the identity of the GSSAPI + acceptor a client authenticates against. If set to yes then the + client must authenticate against the host service on the current + hostname. If set to no then the client may authenticate against + any service key stored in the machine's default store. This + facility is provided to assist with operation on multi homed + machines. The default is yes. This option may not be effective + in Windows Active Directory environments. + + HostbasedAcceptedAlgorithms + Specifies the signature algorithms that will be accepted for + hostbased authentication as a list of comma-separated patterns. + Alternately if the specified list begins with a M-bM-^@M-^X+M-bM-^@M-^Y character, + then the specified signature algorithms will be appended to the + default set instead of replacing them. If the specified list + begins with a M-bM-^@M-^X-M-bM-^@M-^Y character, then the specified signature + algorithms (including wildcards) will be removed from the default + set instead of replacing them. If the specified list begins with + a M-bM-^@M-^X^M-bM-^@M-^Y character, then the specified signature algorithms will be + placed at the head of the default set. The default for this + option is: + + ssh-ed25519-cert-v01@openssh.com, + ecdsa-sha2-nistp256-cert-v01@openssh.com, + ecdsa-sha2-nistp384-cert-v01@openssh.com, + ecdsa-sha2-nistp521-cert-v01@openssh.com, + sk-ssh-ed25519-cert-v01@openssh.com, + sk-ecdsa-sha2-nistp256-cert-v01@openssh.com, + webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com, + rsa-sha2-512-cert-v01@openssh.com, + rsa-sha2-256-cert-v01@openssh.com, + ssh-ed25519, + ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521, + sk-ssh-ed25519@openssh.com, + sk-ecdsa-sha2-nistp256@openssh.com, + webauthn-sk-ecdsa-sha2-nistp256@openssh.com, + rsa-sha2-512,rsa-sha2-256 + + The list of available signature algorithms may also be obtained + using "ssh -Q HostbasedAcceptedAlgorithms". This was formerly + named HostbasedAcceptedKeyTypes. + + HostbasedAuthentication + Specifies whether rhosts or /etc/hosts.equiv authentication + together with successful public key client host authentication is + allowed (host-based authentication). The default is no. + + HostbasedUsesNameFromPacketOnly + Specifies whether or not the server will attempt to perform a + reverse name lookup when matching the name in the ~/.shosts, + ~/.rhosts, and /etc/hosts.equiv files during + HostbasedAuthentication. A setting of yes means that sshd(8) + uses the name supplied by the client rather than attempting to + resolve the name from the TCP connection itself. The default is + no. + + HostCertificate + Specifies a file containing a public host certificate. The + certificate's public key must match a private host key already + specified by HostKey. The default behaviour of sshd(8) is not to + load any certificates. + + HostKey + Specifies a file containing a private host key used by SSH. The + defaults are /etc/ssh/ssh_host_ecdsa_key, + /etc/ssh/ssh_host_ed25519_key and /etc/ssh/ssh_host_rsa_key. + + Note that sshd(8) will refuse to use a file if it is group/world- + accessible and that the HostKeyAlgorithms option restricts which + of the keys are actually used by sshd(8). + + It is possible to have multiple host key files. It is also + possible to specify public host key files instead. In this case + operations on the private key will be delegated to an + ssh-agent(1). + + HostKeyAgent + Identifies the UNIX-domain socket used to communicate with an + agent that has access to the private host keys. If the string + "SSH_AUTH_SOCK" is specified, the location of the socket will be + read from the SSH_AUTH_SOCK environment variable. + + HostKeyAlgorithms + Specifies the host key signature algorithms that the server + offers. The default for this option is: + + ssh-ed25519-cert-v01@openssh.com, + ecdsa-sha2-nistp256-cert-v01@openssh.com, + ecdsa-sha2-nistp384-cert-v01@openssh.com, + ecdsa-sha2-nistp521-cert-v01@openssh.com, + sk-ssh-ed25519-cert-v01@openssh.com, + sk-ecdsa-sha2-nistp256-cert-v01@openssh.com, + webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com, + rsa-sha2-512-cert-v01@openssh.com, + rsa-sha2-256-cert-v01@openssh.com, + ssh-ed25519, + ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521, + sk-ssh-ed25519@openssh.com, + sk-ecdsa-sha2-nistp256@openssh.com, + webauthn-sk-ecdsa-sha2-nistp256@openssh.com, + rsa-sha2-512,rsa-sha2-256 + + The list of available signature algorithms may also be obtained + using "ssh -Q HostKeyAlgorithms". + + IgnoreRhosts + Specifies whether to ignore per-user .rhosts and .shosts files + during HostbasedAuthentication. The system-wide /etc/hosts.equiv + and /etc/shosts.equiv are still used regardless of this setting. + + Accepted values are yes (the default) to ignore all per-user + files, shosts-only to allow the use of .shosts but to ignore + .rhosts or no to allow both .shosts and rhosts. + + IgnoreUserKnownHosts + Specifies whether sshd(8) should ignore the user's + ~/.ssh/known_hosts during HostbasedAuthentication and use only + the system-wide known hosts file /etc/ssh/ssh_known_hosts. The + default is M-bM-^@M-^\noM-bM-^@M-^]. + + Include + Include the specified configuration file(s). Multiple pathnames + may be specified and each pathname may contain glob(7) wildcards + that will be expanded and processed in lexical order. Files + without absolute paths are assumed to be in /etc/ssh. An Include + directive may appear inside a Match block to perform conditional + inclusion. + + IPQoS Specifies the Differentiated Services Field Codepoint (DSCP) + value for the connection. Accepted values are af11, af12, af13, + af21, af22, af23, af31, af32, af33, af41, af42, af43, cs0, cs1, + cs2, cs3, cs4, cs5, cs6, cs7, ef, le, a numeric value, or none to + use the operating system default. This option may take one or + two arguments, separated by whitespace. If one argument is + specified, it is used as the packet class unconditionally. If + two values are specified, the first is automatically selected for + interactive sessions and the second for non-interactive sessions. + The default is ef (Expedited Forwarding) for interactive sessions + and none (the operating system default) for non-interactive + sessions. + + KbdInteractiveAuthentication + Specifies whether to allow keyboard-interactive authentication. + All authentication styles from login.conf(5) are supported. The + default is yes. The argument to this keyword must be yes or no. + ChallengeResponseAuthentication is a deprecated alias for this. + + KerberosAuthentication + Specifies whether the password provided by the user for + PasswordAuthentication will be validated through the Kerberos + KDC. To use this option, the server needs a Kerberos servtab + which allows the verification of the KDC's identity. The default + is no. + + KerberosGetAFSToken + If AFS is active and the user has a Kerberos 5 TGT, attempt to + acquire an AFS token before accessing the user's home directory. + The default is no. + + KerberosOrLocalPasswd + If password authentication through Kerberos fails then the + password will be validated via any additional local mechanism + such as /etc/passwd. The default is yes. + + KerberosTicketCleanup + Specifies whether to automatically destroy the user's ticket + cache file on logout. The default is yes. + + KexAlgorithms + Specifies the permitted KEX (Key Exchange) algorithms that the + server will offer to clients. The ordering of this list is not + important, as the client specifies the preference order. + Multiple algorithms must be comma-separated. + + If the specified list begins with a M-bM-^@M-^X+M-bM-^@M-^Y character, then the + specified algorithms will be appended to the default set instead + of replacing them. If the specified list begins with a M-bM-^@M-^X-M-bM-^@M-^Y + character, then the specified algorithms (including wildcards) + will be removed from the default set instead of replacing them. + If the specified list begins with a M-bM-^@M-^X^M-bM-^@M-^Y character, then the + specified algorithms will be placed at the head of the default + set. + + The supported algorithms are: + + curve25519-sha256 + curve25519-sha256@libssh.org + diffie-hellman-group1-sha1 + diffie-hellman-group14-sha1 + diffie-hellman-group14-sha256 + diffie-hellman-group16-sha512 + diffie-hellman-group18-sha512 + diffie-hellman-group-exchange-sha1 + diffie-hellman-group-exchange-sha256 + ecdh-sha2-nistp256 + ecdh-sha2-nistp384 + ecdh-sha2-nistp521 + mlkem768x25519-sha256 + sntrup761x25519-sha512 + sntrup761x25519-sha512@openssh.com + + The default is: + + mlkem768x25519-sha256, + sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com, + curve25519-sha256,curve25519-sha256@libssh.org, + ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521 + + The list of supported key exchange algorithms may also be + obtained using "ssh -Q KexAlgorithms". + + ListenAddress + Specifies the local addresses sshd(8) should listen on. The + following forms may be used: + + ListenAddress hostname|address [rdomain domain] + ListenAddress hostname:port [rdomain domain] + ListenAddress IPv4_address:port [rdomain domain] + ListenAddress [hostname|address]:port [rdomain domain] + + The optional rdomain qualifier requests sshd(8) listen in an + explicit routing domain. If port is not specified, sshd will + listen on the address and all Port options specified. The + default is to listen on all local addresses on the current + default routing domain. Multiple ListenAddress options are + permitted. For more information on routing domains, see + rdomain(4). + + LoginGraceTime + The server disconnects after this time if the user has not + successfully logged in. If the value is 0, there is no time + limit. The default is 120 seconds. + + LogLevel + Gives the verbosity level that is used when logging messages from + sshd(8). The possible values are: QUIET, FATAL, ERROR, INFO, + VERBOSE, DEBUG, DEBUG1, DEBUG2, and DEBUG3. The default is INFO. + DEBUG and DEBUG1 are equivalent. DEBUG2 and DEBUG3 each specify + higher levels of debugging output. Logging with a DEBUG level + violates the privacy of users and is not recommended. + + LogVerbose + Specify one or more overrides to LogLevel. An override consists + of one or more pattern lists that matches the source file, + function and line number to force detailed logging for. For + example, an override pattern of: + + kex.c:*:1000,*:kex_exchange_identification():*,packet.c:* + + would enable detailed logging for line 1000 of kex.c, everything + in the kex_exchange_identification() function, and all code in + the packet.c file. This option is intended for debugging and no + overrides are enabled by default. + + MACs Specifies the available MAC (message authentication code) + algorithms. The MAC algorithm is used for data integrity + protection. Multiple algorithms must be comma-separated. If the + specified list begins with a M-bM-^@M-^X+M-bM-^@M-^Y character, then the specified + algorithms will be appended to the default set instead of + replacing them. If the specified list begins with a M-bM-^@M-^X-M-bM-^@M-^Y + character, then the specified algorithms (including wildcards) + will be removed from the default set instead of replacing them. + If the specified list begins with a M-bM-^@M-^X^M-bM-^@M-^Y character, then the + specified algorithms will be placed at the head of the default + set. + + The algorithms that contain "-etm" calculate the MAC after + encryption (encrypt-then-mac). These are considered safer and + their use recommended. The supported MACs are: + + hmac-md5 + hmac-md5-96 + hmac-sha1 + hmac-sha1-96 + hmac-sha2-256 + hmac-sha2-512 + umac-64@openssh.com + umac-128@openssh.com + hmac-md5-etm@openssh.com + hmac-md5-96-etm@openssh.com + hmac-sha1-etm@openssh.com + hmac-sha1-96-etm@openssh.com + hmac-sha2-256-etm@openssh.com + hmac-sha2-512-etm@openssh.com + umac-64-etm@openssh.com + umac-128-etm@openssh.com + + The default is: + + umac-64-etm@openssh.com,umac-128-etm@openssh.com, + hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com, + hmac-sha1-etm@openssh.com, + umac-64@openssh.com,umac-128@openssh.com, + hmac-sha2-256,hmac-sha2-512,hmac-sha1 + + The list of available MAC algorithms may also be obtained using + "ssh -Q mac". + + Match Introduces a conditional block. If all of the criteria on the + Match line are satisfied, the keywords on the following lines + override those set in the global section of the config file, + until either another Match line or the end of the file. If a + keyword appears in multiple Match blocks that are satisfied, only + the first instance of the keyword is applied. + + The arguments to Match are one or more criteria-pattern pairs or + one of the single token criteria: All, which matches all + criteria, or Invalid-User, which matches when the requested user- + name does not match any known account. The available criteria + are User, Group, Host, LocalAddress, LocalPort, Version, RDomain, + and Address (with RDomain representing the rdomain(4) on which + the connection was received). + + The match patterns may consist of single entries or comma- + separated lists and may use the wildcard and negation operators + described in the PATTERNS section of ssh_config(5). + + The patterns in an Address criteria may additionally contain + addresses to match in CIDR address/masklen format, such as + 192.0.2.0/24 or 2001:db8::/32. Note that the mask length + provided must be consistent with the address - it is an error to + specify a mask length that is too long for the address or one + with bits set in this host portion of the address. For example, + 192.0.2.0/33 and 192.0.2.0/8, respectively. + + The Version keyword matches against the version string of + sshd(8), for example M-bM-^@M-^\OpenSSH_10.0M-bM-^@M-^]. + + Only a subset of keywords may be used on the lines following a + Match keyword. Available keywords are AcceptEnv, + AllowAgentForwarding, AllowGroups, AllowStreamLocalForwarding, + AllowTcpForwarding, AllowUsers, AuthenticationMethods, + AuthorizedKeysCommand, AuthorizedKeysCommandUser, + AuthorizedKeysFile, AuthorizedPrincipalsCommand, + AuthorizedPrincipalsCommandUser, AuthorizedPrincipalsFile, + Banner, CASignatureAlgorithms, ChannelTimeout, ChrootDirectory, + ClientAliveCountMax, ClientAliveInterval, DenyGroups, DenyUsers, + DisableForwarding, ExposeAuthInfo, ForceCommand, GatewayPorts, + GSSAPIAuthentication, HostbasedAcceptedAlgorithms, + HostbasedAuthentication, HostbasedUsesNameFromPacketOnly, + IgnoreRhosts, Include, IPQoS, KbdInteractiveAuthentication, + KerberosAuthentication, LogLevel, MaxAuthTries, MaxSessions, + PAMServiceName, PasswordAuthentication, PermitEmptyPasswords, + PermitListen, PermitOpen, PermitRootLogin, PermitTTY, + PermitTunnel, PermitUserRC, PubkeyAcceptedAlgorithms, + PubkeyAuthentication, PubkeyAuthOptions, RefuseConnection, + RekeyLimit, RevokedKeys, RDomain, SetEnv, StreamLocalBindMask, + StreamLocalBindUnlink, TrustedUserCAKeys, + UnusedConnectionTimeout, X11DisplayOffset, X11Forwarding and + X11UseLocalhost. + + MaxAuthTries + Specifies the maximum number of authentication attempts permitted + per connection. Once the number of failures reaches half this + value, additional failures are logged. The default is 6. + + MaxSessions + Specifies the maximum number of open shell, login or subsystem + (e.g. sftp) sessions permitted per network connection. Multiple + sessions may be established by clients that support connection + multiplexing. Setting MaxSessions to 1 will effectively disable + session multiplexing, whereas setting it to 0 will prevent all + shell, login and subsystem sessions while still permitting + forwarding. The default is 10. + + MaxStartups + Specifies the maximum number of concurrent unauthenticated + connections to the SSH daemon. Additional connections will be + dropped until authentication succeeds or the LoginGraceTime + expires for a connection. + + Alternatively, random early drop can be enabled by specifying the + three colon separated values start:rate:full (e.g. "10:30:60"). + The default is 10:30:100. sshd(8) will refuse connection + attempts with a probability of rate/100 (30%) if there are + currently start (10) unauthenticated connections. The + probability increases linearly and all connection attempts are + refused if the number of unauthenticated connections reaches full + (60). + + ModuliFile + Specifies the moduli(5) file that contains the Diffie-Hellman + groups used for the M-bM-^@M-^\diffie-hellman-group-exchange-sha1M-bM-^@M-^] and + M-bM-^@M-^\diffie-hellman-group-exchange-sha256M-bM-^@M-^] key exchange methods. The + default is /etc/moduli. + + PAMServiceName + Specifies the service name used for Pluggable Authentication + Modules (PAM) authentication, authorisation and session controls + when UsePAM is enabled. The default is sshd. + + PasswordAuthentication + Specifies whether password authentication is allowed. The + default is yes. + + PermitEmptyPasswords + When password authentication is allowed, it specifies whether the + server allows login to accounts with empty password strings. The + default is no. + + PermitListen + Specifies the addresses/ports on which a remote TCP port + forwarding may listen. The listen specification must be one of + the following forms: + + PermitListen port + PermitListen host:port + + Multiple permissions may be specified by separating them with + whitespace. An argument of any can be used to remove all + restrictions and permit any listen requests. An argument of none + can be used to prohibit all listen requests. The host name may + contain wildcards as described in the PATTERNS section in + ssh_config(5). The wildcard M-bM-^@M-^X*M-bM-^@M-^Y can also be used in place of a + port number to allow all ports. By default all port forwarding + listen requests are permitted. Note that the GatewayPorts option + may further restrict which addresses may be listened on. Note + also that ssh(1) will request a listen host of M-bM-^@M-^\localhostM-bM-^@M-^] if no + listen host was specifically requested, and this name is treated + differently to explicit localhost addresses of M-bM-^@M-^\127.0.0.1M-bM-^@M-^] and + M-bM-^@M-^\::1M-bM-^@M-^]. + + PermitOpen + Specifies the destinations to which TCP port forwarding is + permitted. The forwarding specification must be one of the + following forms: + + PermitOpen host:port + PermitOpen IPv4_addr:port + PermitOpen [IPv6_addr]:port + + Multiple forwards may be specified by separating them with + whitespace. An argument of any can be used to remove all + restrictions and permit any forwarding requests. An argument of + none can be used to prohibit all forwarding requests. The + wildcard M-bM-^@M-^X*M-bM-^@M-^Y can be used for host or port to allow all hosts or + ports respectively. Otherwise, no pattern matching or address + lookups are performed on supplied names. By default all port + forwarding requests are permitted. + + PermitRootLogin + Specifies whether root can log in using ssh(1). The argument + must be yes, prohibit-password, forced-commands-only, or no. The + default is prohibit-password. + + If this option is set to prohibit-password (or its deprecated + alias, without-password), password and keyboard-interactive + authentication are disabled for root. + + If this option is set to forced-commands-only, root login with + public key authentication will be allowed, but only if the + command option has been specified (which may be useful for taking + remote backups even if root login is normally not allowed). All + other authentication methods are disabled for root. + + If this option is set to no, root is not allowed to log in. + + PermitTTY + Specifies whether pty(4) allocation is permitted. The default is + yes. + + PermitTunnel + Specifies whether tun(4) device forwarding is allowed. The + argument must be yes, point-to-point (layer 3), ethernet (layer + 2), or no. Specifying yes permits both point-to-point and + ethernet. The default is no. + + Independent of this setting, the permissions of the selected + tun(4) device must allow access to the user. + + PermitUserEnvironment + Specifies whether ~/.ssh/environment and environment= options in + ~/.ssh/authorized_keys are processed by sshd(8). Valid options + are yes, no or a pattern-list specifying which environment + variable names to accept (for example "LANG,LC_*"). The default + is no. Enabling environment processing may enable users to + bypass access restrictions in some configurations using + mechanisms such as LD_PRELOAD. + + PermitUserRC + Specifies whether any ~/.ssh/rc file is executed. The default is + yes. + + PerSourceMaxStartups + Specifies the number of unauthenticated connections allowed from + a given source address, or M-bM-^@M-^\noneM-bM-^@M-^] if there is no limit. This + limit is applied in addition to MaxStartups, whichever is lower. + The default is none. + + PerSourceNetBlockSize + Specifies the number of bits of source address that are grouped + together for the purposes of applying PerSourceMaxStartups + limits. Values for IPv4 and optionally IPv6 may be specified, + separated by a colon. The default is 32:128, which means each + address is considered individually. + + PerSourcePenalties + Controls penalties for various conditions that may represent + attacks on sshd(8). If a penalty is enforced against a client + then its source address and any others in the same network, as + defined by PerSourceNetBlockSize, will be refused connection for + a period. + + A penalty doesn't affect concurrent connections in progress, but + multiple penalties from the same source from concurrent + connections will accumulate up to a maximum. Conversely, + penalties are not applied until a minimum threshold time has been + accumulated. + + Penalties are enabled by default with the default settings listed + below but may disabled using the no keyword. The defaults may be + overridden by specifying one or more of the keywords below, + separated by whitespace. All keywords accept arguments, e.g. + "crash:2m". + + crash:duration + Specifies how long to refuse clients that cause a crash + of sshd(8) (default: 90s). + + authfail:duration + Specifies how long to refuse clients that disconnect + after making one or more unsuccessful authentication + attempts (default: 5s). + + invaliduser:duration + Specifies how long to refuse clients that attempt to log + in with an invalid user (default: 5s). + + refuseconnection:duration + Specifies how long to refuse clients that were + administratively prohibited connection via the + RefuseConnection option (default: 10s). + + noauth:duration + Specifies how long to refuse clients that disconnect + without attempting authentication (default: 1s). This + timeout should be used cautiously otherwise it may + penalise legitimate scanning tools such as + ssh-keyscan(1). + + grace-exceeded:duration + Specifies how long to refuse clients that fail to + authenticate after LoginGraceTime (default: 10s). + + max:duration + Specifies the maximum time a particular source address + range will be refused access for (default: 10m). + Repeated penalties will accumulate up to this maximum. + + min:duration + Specifies the minimum penalty that must accrue before + enforcement begins (default: 15s). + + max-sources4:number, max-sources6:number + Specifies the maximum number of client IPv4 and IPv6 + address ranges to track for penalties (default: 65536 for + both). + + overflow:mode + Controls how the server behaves when max-sources4 or + max-sources6 is exceeded. There are two operating modes: + deny-all, which denies all incoming connections other + than those exempted via PerSourcePenaltyExemptList until + a penalty expires, and permissive, which allows new + connections by removing existing penalties early + (default: permissive). Note that client penalties below + the min threshold count against the total number of + tracked penalties. IPv4 and IPv6 addresses are tracked + separately, so an overflow in one will not affect the + other. + + overflow6:mode + Allows specifying a different overflow mode for IPv6 + addresses. The default it to use the same overflow mode + as was specified for IPv4. + + PerSourcePenaltyExemptList + Specifies a comma-separated list of addresses to exempt from + penalties. This list may contain wildcards and CIDR + address/masklen ranges. Note that the mask length provided must + be consistent with the address - it is an error to specify a mask + length that is too long for the address or one with bits set in + this host portion of the address. For example, 192.0.2.0/33 and + 192.0.2.0/8, respectively. The default is not to exempt any + addresses. + + PidFile + Specifies the file that contains the process ID of the SSH + daemon, or none to not write one. The default is + /var/run/sshd.pid. + + Port Specifies the port number that sshd(8) listens on. The default + is 22. Multiple options of this type are permitted. See also + ListenAddress. + + PrintLastLog + Specifies whether sshd(8) should print the date and time of the + last user login when a user logs in interactively. The default + is yes. + + PrintMotd + Specifies whether sshd(8) should print /etc/motd when a user logs + in interactively. (On some systems it is also printed by the + shell, /etc/profile, or equivalent.) The default is yes. + + PubkeyAcceptedAlgorithms + Specifies the signature algorithms that will be accepted for + public key authentication as a list of comma-separated patterns. + Alternately if the specified list begins with a M-bM-^@M-^X+M-bM-^@M-^Y character, + then the specified algorithms will be appended to the default set + instead of replacing them. If the specified list begins with a + M-bM-^@M-^X-M-bM-^@M-^Y character, then the specified algorithms (including + wildcards) will be removed from the default set instead of + replacing them. If the specified list begins with a M-bM-^@M-^X^M-bM-^@M-^Y + character, then the specified algorithms will be placed at the + head of the default set. The default for this option is: + + ssh-ed25519-cert-v01@openssh.com, + ecdsa-sha2-nistp256-cert-v01@openssh.com, + ecdsa-sha2-nistp384-cert-v01@openssh.com, + ecdsa-sha2-nistp521-cert-v01@openssh.com, + sk-ssh-ed25519-cert-v01@openssh.com, + sk-ecdsa-sha2-nistp256-cert-v01@openssh.com, + webauthn-sk-ecdsa-sha2-nistp256-cert-v01@openssh.com, + rsa-sha2-512-cert-v01@openssh.com, + rsa-sha2-256-cert-v01@openssh.com, + ssh-ed25519, + ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521, + sk-ssh-ed25519@openssh.com, + sk-ecdsa-sha2-nistp256@openssh.com, + webauthn-sk-ecdsa-sha2-nistp256@openssh.com, + rsa-sha2-512,rsa-sha2-256 + + The list of available signature algorithms may also be obtained + using "ssh -Q PubkeyAcceptedAlgorithms". + + PubkeyAuthOptions + Sets one or more public key authentication options. The + supported keywords are: none (the default; indicating no + additional options are enabled), touch-required and + verify-required. + + The touch-required option causes public key authentication using + a FIDO authenticator algorithm (i.e. ecdsa-sk or ed25519-sk) to + always require the signature to attest that a physically present + user explicitly confirmed the authentication (usually by touching + the authenticator). By default, sshd(8) requires user presence + unless overridden with an authorized_keys option. The + touch-required flag disables this override. + + The verify-required option requires a FIDO key signature attest + that the user was verified, e.g. via a PIN. + + Neither the touch-required or verify-required options have any + effect for other, non-FIDO, public key types. + + PubkeyAuthentication + Specifies whether public key authentication is allowed. The + default is yes. + + RefuseConnection + Indicates that sshd(8) should unconditionally terminate the + connection. Additionally, a refuseconnection penalty may be + recorded against the source of the connection if + PerSourcePenalties are enabled. This option is only really + useful in a Match block. + + RekeyLimit + Specifies the maximum amount of data that may be transmitted or + received before the session key is renegotiated, optionally + followed by a maximum amount of time that may pass before the + session key is renegotiated. The first argument is specified in + bytes and may have a suffix of M-bM-^@M-^XKM-bM-^@M-^Y, M-bM-^@M-^XMM-bM-^@M-^Y, or M-bM-^@M-^XGM-bM-^@M-^Y to indicate + Kilobytes, Megabytes, or Gigabytes, respectively. The default is + between M-bM-^@M-^X1GM-bM-^@M-^Y and M-bM-^@M-^X4GM-bM-^@M-^Y, depending on the cipher. The optional + second value is specified in seconds and may use any of the units + documented in the TIME FORMATS section. The default value for + RekeyLimit is default none, which means that rekeying is + performed after the cipher's default amount of data has been sent + or received and no time based rekeying is done. + + RequiredRSASize + Specifies the minimum RSA key size (in bits) that sshd(8) will + accept. User and host-based authentication keys smaller than + this limit will be refused. The default is 1024 bits. Note that + this limit may only be raised from the default. + + RevokedKeys + Specifies revoked public keys file, or none to not use one. Keys + listed in this file will be refused for public key + authentication. Note that if this file is not readable, then + public key authentication will be refused for all users. Keys + may be specified as a text file, listing one public key per line, + or as an OpenSSH Key Revocation List (KRL) as generated by + ssh-keygen(1). This file may be consulted for each public key + authentication attempt received by sshd(8) and its contents must + be consistent at all times, therefore it should only be + atomically replaced and never modified in place while the server + is running. For more information on KRLs, see the KEY REVOCATION + LISTS section in ssh-keygen(1). + + RDomain + Specifies an explicit routing domain that is applied after + authentication has completed. The user session, as well as any + forwarded or listening IP sockets, will be bound to this + rdomain(4). If the routing domain is set to %D, then the domain + in which the incoming connection was received will be applied. + + SecurityKeyProvider + Specifies a path to a library that will be used when loading FIDO + authenticator-hosted keys, overriding the default of using the + built-in USB HID support. + + SetEnv Specifies one or more environment variables to set in child + sessions started by sshd(8) as M-bM-^@M-^\NAME=VALUEM-bM-^@M-^]. The environment + value may be quoted (e.g. if it contains whitespace characters). + Environment variables set by SetEnv override the default + environment and any variables specified by the user via AcceptEnv + or PermitUserEnvironment. + + SshdAuthPath + Overrides the default path to the sshd-auth binary that is + invoked to complete user authentication. The default is + /usr/libexec/sshd-auth. This option is intended for use by + tests. + + SshdSessionPath + Overrides the default path to the sshd-session binary that is + invoked to handle each connection. The default is + /usr/libexec/sshd-session. This option is intended for use by + tests. + + StreamLocalBindMask + Sets the octal file creation mode mask (umask) used when creating + a Unix-domain socket file for local or remote port forwarding. + This option is only used for port forwarding to a Unix-domain + socket file. + + The default value is 0177, which creates a Unix-domain socket + file that is readable and writable only by the owner. Note that + not all operating systems honor the file mode on Unix-domain + socket files. + + StreamLocalBindUnlink + Specifies whether to remove an existing Unix-domain socket file + for local or remote port forwarding before creating a new one. + If the socket file already exists and StreamLocalBindUnlink is + not enabled, sshd will be unable to forward the port to the Unix- + domain socket file. This option is only used for port forwarding + to a Unix-domain socket file. + + The argument must be yes or no. The default is no. + + StrictModes + Specifies whether sshd(8) should check file modes and ownership + of the user's files and home directory before accepting login. + This is normally desirable because novices sometimes accidentally + leave their directory or files world-writable. The default is + yes. Note that this does not apply to ChrootDirectory, whose + permissions and ownership are checked unconditionally. + + Subsystem + Configures an external subsystem (e.g. file transfer daemon). + Arguments should be a subsystem name and a command (with optional + arguments) to execute upon subsystem request. + + The command sftp-server implements the SFTP file transfer + subsystem. + + Alternately the name internal-sftp implements an in-process SFTP + server. This may simplify configurations using ChrootDirectory + to force a different filesystem root on clients. It accepts the + same command line arguments as sftp-server and even though it is + in-process, settings such as LogLevel or SyslogFacility do not + apply to it and must be set explicitly via command line + arguments. + + By default no subsystems are defined. + + SyslogFacility + Gives the facility code that is used when logging messages from + sshd(8). The possible values are: DAEMON, USER, AUTH, LOCAL0, + LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7. The + default is AUTH. + + TCPKeepAlive + Specifies whether the system should send TCP keepalive messages + to the other side. If they are sent, death of the connection or + crash of one of the machines will be properly noticed. However, + this means that connections will die if the route is down + temporarily, and some people find it annoying. On the other + hand, if TCP keepalives are not sent, sessions may hang + indefinitely on the server, leaving "ghost" users and consuming + server resources. + + The default is yes (to send TCP keepalive messages), and the + server will notice if the network goes down or the client host + crashes. This avoids infinitely hanging sessions. + + To disable TCP keepalive messages, the value should be set to no. + + TrustedUserCAKeys + Specifies a file containing public keys of certificate + authorities that are trusted to sign user certificates for + authentication, or none to not use one. Keys are listed one per + line; empty lines and comments starting with M-bM-^@M-^X#M-bM-^@M-^Y are allowed. If + a certificate is presented for authentication and has its signing + CA key listed in this file, then it may be used for + authentication for any user listed in the certificate's + principals list. Note that certificates that lack a list of + principals will not be permitted for authentication using + TrustedUserCAKeys. For more details on certificates, see the + CERTIFICATES section in ssh-keygen(1). + + UnusedConnectionTimeout + Specifies whether and how quickly sshd(8) should close client + connections with no open channels. Open channels include active + shell, command execution or subsystem sessions, connected + network, socket, agent or X11 forwardings. Forwarding listeners, + such as those from the ssh(1) -R flag, are not considered as open + channels and do not prevent the timeout. The timeout value is + specified in seconds or may use any of the units documented in + the TIME FORMATS section. + + Note that this timeout starts when the client connection + completes user authentication but before the client has an + opportunity to open any channels. Caution should be used when + using short timeout values, as they may not provide sufficient + time for the client to request and open its channels before + terminating the connection. + + The default none is to never expire connections for having no + open channels. This option may be useful in conjunction with + ChannelTimeout. + + UseDNS Specifies whether sshd(8) should look up the remote host name, + and to check that the resolved host name for the remote IP + address maps back to the very same IP address. + + If this option is set to no (the default) then only addresses and + not host names may be used in ~/.ssh/authorized_keys from and + sshd_config Match Host directives. + + UsePAM Enables the Pluggable Authentication Module interface. If set to + yes this will enable PAM authentication using + KbdInteractiveAuthentication and PasswordAuthentication in + addition to PAM account and session module processing for all + authentication types. + + Because PAM keyboard-interactive authentication usually serves an + equivalent role to password authentication, you should disable + either PasswordAuthentication or KbdInteractiveAuthentication. + + If UsePAM is enabled, you will not be able to run sshd(8) as a + non-root user. The default is no. + + VersionAddendum + Optionally specifies additional text to append to the SSH + protocol banner sent by the server upon connection. The default + is none. + + X11DisplayOffset + Specifies the first display number available for sshd(8)'s X11 + forwarding. This prevents sshd from interfering with real X11 + servers. The default is 10. + + X11Forwarding + Specifies whether X11 forwarding is permitted. The argument must + be yes or no. The default is no. + + When X11 forwarding is enabled, there may be additional exposure + to the server and to client displays if the sshd(8) proxy display + is configured to listen on the wildcard address (see + X11UseLocalhost), though this is not the default. Additionally, + the authentication spoofing and authentication data verification + and substitution occur on the client side. The security risk of + using X11 forwarding is that the client's X11 display server may + be exposed to attack when the SSH client requests forwarding (see + the warnings for ForwardX11 in ssh_config(5)). A system + administrator may have a stance in which they want to protect + clients that may expose themselves to attack by unwittingly + requesting X11 forwarding, which can warrant a no setting. + + Note that disabling X11 forwarding does not prevent users from + forwarding X11 traffic, as users can always install their own + forwarders. + + X11UseLocalhost + Specifies whether sshd(8) should bind the X11 forwarding server + to the loopback address or to the wildcard address. By default, + sshd binds the forwarding server to the loopback address and sets + the hostname part of the DISPLAY environment variable to + localhost. This prevents remote hosts from connecting to the + proxy display. However, some older X11 clients may not function + with this configuration. X11UseLocalhost may be set to no to + specify that the forwarding server should be bound to the + wildcard address. The argument must be yes or no. The default + is yes. + + XAuthLocation + Specifies the full pathname of the xauth(1) program, or none to + not use one. The default is /usr/X11R6/bin/xauth. + +TIME FORMATS + sshd(8) command-line arguments and configuration file options that + specify time may be expressed using a sequence of the form: + time[qualifier], where time is a positive integer value and qualifier is + one of the following: + + M-bM-^_M-(noneM-bM-^_M-) seconds + s | S seconds + m | M minutes + h | H hours + d | D days + w | W weeks + + Each member of the sequence is added together to calculate the total time + value. + + Time format examples: + + 600 600 seconds (10 minutes) + 10m 10 minutes + 1h30m 1 hour 30 minutes (90 minutes) + +TOKENS + Arguments to some keywords can make use of tokens, which are expanded at + runtime. Tokens are expanded without quoting or escaping of shell + characters. It is the administrator's responsibility to ensure they are + safe in the context of their use. + + The supported tokens in sshd_config are: + + %% A literal M-bM-^@M-^X%M-bM-^@M-^Y. + %C Identifies the connection endpoints, containing four space- + separated values: client address, client port number, server + address, and server port number. + %D The routing domain in which the incoming connection was + received. + %F The fingerprint of the CA key. + %f The fingerprint of the key or certificate. + %h The home directory of the user. + %i The key ID in the certificate. + %K The base64-encoded CA key. + %k The base64-encoded key or certificate for authentication. + %s The serial number of the certificate. + %T The type of the CA key. + %t The key or certificate type. + %U The numeric user ID of the target user. + %u The username. + + AuthorizedKeysCommand accepts the tokens %%, %C, %D, %f, %h, %k, %t, %U, + and %u. + + AuthorizedKeysFile accepts the tokens %%, %h, %U, and %u. + + AuthorizedPrincipalsCommand accepts the tokens %%, %C, %D, %F, %f, %h, + %i, %K, %k, %s, %T, %t, %U, and %u. + + AuthorizedPrincipalsFile accepts the tokens %%, %h, %U, and %u. + + ChrootDirectory accepts the tokens %%, %h, %U, and %u. + + RoutingDomain accepts the token %D. + +FILES + /etc/ssh/sshd_config + Contains configuration data for sshd(8). This file should be + writable by root only, but it is recommended (though not + necessary) that it be world-readable. + +SEE ALSO + sftp-server(8), sshd(8) + +AUTHORS + OpenSSH is a derivative of the original and free ssh 1.2.12 release by + Tatu Ylonen. Aaron Campbell, Bob Beck, Markus Friedl, Niels Provos, Theo + de Raadt and Dug Song removed many bugs, re-added newer features and + created OpenSSH. Markus Friedl contributed the support for SSH protocol + versions 1.5 and 2.0. Niels Provos and Markus Friedl contributed support + for privilege separation. + +OpenBSD 7.9 June 24, 2026 SSHD_CONFIG(5) From 823ad00d14065ab932794be8d0a75a86b6277849 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Tue, 7 Jul 2026 01:00:22 +0000 Subject: [PATCH 190/196] upstream: fix GSSAPI option names, that I somehow screwed up while refactoring servconf.c bz3974 patch from Colin Watson OpenBSD-Commit-ID: be39ad3dbe36d9ecdb86f3811da5dfbdc9bcb1e6 --- servconf.c | 18 +++++++++--------- servconf.h | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/servconf.c b/servconf.c index ce388f1dd93f..9b443bea0673 100644 --- a/servconf.c +++ b/servconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: servconf.c,v 1.450 2026/06/29 08:59:31 djm Exp $ */ +/* $OpenBSD: servconf.c,v 1.451 2026/07/07 01:00:22 djm Exp $ */ /* * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland * All rights reserved @@ -1433,19 +1433,19 @@ process_server_config_line_depth(ServerOptions *options, char *line, #endif /* KRB5 */ #ifdef GSSAPI - case sGssAuthentication: + case sGSSAPIAuthentication: intptr = &options->gss_authentication; goto parse_flag; - case sGssCleanupCreds: + case sGSSAPICleanupCredentials: intptr = &options->gss_cleanup_creds; goto parse_flag; - case sGssDelegateCreds: + case sGSSAPIDelegateCredentials: intptr = &options->gss_deleg_creds; goto parse_flag; - case sGssStrictAcceptor: + case sGSSAPIStrictAcceptorCheck: intptr = &options->gss_strict_acceptor; goto parse_flag; #endif /* GSSAPI */ @@ -4215,10 +4215,10 @@ dump_config(ServerOptions *o) # endif #endif #ifdef GSSAPI - dump_cfg_fmtint(sGssAuthentication, o->gss_authentication); - dump_cfg_fmtint(sGssCleanupCreds, o->gss_cleanup_creds); - dump_cfg_fmtint(sGssDelegateCreds, o->gss_deleg_creds); - dump_cfg_fmtint(sGssStrictAcceptor, o->gss_strict_acceptor); + dump_cfg_fmtint(sGSSAPIAuthentication, o->gss_authentication); + dump_cfg_fmtint(sGSSAPICleanupCredentials, o->gss_cleanup_creds); + dump_cfg_fmtint(sGSSAPIDelegateCredentials, o->gss_deleg_creds); + dump_cfg_fmtint(sGSSAPIStrictAcceptorCheck, o->gss_strict_acceptor); #endif dump_cfg_fmtint(sPasswordAuthentication, o->password_authentication); dump_cfg_fmtint(sKbdInteractiveAuthentication, diff --git a/servconf.h b/servconf.h index 9e64e4673743..a2345e88a461 100644 --- a/servconf.h +++ b/servconf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: servconf.h,v 1.177 2026/05/31 11:30:50 djm Exp $ */ +/* $OpenBSD: servconf.h,v 1.179 2026/07/07 01:00:22 djm Exp $ */ /* * Author: Tatu Ylonen @@ -314,16 +314,16 @@ SSHCONF_UNSUPPORTED_INT(kerberos_get_afs_token, KerberosGetAFSToken, SSHCFG_GLOB #ifdef GSSAPI #define SSHD_CONFIG_ENTRIES_GSS \ -SSHCONF_INTFLAG(gss_authentication, GssAuthentication, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ -SSHCONF_INTFLAG(gss_cleanup_creds, GssCleanupCreds, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ -SSHCONF_INTFLAG(gss_deleg_creds, GssDelegateCreds, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ -SSHCONF_INTFLAG(gss_strict_acceptor, GssStrictAcceptor, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) +SSHCONF_INTFLAG(gss_authentication, GSSAPIAuthentication, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(gss_cleanup_creds, GSSAPICleanupCredentials, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(gss_deleg_creds, GSSAPIDelegateCredentials, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(gss_strict_acceptor, GSSAPIStrictAcceptorCheck, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) #else /* GSSAPI */ #define SSHD_CONFIG_ENTRIES_GSS \ -SSHCONF_UNSUPPORTED_INT(gss_authentication, GssAuthentication, SSHCFG_ALL) \ -SSHCONF_UNSUPPORTED_INT(gss_cleanup_creds, GssCleanupCreds, SSHCFG_GLOBAL) \ -SSHCONF_UNSUPPORTED_INT(gss_deleg_creds, GssDelegateCreds, SSHCFG_GLOBAL) \ -SSHCONF_UNSUPPORTED_INT(gss_strict_acceptor, GssStrictAcceptor, SSHCFG_GLOBAL) +SSHCONF_UNSUPPORTED_INT(gss_authentication, GSSAPIAuthentication, SSHCFG_ALL) \ +SSHCONF_UNSUPPORTED_INT(gss_cleanup_creds, GSSAPICleanupCredentials, SSHCFG_GLOBAL) \ +SSHCONF_UNSUPPORTED_INT(gss_deleg_creds, GSSAPIDelegateCredentials, SSHCFG_GLOBAL) \ +SSHCONF_UNSUPPORTED_INT(gss_strict_acceptor, GSSAPIStrictAcceptorCheck, SSHCFG_GLOBAL) #endif /* GSSAPI */ #define SSHD_CONFIG_ENTRIES \ From 6789420d136fe195f31dd83d0f3cf5fa6d0ef96d Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 6 Aug 2026 23:30:30 +1000 Subject: [PATCH 191/196] Re-allow PAMServiceName inside a Match block. This is documented to be allowed, and was up until 10.4p1 when a transcription error in the config handling rework reverted it to global-only, ie not allowed inside Match. bz#3987. --- servconf.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servconf.h b/servconf.h index a2345e88a461..3648e2be1af0 100644 --- a/servconf.h +++ b/servconf.h @@ -273,11 +273,11 @@ SSHCONF_ALIAS(KeepAlive, TCPKeepAlive, SSHCFG_GLOBAL) #ifdef USE_PAM #define SSHD_CONFIG_ENTRIES_PAM \ SSHCONF_INTFLAG(use_pam, UsePAM, SSHCFG_GLOBAL, 0, SSHCFG_COPY_NONE) \ -SSHCONF_STRING(pam_service_name, PAMServiceName, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) +SSHCONF_STRING(pam_service_name, PAMServiceName, SSHCFG_ALL, SSHCFG_COPY_NONE) #else #define SSHD_CONFIG_ENTRIES_PAM \ SSHCONF_UNSUPPORTED_INT(use_pam, UsePAM, SSHCFG_GLOBAL) \ -SSHCONF_UNSUPPORTED_STRING(pam_service_name, PAMServiceName, SSHCFG_GLOBAL) +SSHCONF_UNSUPPORTED_STRING(pam_service_name, PAMServiceName, SSHCFG_ALL) #endif #ifdef DISABLE_LASTLOG From 1dc4dc1c984a82232485d09b4718235771362688 Mon Sep 17 00:00:00 2001 From: Andrew Younkers Date: Mon, 10 Aug 2026 14:26:23 -0400 Subject: [PATCH 192/196] merge conflict resolutions Signed-off-by: Andrew Younkers --- .depend | 3 +- .github/workflows/vm.yml | 177 +- .gitignore | 6 + ChangeLog | 18253 +++++++++++++++++++++++++++++++++++++ authfile.c | 1 + config.h.in | 3 + configure | 122 + defines.h | 8 +- pathnames.h | 52 + servconf.c | 72 +- servconf.h | 22 +- ssh-keygen.c | 112 +- ssh-keyscan.c | 130 +- ssh-keysign.c | 27 +- ssh.c | 26 + sshconnect2.c | 14 +- sshkey.c | 1 + sshkey.h | 30 + version.h | 2 +- 19 files changed, 18914 insertions(+), 147 deletions(-) diff --git a/.depend b/.depend index f14bfebaeb2b..ee417bd3dbd6 100644 --- a/.depend +++ b/.depend @@ -76,7 +76,7 @@ kexmlkem768x25519.o: includes.h config.h defines.h platform.h openbsd-compat/ope kexsntrup761x25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h krl.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshbuf.h ssherr.h sshkey.h misc.h log.h digest.h bitmap.h utf8.h krl.h libcrux-mlkem-mldsa.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h -log.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h match.h +llog.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h match.h loginrec.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshkey.h hostfile.h ssh.h loginrec.h log.h ssherr.h atomicio.h packet.h dispatch.h canohost.h auth.h auth-pam.h audit.h sshbuf.h misc.h logintest.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h loginrec.h mac.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h digest.h hmac.h umac.h mac.h misc.h ssherr.h sshbuf.h openbsd-compat/openssl-compat.h @@ -140,6 +140,7 @@ ssh-keyscan.o: atomicio.h misc.h hostfile.h ssh_api.h ssh2.h dns.h addr.h ssh-keyscan.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h sshbuf.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h digest.h kex.h mac.h crypto_api.h compat.h myproposal.h packet.h dispatch.h log.h ssherr.h ssh-keysign.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h ssherr.h sshkey.h ssh.h ssh2.h misc.h sshbuf.h authfile.h msg.h canohost.h pathnames.h readconf.h uidswap.h ssh-mldsa-eddsa.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h +ssh-oqs.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h crypto_api.h log.h ssherr.h sshbuf.h sshkey.h ssh.h ssh-pkcs11-client.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h pathnames.h xmalloc.h sshbuf.h log.h ssherr.h misc.h sshkey.h authfd.h atomicio.h ssh-pkcs11.h ssh-pkcs11-helper.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshbuf.h log.h ssherr.h misc.h sshkey.h authfd.h ssh-pkcs11.h ssh-pkcs11.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/bsd-sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h sshkey.h ssh-pkcs11.h diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index f530d2fa7d85..0fa2d34f883f 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -24,8 +24,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - - name: autoreconf - run: sh -c autoreconf - name: start DragonFlyBSD ${{ matrix.target }} VM uses: vmactions/dragonflybsd-vm@4ba8127bd95c94b66fc4b885e37c99955ba308ea # v1 @@ -33,7 +31,7 @@ jobs: release: ${{ matrix.target }} usesh: true prepare: | - timeout 600 pkg install -y sudo || pkg install -y sudo + pkg install -y autoconf automake bash cmake git ninja python3 sudo pw useradd builder -m echo "builder ALL=(ALL:ALL) NOPASSWD: ALL" >>/usr/local/etc/sudoers mkdir -p /var/empty /usr/local/etc @@ -61,15 +59,7 @@ jobs: run: cd $GITHUB_WORKSPACE && sudo -u builder bash ./oqs-test/run_tests.sh - name: Ensure we have the ssh and sshd syntax right once for each algorithm shell: dragonflybsd {0} - run: cd $GITHUB_WORKSPACE && sudo -u builder make clean - - name: "PAM: make" - shell: dragonflybsd {0} - run: cd $GITHUB_WORKSPACE && sudo -u builder make -j4 - - name: "PAM: make t-exec" - shell: dragonflybsd {0} - run: | - cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo SSHD_CONFOPTS="UsePam yes" make t-exec + run: cd $GITHUB_WORKSPACE && sudo -u builder python3 oqs-test/try_connection.py doone freebsd: name: "freebsd-${{ matrix.target }}" @@ -86,8 +76,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - - name: autoreconf - run: sh -c autoreconf - name: start FreeBSD ${{ matrix.target }} VM uses: vmactions/freebsd-vm@b84ab5559b5a1bb4b8ee2737d2506a16e1737636 # v1 @@ -95,20 +83,8 @@ jobs: release: ${{ matrix.target }} usesh: true prepare: | - case $(uname -r) in - 12.*) - timeout 600 ftp ftp://ftp.sudo.ws/pub/sudo/sudo-1.8.32.tar.gz || \ - ftp ftp://ftp.sudo.ws/pub/sudo/sudo-1.8.32.tar.gz - tar xfz sudo-1.8.32.tar.gz - (cd sudo-1.8.32 && ./configure --sysconfdir=/usr/local/etc && make && make install) - ;; - *) - timeout 600 pkg install -y sudo || pkg install -y sudo - ;; - esac - openssl rand -base64 9 >$GITHUB_WORKSPACE/regress/password - pw useradd builder -m -h0 <$GITHUB_WORKSPACE/regress/password - chown builder $GITHUB_WORKSPACE/regress/password + pkg install -y autoconf automake bash cmake git ninja python3 sudo + pw useradd builder -m echo "builder ALL=(ALL:ALL) NOPASSWD: ALL" >>/usr/local/etc/sudoers mkdir -p /var/empty /usr/local/etc cp $GITHUB_WORKSPACE/moduli /usr/local/etc/moduli @@ -126,28 +102,13 @@ jobs: shell: freebsd {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo make tests SKIP_LTESTS=scp3 - - - name: "PAM: configure" + sudo -u builder env VMCI=true WITH_OPENSSL=true bash ./oqs-scripts/build_openssh.sh + - name: Run tests documented to pass shell: freebsd {0} run: cd $GITHUB_WORKSPACE && sudo -u builder bash ./oqs-test/run_tests.sh - name: Ensure we have the ssh and sshd syntax right once for each algorithm shell: freebsd {0} - run: cd $GITHUB_WORKSPACE && sudo -u builder make clean - - name: "PAM: make" - shell: freebsd {0} - run: cd $GITHUB_WORKSPACE && sudo -u builder make -j4 - - name: "PAM: make t-exec UsePAM=no" - shell: freebsd {0} - run: | - cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo make t-exec SKIP_LTESTS=scp3 - - name: "PAM: make t-exec UsePAM=yes" - shell: freebsd {0} - run: | - cd $GITHUB_WORKSPACE - cp regress/password regress/kbdintpw - sudo -u builder env SUDO=sudo TEST_SSH_SSHD_CONFOPTS="UsePam yes" make t-exec SKIP_LTESTS=scp3 + run: cd $GITHUB_WORKSPACE && sudo -u builder python3 oqs-test/try_connection.py doone netbsd: @@ -166,8 +127,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - - name: autoreconf - run: sh -c autoreconf - name: start NetBSD ${{ matrix.target }} VM uses: vmactions/netbsd-vm@99816dccf75edf233ed6cd00a159e3a5b85ea373 # v1 @@ -177,13 +136,8 @@ jobs: sync: scp copyback: false prepare: | - case "$(uname -r)" in - 9.*) export PKG_PATH="ftp://ftp.NetBSD.org/pub/pkgsrc/packages/NetBSD/$(uname -p)/9.0_2026Q1/All" ;; - esac - timeout 600 /usr/sbin/pkg_add sudo || /usr/sbin/pkg_add sudo - openssl rand -base64 9 >$GITHUB_WORKSPACE/regress/password - pw=$(tr -d '\n' <$GITHUB_WORKSPACE/regress/password | pwhash) - /usr/sbin/useradd -m -p "${pw}" builder + /usr/sbin/pkg_add -U autoconf automake bash cmake git ninja-build pcre2 python311 sudo + /usr/sbin/useradd -m builder echo "builder ALL=(ALL:ALL) NOPASSWD: ALL" >>/usr/pkg/etc/sudoers mkdir -p /var/empty /usr/local/etc cp $GITHUB_WORKSPACE/moduli /usr/local/etc/moduli @@ -192,28 +146,34 @@ jobs: shell: netbsd {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo make tests - - - name: "PAM: configure" - shell: netbsd {0} - run: cd $GITHUB_WORKSPACE && sudo -u builder ./configure --with-pam - - name: "PAM: make clean" + /sbin/chown -R builder . + sudo -u builder bash ./oqs-scripts/clone_liboqs.sh + - name: Build liboqs shell: netbsd {0} - run: cd $GITHUB_WORKSPACE && sudo -u builder make clean - - name: "PAM: make" + run: | + cd $GITHUB_WORKSPACE + /sbin/chown -R builder . + sudo -u builder bash ./oqs-scripts/build_liboqs.sh + - name: Build OpenSSH shell: netbsd {0} - run: cd $GITHUB_WORKSPACE && sudo -u builder make -j4 - - name: "PAM: make t-exec UsePAM=no" + run: | + cd $GITHUB_WORKSPACE + /sbin/chown -R builder . + sudo -u builder env VMCI=true WITH_OPENSSL=true bash ./oqs-scripts/build_openssh.sh + - name: Run tests documented to pass shell: netbsd {0} + # TODO: Investigate further ssh-tty regression test for netbsd. run: | cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo make t-exec - - name: "PAM: make t-exec UsePAM=yes" + /sbin/chown -R builder . + sed 's/SKIPPED_DUE_TO_CERTIFIED_KEYS}"/SKIPPED_DUE_TO_CERTIFIED_KEYS} ssh-tty"/' \ + ./oqs-test/run_tests.sh | sudo -u builder bash + - name: Ensure we have the ssh and sshd syntax right once for each algorithm shell: netbsd {0} run: | cd $GITHUB_WORKSPACE - cp regress/password regress/kbdintpw - sudo -u builder env SUDO=sudo TEST_SSH_SSHD_CONFOPTS="UsePam yes" make t-exec + /sbin/chown -R builder . + sudo -u builder /usr/pkg/bin/python3.11 oqs-test/try_connection.py doone omnios: @@ -229,8 +189,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - - name: autoreconf - run: sh -c autoreconf - name: start OmniOS ${{ matrix.target }} VM uses: vmactions/omnios-vm@7f2be0b927aad1a78498c8aeeac4c4ce1fabd322 # v1 @@ -239,10 +197,8 @@ jobs: usesh: true prepare: | set -x - if [ ! -x $(which gcc 2>/dev/null) ]; then - timeout 900 pfexec pkg refresh || pfexec pkg refresh - timeout 900 pfexec pkg install build-essential || pfexec pkg install build-essential - fi + pfexec pkg refresh + pfexec pkg install autoconf automake bash build-essential cmake git ninja runtime/python-311 useradd -m builder sed -e "s/^root.*ALL$/root ALL=(ALL) NOPASSWD: ALL/" /etc/sudoers >>/tmp/sudoers mv /tmp/sudoers /etc/sudoers @@ -298,8 +254,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - - name: autoreconf - run: sh -c autoreconf - name: start OpenBSD ${{ matrix.target }} VM uses: vmactions/openbsd-vm@18edb32f4e48dae5865d7b8b3a9587bc01218a20 # v1 @@ -373,14 +327,15 @@ jobs: "20022": "22" usesh: true prepare: | - timeout 600 pkg_add git || pkg_add git - useradd -g wobj -m builder + pkg_add git cmake ninja bash python%3 autoconf%2.71 automake%1.16 + useradd -m builder echo "permit nopass keepenv root" >/etc/doas.conf echo "permit nopass keepenv builder" >>/etc/doas.conf ls -l /etc/doas.conf chown root:wheel /etc/doas.conf chmod 644 /etc/doas.conf - touch /etc/ssh/ssh_known_hosts + mkdir -p /var/empty /usr/local/etc + cp $GITHUB_WORKSPACE/moduli /usr/local/etc/moduli - name: fetch sysupgrade version run: | @@ -439,14 +394,16 @@ jobs: shell: openbsd {0} # TODO: Investigate further ssh-tty regression test for openbsd. run: | - rsync -a openbsd:/usr/obj/regress/usr.bin/ssh/ regress-logs/ - for i in regress-logs/failed*.log; do echo ===; echo LOGFILE: $i; echo ===; cat $i; echo; done - - name: save logs - if: failure() - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # main - with: - name: openbsd-current-upstream-logs - path: regress-logs/*.log + cd $GITHUB_WORKSPACE + chown -R builder . + sed 's/SKIPPED_DUE_TO_CERTIFIED_KEYS}"/SKIPPED_DUE_TO_CERTIFIED_KEYS} ssh-tty"/' \ + ./oqs-test/run_tests.sh | doas -u builder bash + - name: Ensure we have the ssh and sshd syntax right once for each algorithm + shell: openbsd {0} + run: | + cd $GITHUB_WORKSPACE + chown -R builder . + doas -u builder python3 oqs-test/try_connection.py doone solaris: @@ -462,8 +419,6 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # main - - name: autoreconf - run: sh -c autoreconf - name: start Solaris ${{ matrix.target }} VM uses: vmactions/solaris-vm@d30dd6c228c8661ade859e36ead7660b9a62efcc # v1 @@ -471,13 +426,8 @@ jobs: release: ${{ matrix.target }} usesh: true prepare: | - echo Setting up user builder. - useradd -m builder - openssl rand -base64 9 >$GITHUB_WORKSPACE/regress/password - chown builder $GITHUB_WORKSPACE/regress/password - pw=$(tr -d '\n' <$GITHUB_WORKSPACE/regress/password | openssl passwd -6 -stdin) - passwd -p "$pw" builder - echo Setting up sudo. + set -x + id -u builder >/dev/null 2>&1 || useradd -m builder sed -e "s/^root.*ALL$/root ALL=(ALL) NOPASSWD: ALL/" /etc/sudoers >>/tmp/sudoers mv /tmp/sudoers /etc/sudoers echo "builder ALL=(ALL) NOPASSWD: ALL" >/etc/sudoers.d/builder @@ -493,25 +443,28 @@ jobs: shell: solaris {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo make tests - - - name: "PAM: configure" - shell: solaris {0} - run: cd $GITHUB_WORKSPACE && sudo -u builder ./configure --with-pam - - name: "PAM: make clean" - shell: solaris {0} - run: cd $GITHUB_WORKSPACE && sudo -u builder make clean - - name: "PAM: make" + chown -R builder . + sudo -u builder bash ./oqs-scripts/clone_liboqs.sh + - name: Build liboqs shell: solaris {0} - run: cd $GITHUB_WORKSPACE && sudo -u builder make - - name: "PAM: make t-exec UsePAM=no" + run: | + cd $GITHUB_WORKSPACE + chown -R builder . + sudo -u builder env LIBOQS_CMAKE_ARGS="-DOQS_PERMIT_UNSUPPORTED_ARCHITECTURE=ON" \ + bash ./oqs-scripts/build_liboqs.sh + - name: Build OpenSSH shell: solaris {0} run: | cd $GITHUB_WORKSPACE - sudo -u builder env SUDO=sudo make t-exec - - name: "PAM: make t-exec UsePAM=yes" + chown -R builder . + sed 's/make -j2/make -j 2/g' ./oqs-scripts/build_openssh.sh | + sudo -u builder env VMCI=true WITH_OPENSSL=true bash + - name: Run tests documented to pass + shell: solaris {0} + run: cd $GITHUB_WORKSPACE && chown -R builder . && sudo -u builder bash ./oqs-test/run_tests.sh + - name: Ensure we have the ssh and sshd syntax right once for each algorithm shell: solaris {0} run: | cd $GITHUB_WORKSPACE - cp regress/password regress/kbdintpw - sudo -u builder env SUDO=sudo TEST_SSH_SSHD_CONFOPTS="UsePam yes" make t-exec + chown -Rf builder . + sudo -u builder python3 oqs-test/try_connection.py doone diff --git a/.gitignore b/.gitignore index 907533067c8b..c71cf5c4fca6 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,9 @@ sshd-auth !regress/unittests/**/Makefile tags +# Added by OQS +oqs-test/tmp +oqs-scripts/tmp +oqs/ +*.dSYM +__pycache__ diff --git a/ChangeLog b/ChangeLog index 8d71745072ca..c02c7b42cc84 100644 --- a/ChangeLog +++ b/ChangeLog @@ -11145,3 +11145,18256 @@ Date: Sun Jul 7 18:46:19 2024 +1000 Cast to sockaddr * in systemd interface. Fixes build with musl libx. bz#3707. + +commit 30c8c81da2169e78357d08dbb0ddd823b60e93bc +Author: Darren Tucker +Date: Thu Jul 4 20:12:26 2024 +1000 + + Add 9.8 branch to ci-status page. + +commit ee6b9e661633fcefd29dba0c811cecbc4d027f6f +Author: Samuel Thibault +Date: Tue Mar 26 22:15:08 2024 +0100 + + Fix detection of setres*id on GNU/Hurd + + Like Linux, proper _SOURCE macros need to be set to get declarations of + various standard functions, notably setres*id. Now that Debian is using + -Werror=implicit-function-declaration this is really required. While at + it, define other _SOURCE macros like on GNU/Linux, since GNU/Hurd uses + the same glibc. + +commit fa41f6592ff1b6ead4a652ac75af31eabb05b912 +Author: Damien Miller +Date: Mon Jul 1 14:33:26 2024 +1000 + + version numbers + +commit bfebb8a5130a792c5356bd06e1ddef72a0a0449f +Author: djm@openbsd.org +Date: Mon Jul 1 04:31:59 2024 +0000 + + upstream: openssh-9.8 + + OpenBSD-Commit-ID: 5f8b89e38a4c5f7c6d52ffa19f796d49f36fab19 + +commit 146c420d29d055cc75c8606327a1cf8439fe3a08 +Author: djm@openbsd.org +Date: Mon Jul 1 04:31:17 2024 +0000 + + upstream: when sending ObscureKeystrokeTiming chaff packets, we + + can't rely on channel_did_enqueue to tell that there is data to send. This + flag indicates that the channels code enqueued a packet on _this_ ppoll() + iteration, not that data was enqueued in _any_ ppoll() iteration in the + timeslice. ok markus@ + + OpenBSD-Commit-ID: 009b74fd2769b36b5284a0188ade182f00564136 + +commit 637e4dfea4ed81264e264b6200172ce319c64ead +Author: djm@openbsd.org +Date: Mon Jul 1 03:10:19 2024 +0000 + + upstream: use "lcd" to change directory before "lls" rather then "cd", + + since the directory we're trying to list is local. Spotted by Corinna + Vinschen + + OpenBSD-Regress-ID: 821feca4a4bebe491944e624c8f7f2990b891415 + +commit c8cfe258cee0b8466ea84597bf15e1fcff3bc328 +Author: djm@openbsd.org +Date: Thu Jun 27 23:01:15 2024 +0000 + + upstream: delete obsolete comment + + OpenBSD-Commit-ID: 5fb04f298ed155053f3fbfdf0c6fe7cdf84bbfa2 + +commit 94b9d37100f6fa536aaa1d1a0e4926fe44fbf04d +Author: djm@openbsd.org +Date: Thu Jun 27 22:36:44 2024 +0000 + + upstream: retire unused API + + OpenBSD-Commit-ID: 3e30d7b0615e2707f6bbe70f61b1c2f72f78161b + +commit 268c3a7f5783e731ed60f4e28da66ee3743581d3 +Author: jmc@openbsd.org +Date: Thu Jun 27 21:02:16 2024 +0000 + + upstream: ssl(8) no longer contains a HISTORY section; + + OpenBSD-Commit-ID: 83b7ff34433d79595e9c2a5d2a561a6660251245 + +commit 12b6cc09ce6c430681f03af2a8069e37a664690b +Author: djm@openbsd.org +Date: Wed Jun 26 23:47:46 2024 +0000 + + upstream: move child process waitpid() loop out of SIGCHLD handler; + + ok deraadt + + OpenBSD-Commit-ID: 65815a39564e431414aed7c5ace8076f4e9ca741 + +commit d6bcd13297c2ab8b528df5a6898f994734849031 +Author: deraadt@openbsd.org +Date: Wed Jun 26 23:16:52 2024 +0000 + + upstream: Instead of using possibly complex ssh_signal(), write all + + the parts of the grace_alarm_handler() using the exact things allowed by the + signal-safe rules. This is a good rule of thumb: Handlers should be written + to either set a global volatile sig_atomic_t inspected from outside, and/or + directly perform only safe operations listed in our sigaction(2) manual page. + ok djm markus + + OpenBSD-Commit-ID: 14168ae8368aab76e4ed79e17a667cb46f404ecd + +commit b8793e2b0851f7d71b97554fa5260b23796d6277 +Author: deraadt@openbsd.org +Date: Wed Jun 26 23:14:14 2024 +0000 + + upstream: save_errno wrappers inside two small signal handlers that + + perform system calls, for systems with libc that do perform libc sigtramps. + ok djm markus + + OpenBSD-Commit-ID: 7749b56419a7c9dcfe4c6c04811e429813346c62 + +commit f23e9332c4c8df37465c4a4f38275ea98980ed7e +Author: jmc@openbsd.org +Date: Mon Jun 24 06:59:39 2024 +0000 + + upstream: - uppercase start of sentence - correct sentence grammar + + ok djm + + OpenBSD-Commit-ID: 1ec4b0fdb633a43667f2c8fff1d600bd647dde25 + +commit 1839e3eb71a759aa795602c1e4196300f4ac2615 +Author: djm@openbsd.org +Date: Mon Jun 24 04:05:11 2024 +0000 + + upstream: mention SshdSessionPath option + + OpenBSD-Commit-ID: c29734d36c21003973b15c1c9965c35f36cef30c + +commit 603193e32aef5db7d60c58066d5de89806e79312 +Author: Darren Tucker +Date: Thu Jun 20 18:45:14 2024 +1000 + + Rerun upstream tests on .sh file changes too. + +commit dbbf9337c19381786a8e5a8a49152fe6b80c780d +Author: dtucker@openbsd.org +Date: Thu Jun 20 08:23:18 2024 +0000 + + upstream: Work around dbclient cipher/mac query bug. + + Unlike earlier versions, recent Dropbear (at least v2024.85) requires + a host arg when querying supported ciphers and macs via "-c/-m + help". Earlier versions accept but do not require it, so always + provide it. If these queries fail, skip the test with a warning. + + OpenBSD-Regress-ID: 98eb863a3f0363416922efb273885e6b3c7f68d4 + +commit 8de2c8cebc46bbdb94b7a2c120fcadfb66a3cccc +Author: dtucker@openbsd.org +Date: Thu Jun 20 08:18:34 2024 +0000 + + upstream: Remove dropbear key types not supported + + by current OpenSSH. Allows subsequent test runs to work if OpenSSH is + rebuilt w/out OpenSSL. + + OpenBSD-Regress-ID: e0129eb2b1d31771105903a8055216fbba20a770 + +commit e9b6471c59b21e5d9ef1b3832d4bf727338add85 +Author: djm@openbsd.org +Date: Thu Jun 20 00:18:05 2024 +0000 + + upstream: stricter check for overfull tables in penalty record path + + OpenBSD-Commit-ID: 7df01e648a0723418c554e64a9f2b6d38db060a6 + +commit d9336d344eb2a1e898c5e66147b3f108c7214694 +Author: djm@openbsd.org +Date: Wed Jun 19 23:24:47 2024 +0000 + + upstream: put back reaping of preauth child process when writes + + from the monitor fail. Not sure how this got lost in the avalanche of + patches. + + OpenBSD-Commit-ID: eb7eb36371e1ac01050b32b70fb2b3e5d98e72f5 + +commit 579d9adb70ec0206a788eb5c63804c31a67e9310 +Author: naddy@openbsd.org +Date: Mon Jun 17 13:50:18 2024 +0000 + + upstream: remove one more mention of DSA + + OpenBSD-Commit-ID: 8515f55a15f02836ba657df341415f63c60526ca + +commit 7089b5f8436ef0b8d3d3ad9ce01045fb9e7aab15 +Author: Darren Tucker +Date: Wed Jun 19 23:09:05 2024 +1000 + + Move -f to the place needed to restart sshd. + +commit d5f83cfd852b14a25f347f082ab539a9454702ad +Author: Darren Tucker +Date: Wed Jun 19 21:04:01 2024 +1000 + + Need to supply "-f" to restart sshd. + +commit fad34b4ca25c0ef31e5aa841d461b6f21da5b8c1 +Author: dtucker@openbsd.org +Date: Wed Jun 19 10:15:51 2024 +0000 + + upstream: Provide defaults for ciphers and macs + + if querying for them fails since on some versions of Dropbear (at least + v2024.85) "-m help" doesn't seem to work. Enable all supported pubkey + algorithms in the server. + + OpenBSD-Regress-ID: 4f95556a49ee9f621789f25217c367a33d2745ca + +commit 5521060e35ada9f957cecdddc06d0524e75409ef +Author: dtucker@openbsd.org +Date: Wed Jun 19 10:10:46 2024 +0000 + + upstream: Use ed25519 keys for kex tests + + since that's supported by OpenSSH even when built without OpenSSL. + Only test diffie-hellman kex if OpenSSH is compiled with support for it. + + OpenBSD-Regress-ID: a5d09ef9bbd171f9e4ec73ed0d9eeb49a8878e97 + +commit dbd3b833f6e3815e58f2dc6e14f61a51bcd4d6bd +Author: dtucker@openbsd.org +Date: Wed Jun 19 10:08:34 2024 +0000 + + upstream: Rework dropbear key setup + + to always generate ed25519 keys, other types only if OpenSSH has support + for the corresponding key type. + + OpenBSD-Regress-ID: 8f91f12604cddb9f8d93aa34f3f93a3f6074395d + +commit d6218504e11ae9148adf410fc69b0710a052be36 +Author: Darren Tucker +Date: Wed Jun 19 20:20:24 2024 +1000 + + Restart sshd after installing it for testing. + + When installing an sshd built without OpenSSL the mismatch between + the running sshd and newly installed sshd-session will cause the + remainder of the test to fail. + +commit 786a4465b6bb702daf4fb17b7c3bcb42b52f0b46 +Author: Darren Tucker +Date: Tue Jun 18 19:59:59 2024 +1000 + + Remove macos-11 runner. + + Github is retiring them soon. + +commit df1c72a55edbebac14363b57de66ac6a147ecc67 +Author: Damien Miller +Date: Wed Jun 19 09:34:34 2024 +1000 + + PAMServiceName may appear in a Match block + +commit de1c2e70e5a5dc3c8d2fe04b24cc93d8ef6930e7 +Author: dtucker@openbsd.org +Date: Tue Jun 18 08:11:48 2024 +0000 + + upstream: Re-enable ssh-dss tests + + ... if ssh is compiled with DSA support + + OpenBSD-Regress-ID: bbfaf8c17f2b50a2d46ac35cb97af99b990c990d + +commit dabc2c7cf3c141e8e5d5a1a60d6c1d2d2422cf43 +Author: anton@openbsd.org +Date: Tue Jun 18 06:14:27 2024 +0000 + + upstream: Stop using DSA in dropbear interop tests. + + OpenBSD-Regress-ID: abfd4457d99d8cc1417fd22ca2c570270f74c1cf + +commit 761438012710169445acc179e3870c53c862bda0 +Author: Damien Miller +Date: Tue Jun 18 12:29:45 2024 +1000 + + missed a bit of DSA in the fuzzer + +commit 3f9cc47da588e8de520720e59f98438043fdaf93 +Author: Damien Miller +Date: Tue Jun 18 09:35:53 2024 +1000 + + DSA support is disabled, so remove from fuzzers + +commit 00eb95957dea5484b2c7c043f7d2bbc87301bef2 +Author: djm@openbsd.org +Date: Mon Jun 17 08:30:29 2024 +0000 + + upstream: disable the DSA signature algorithm by default; ok + + markus@ + + (yes, I know this expands to "the Digitial Signature Algorithm + signature algorithm) + + OpenBSD-Commit-ID: 961ef594e46dd2dcade8dd5721fa565cee79ffed + +commit 5603befe11c9464ea26fe77cbacc95a7cc0b1ea7 +Author: djm@openbsd.org +Date: Mon Jun 17 08:28:31 2024 +0000 + + upstream: promote connection-closed messages from verbose to info + + log level; they could be the only record of the connection terminating if the + client doesn't send a SSH2_MSG_DISCONNECT message. ok dtucker@ + + OpenBSD-Commit-ID: 0c8bfaf5e9fdff945cee09ac21e641f6c5d65d3c + +commit b00331402fe5c60d577f3ffcc35e49286cdc6b47 +Author: Damien Miller +Date: Mon Jun 17 17:02:18 2024 +1000 + + propagate PAM crashes to PerSourcePenalties + + If the PAM subprocess crashes, exit with a crash status that will be + picked up by the sshd(8) listener process where it can be used by + PerSourcePenalties to block the client. This is similar handling to + the privsep preauth process. + +commit 1c207f456ace38987deda047758d13fbf857f948 +Author: Damien Miller +Date: Mon Jun 17 15:06:01 2024 +1000 + + minix doesn't have loopback, so skip penalty tests + + pointed out by dtucker@ + +commit 48443d202eaec52d4d39defdd709a4499a7140c6 +Author: djm@openbsd.org +Date: Sun Jun 16 11:54:49 2024 +0000 + + upstream: same treatment for this test + + OpenBSD-Regress-ID: d0cc9efca7833e673ea7b0cb3a679a3acee8d4c7 + +commit 45562a95ea11d328c22d97bf39401cd29684fb1f +Author: djm@openbsd.org +Date: Sun Jun 16 08:18:06 2024 +0000 + + upstream: penalty test is still a bit racy + + OpenBSD-Regress-ID: 90c9ac224db454637baf1ebee5857e007321e824 + +commit 8d0f7eb147ef72d18acb16c0b18672d44941a8ca +Author: djm@openbsd.org +Date: Sat Jun 15 03:59:10 2024 +0000 + + upstream: crank up penalty timeouts so this should work on even the + + slowest of test builders + + OpenBSD-Regress-ID: 70bda39c83e3fc9d0f3c1fad4542ed33e173d468 + +commit 93c75471a1202ab3e29db6938648d4e2602c0475 +Author: jmc@openbsd.org +Date: Fri Jun 14 05:20:34 2024 +0000 + + upstream: sort -q in the options list; + + OpenBSD-Commit-ID: 6839b38378f38f754de638a5e988c13b4164cc7c + +commit dd7807bbe80a93ffb4616f2bd5cf83ad5a5595fb +Author: djm@openbsd.org +Date: Fri Jun 14 05:01:22 2024 +0000 + + upstream: clarify KEXAlgorithms supported vs available. Inspired by + + bz3701 from Colin Watson. + + OpenBSD-Commit-ID: e698e69bea19bd52971d253f2b1094490c4701f7 + +commit d172ad56df85b68316dbadbedad16761a1265874 +Author: djm@openbsd.org +Date: Fri Jun 14 05:00:42 2024 +0000 + + upstream: ssh-keyscan -q man bits + + OpenBSD-Commit-ID: ba28d0e1ac609a4c99c453e57e86560c79079db1 + +commit 092e4ff9ccaacbe035f286feb1b56ed499604743 +Author: Damien Miller +Date: Fri Jun 14 14:46:35 2024 +1000 + + skip penalty-expire test in valgrind test env + +commit 2866ad08a9c50d7b67ce9424ca990532b806a21a +Author: djm@openbsd.org +Date: Fri Jun 14 04:43:11 2024 +0000 + + upstream: split the PerSourcePenalties test in two: one tests penalty + + enforcement but not penalty expiry, the other tests penalty expiry. + + This lets us disable the expiry testing in certain CI test environments. + + OpenBSD-Regress-ID: f56811064f3e3cb52ee73a206b8c2a06af1c8791 + +commit b2c64bc170d75823622a37cab3ca1804ca87ad16 +Author: Damien Miller +Date: Fri Jun 14 14:19:23 2024 +1000 + + add a sshd_config PamServiceName option + + Allows selecting which PAM service name to use when UsePAM is + enabled. Defaults to "sshd" unless overridden at compile time + by defining SSHD_PAM_SERVICE. + + bz2102, ok dtucker@ + +commit 9f032a4dd17bf0ae6066223d82aa5e784285d987 +Author: djm@openbsd.org +Date: Fri Jun 14 00:26:12 2024 +0000 + + upstream: don't redirect stderr for ssh-keyscan we expect to succeed + + OpenBSD-Regress-ID: 8878b8eb4e070ed2e343166d3eb86db4a08a216c + +commit 1e84d0cf40e94ae3a77d6a7ca8c036d8e3d55a40 +Author: djm@openbsd.org +Date: Fri Jun 14 00:25:25 2024 +0000 + + upstream: make host/banner comments go to stderr instead of stdout, + + so they are useful as comments without extra shell redirection and so they + don't clutter actual errors on stderr. + + Add a -q flag to shut them up. + + ok dtucker@ + + OpenBSD-Commit-ID: bec813de56a71adb5c1a76adcf49621130d24264 + +commit 3e806d011855d6bd648ec95b9df630ebbd11c3bf +Author: naddy@openbsd.org +Date: Thu Jun 13 15:06:33 2024 +0000 + + upstream: separate keywords with comma + + OpenBSD-Commit-ID: d65a99666202a8188c4991c18d14374a229f7be5 + +commit abfd1f7a3cbd0a92581a0febba254b2f6649c0d9 +Author: djm@openbsd.org +Date: Fri Jun 14 00:23:55 2024 +0000 + + upstream: specify an algorithm for ssh-keyscan, otherwise it will make + + multiple attempts simultaneously and confuse the test + + OpenBSD-Regress-ID: 6e910f3315c4345053db1bf5cbf61826b194d0b9 + +commit a8fbe2f7d0d96d299ee8e69769e3b51067978748 +Author: Damien Miller +Date: Thu Jun 13 16:41:29 2024 +1000 + + sshd: don't use argv[0] as PAM service name + + sshd would implicitly use argv[0] as the PAM service name to + allow people to select different PAM service names by making + differently-named copies/links to the sshd binary. + + Splitting sshd into sshd/sshd-session broke this, as the process + that starts PAM is always sshd-session and the user has no control + over this. + + Hardcode "sshd" as the default PAM service name unless/until we + figure out a better way. Should unbreak OSX integration tests. + +commit bf204bd05c3ae650f87e2b96527688579f59774c +Author: Damien Miller +Date: Thu Jun 13 15:00:28 2024 +1000 + + prepare for checking in autogenerated files + + We plan to check in automatically generated files (config.h.in, etc) on + release branches. These files are normally ignored by .gitignore, but + this shuffles the contents of this file to make it easy to un-ignore + them. + +commit 425f79a837489904c343b349ef00e09aeaa4e752 +Author: Damien Miller +Date: Thu Jun 13 14:41:33 2024 +1000 + + typo in comment + +commit afe10313c1fa8d478af399ee7d54c8f85503013b +Author: Damien Miller +Date: Thu Jun 13 14:35:25 2024 +1000 + + fix PTY allocation on Cygwin, broken by sshd split + + Cygwin doesn't support FD passing and so used to disable post-auth + privilege separation entirely because privsep requires PTY allocation + to happen in the privileged monitor process with the PTY file + descriptors being passed back to the unprivileged process. + + This brings back a minimal version of the previous special treatment + for Cygwin (and any other platform that sets DISABLE_FD_PASSING): + privilege separation remains enabled, but PTY allocation happens in + the post-auth user process rather than the monitor. + + This either requires PTY allocation to not need privilege to begin + with (this appears to be the case on Cygwin), or the post-auth + privsep process retain privilege (other platforms that set the + DISABLE_FD_PASSING option). + + Keeping privileges here is bad, but the non-Cygwin systems that set + DISABLE_FD_PASSING are so deeply legacy that this is likely to be the + least of their problems. + +commit f66d4df5749551380a8c4ae642347675a0b6a2e9 +Author: Damien Miller +Date: Thu Jun 13 11:33:09 2024 +1000 + + delay lookup of privsep user until config loaded + + sshd-session attempting to use options.kerberos_authentication to + decide whether it needed to lookup the privsep user before the + configuration was loaded. This caused it to get a placeholder value + that caused it always to try to lookup the privsep user, breaking at + least one test environment. + +commit f1c42858b94f5d9b58867b34dce3afb39c6b56a8 +Author: Damien Miller +Date: Thu Jun 13 11:16:57 2024 +1000 + + missing file for PerSourcePenalties regress test + +commit 4de80ff4e6fab5a6bb0028e7d57c6c23d1485adb +Author: djm@openbsd.org +Date: Wed Jun 12 22:36:00 2024 +0000 + + upstream: split PerSourcePenalties address tracking. Previously it + + used one shared table and overflow policy for IPv4 and IPv6 addresses, now it + will use separate tables and optionally different overflow policies. + + This prevents misbehaviour from IPv6 addresses (which are vastly easier + to obtain many of) from affecting IPv4 connections and may allow for + stricter overflow policies. + + ok deraadt@ + + OpenBSD-Commit-ID: 12637ed0aa4d5f1f3e702da42ea967cbd8bfdfd9 + +commit 06ab4c6931b0aaa4334db2faaa7e1069e76d0df6 +Author: jmc@openbsd.org +Date: Tue Jun 11 05:24:39 2024 +0000 + + upstream: do not mark up "(default: 20ms)"; + + OpenBSD-Commit-ID: 54151ecdecfa1b67dcdda4fd24826ef6e2148ad4 + +commit cfe243cd9fde148ed060637876e27bb55ac78be9 +Author: djm@openbsd.org +Date: Tue Jun 11 02:54:51 2024 +0000 + + upstream: reap preauth net child if it hangs up during privsep message + + send, not just message receive + + OpenBSD-Commit-ID: 02a093f4ab4f8f83f0cd1ea2bb35b9ca420448f0 + +commit b0a711c00b9c64afd1c9d6fb538275c6604a2676 +Author: djm@openbsd.org +Date: Tue Jun 11 01:58:27 2024 +0000 + + upstream: fix PIDFILE handling, broken for SUDO=doas in last commit + + here + + OpenBSD-Regress-ID: 96fec579af228f87a036e94801eb294af9074625 + +commit 90fb801e2d9241be50a2a7ff79428386442a041f +Author: djm@openbsd.org +Date: Tue Jun 11 02:00:30 2024 +0000 + + upstream: reap the pre-auth [net] child if it hangs up during privsep + + message sending, not just receiving + + OpenBSD-Commit-ID: f7341605bf08c4c15830910446e6775323f2f8cb + +commit ef878d58798f6688c7f4d4e417dc0c29023ea831 +Author: djm@openbsd.org +Date: Tue Jun 11 01:23:25 2024 +0000 + + upstream: a little more RB_TREE paranoia + + OpenBSD-Commit-ID: 8dc2fd21eebd8830c4a4d25461ac4fe228e11156 + +commit fc4e96b2174d6a894d2033421699d091679baced +Author: djm@openbsd.org +Date: Tue Jun 11 01:22:25 2024 +0000 + + upstream: fix off-by-one comparison for PerSourcePenalty + + OpenBSD-Commit-ID: af4f5d01c41ef870b23e55655bfbf73474a6c02b + +commit 82c836df4ff41145553cd7adb11c5b985aeaa06f +Author: djm@openbsd.org +Date: Tue Jun 11 01:21:41 2024 +0000 + + upstream: move tree init before possible early return + + OpenBSD-Commit-ID: 72e2c5b69f151c08a7c5bf5ad929b97a92c273df + +commit a2300f015cc4939c4d9c564b58b74e71202dc978 +Author: djm@openbsd.org +Date: Tue Jun 11 01:07:35 2024 +0000 + + upstream: update to mention that PerSourcePenalties default to + + being enabled and document the default values for each parameter. + + OpenBSD-Commit-ID: b981288bddfb097aad269f62df4081c688ce0034 + +commit 41987efd356d3fc30139aeab4b09374acf8f91a0 +Author: djm@openbsd.org +Date: Tue Jun 11 00:44:52 2024 +0000 + + upstream: reap the [net] child if it hangs up while writing privsep + + message payloads, not just the message header + + OpenBSD-Commit-ID: 24dbd400aa381ac96be7ed2dd49018487dfef6ce + +commit 6211aa085fa91155a24922e5329576ac9a8f3175 +Author: djm@openbsd.org +Date: Tue Jun 11 00:40:21 2024 +0000 + + upstream: log waitpid() status for abnormal exits + + OpenBSD-Commit-ID: b317930e06b51819c1a2bc6a4359764fecfb1c2d + +commit a59634c7adb9ae988748d99963dfafb3070d8d41 +Author: djm@openbsd.org +Date: Tue Jun 11 00:36:20 2024 +0000 + + upstream: correct error message + + OpenBSD-Commit-ID: 581f60f73099083392887206860229ab104620ed + +commit fa7d7a667f2ee031e72873e36de2d2a36bca973b +Author: deraadt@openbsd.org +Date: Fri Jun 7 13:23:30 2024 +0000 + + upstream: avoid shadowing issues which some compilers won't accept + + ok djm + + OpenBSD-Commit-ID: 1e89572397dda83433d58c4fa6333a08f51170d4 + +commit 3ad4cd9eeca5c9bc6706db44b6de88e2e4513fd6 +Author: jmc@openbsd.org +Date: Thu Jun 6 21:14:49 2024 +0000 + + upstream: escape the final dot at eol in "e.g." to avoid double + + spacing; + + OpenBSD-Commit-ID: 0a9fb10bc9f7d577afe2da3f498a08bc431115b9 + +commit 0e0c69761a4c33ccd4a256560f522784a753d1a8 +Author: djm@openbsd.org +Date: Thu Jun 6 20:25:48 2024 +0000 + + upstream: enable PerSourcePenalties by default. + + ok markus + + NB. if you run a sshd that accepts connections from behind large NAT + blocks, proxies or anything else that aggregates many possible users + behind few IP addresses, then this change may cause legitimate traffic + to be denied. + + Please read the PerSourcePenalties, PerSourcePenaltyExemptList and + PerSourceNetBlockSize options in sshd_config(5) for how to tune your + sshd(8) for your specific circumstances. + + OpenBSD-Commit-ID: 24a0e5c23d37e5a63e16d2c6da3920a51078f6ce + +commit bd1f74741daabeaf20939a85cd8cec08c76d0bec +Author: djm@openbsd.org +Date: Thu Jun 6 20:20:42 2024 +0000 + + upstream: mention that PerSourcePenalties don't affect concurrent + + in-progress connections. + + OpenBSD-Commit-ID: 20389da6264f2c97ac3463edfaa1182c212d420c + +commit 9774b938578327d88a651f4c63c504809717590a +Author: djm@openbsd.org +Date: Thu Jun 6 19:49:25 2024 +0000 + + upstream: regress test for PerSourcePenalties + + OpenBSD-Regress-ID: a1af13d411b25a727742644459d26480b9a1b0f1 + +commit b8ebd86cefe9812204a10c028dc90de29918667d +Author: djm@openbsd.org +Date: Thu Jun 6 19:48:40 2024 +0000 + + upstream: make sure logs are saved from sshd run via start_sshd + + OpenBSD-Regress-ID: de4ef0e32e3ab85ff3a6c36eb08d1909c0dd1b4a + +commit d7b2070bdaa4ebbfafb9975c1d5a62b73289d31f +Author: djm@openbsd.org +Date: Thu Jun 6 19:47:48 2024 +0000 + + upstream: simplify + + OpenBSD-Regress-ID: 50316e0d1ae0c0a057a45af042253e54ce23d11c + +commit e6ea3d224513b6bfb93818809d4c7397f5995ba2 +Author: djm@openbsd.org +Date: Thu Jun 6 18:48:13 2024 +0000 + + upstream: prepare for PerSourcePenalties being enabled by default + + in future + + OpenBSD-Regress-ID: 5236c6d1c823997aac5a35e2915da30f1903bec7 + +commit c0cb3b8c837761816a60a3cdb54062668df09652 +Author: djm@openbsd.org +Date: Thu Jun 6 19:50:01 2024 +0000 + + upstream: disable stderr redirection before closing fds + + OpenBSD-Commit-ID: d42cb895ee4542098050367fc35321c9303f003a + +commit 81c1099d22b81ebfd20a334ce986c4f753b0db29 +Author: djm@openbsd.org +Date: Thu Jun 6 17:15:25 2024 +0000 + + upstream: Add a facility to sshd(8) to penalise particular + + problematic client behaviours, controlled by two new sshd_config(5) options: + PerSourcePenalties and PerSourcePenaltyExemptList. + + When PerSourcePenalties are enabled, sshd(8) will monitor the exit + status of its child pre-auth session processes. Through the exit + status, it can observe situations where the session did not + authenticate as expected. These conditions include when the client + repeatedly attempted authentication unsucessfully (possibly indicating + an attack against one or more accounts, e.g. password guessing), or + when client behaviour caused sshd to crash (possibly indicating + attempts to exploit sshd). + + When such a condition is observed, sshd will record a penalty of some + duration (e.g. 30 seconds) against the client's address. If this time + is above a minimum threshold specified by the PerSourcePenalties, then + connections from the client address will be refused (along with any + others in the same PerSourceNetBlockSize CIDR range). + + Repeated offenses by the same client address will accrue greater + penalties, up to a configurable maximum. A PerSourcePenaltyExemptList + option allows certain address ranges to be exempt from all penalties. + + We hope these options will make it significantly more difficult for + attackers to find accounts with weak/guessable passwords or exploit + bugs in sshd(8) itself. + + PerSourcePenalties is off by default, but we expect to enable it + automatically in the near future. + + much feedback markus@ and others, ok markus@ + + OpenBSD-Commit-ID: 89ded70eccb2b4926ef0366a4d58a693de366cca + +commit 916b0b6174e203cf2c5ec9bcf409472eb7ffbf43 +Author: Damien Miller +Date: Fri Jun 7 03:31:02 2024 +1000 + + whitespace + +commit 49b55e44182b8294419aa580cbf043d5b9e3d953 +Author: deraadt@openbsd.org +Date: Tue Jun 4 15:14:45 2024 +0000 + + upstream: enable -fret-clean on amd64, for libc libcrypto ld.so + + kernel, and all the ssh tools. The dynamic objects are entirely ret-clean, + static binaries will contain a blend of cleaning and non-cleaning callers. + + OpenBSD-Commit-ID: 112aacedd3b61cc5c34b1fa6d9fb759214179172 + +commit cc80d51d034bcb24fd0f2564a4bdf1612000a2a2 +Author: Damien Miller +Date: Wed Jun 5 02:21:30 2024 +1000 + + remove PRIVSEP macros for osx + +commit 8785491123d4d722b310c20f383570be758f8263 +Author: djm@openbsd.org +Date: Sat Jun 1 07:03:37 2024 +0000 + + upstream: be really strict with fds reserved for communication with the + + separate sshd-session process - reserve them early and fatal if we can't + dup2(2) them later. The pre-split fallback to re-reading the configuration + files is not possible, so sshd-session absolutely requires the fd the + configuration is passed over to be in order. + + ok deraadt@ + + OpenBSD-Commit-ID: 308a98ef3c8a6665ebf92c7c9a0fc9600ccd7065 + +commit f1c8918cb98459910fb159373baea053ba4108c0 +Author: Damien Miller +Date: Fri May 31 19:12:26 2024 +1000 + + depend + +commit 94b4866cb1f4b0ed29a9f367047b30f81002316f +Author: Damien Miller +Date: Fri May 31 19:11:14 2024 +1000 + + rename need_privsep to need_chroot + + privsep is mandatory, chroot is optional (disabled when running + sshd as non-root) + +commit e68a95142e5024b144f8eeccd5ffdee42c34f44c +Author: Damien Miller +Date: Fri May 31 19:05:34 2024 +1000 + + remove remaining use_privsep mention + +commit b21d271f651d2536dca819cc6d74032fe98634db +Author: djm@openbsd.org +Date: Fri May 31 09:01:08 2024 +0000 + + upstream: warn when -r (deprecated option to disable re-exec) is + + passed + + OpenBSD-Commit-ID: 73145ef5150edbe3ce7889f0844ed8fa6155f551 + +commit a4b5bc246cbca476deeeb4462aa31746a56e3021 +Author: djm@openbsd.org +Date: Fri May 31 08:49:35 2024 +0000 + + upstream: typos + + OpenBSD-Commit-ID: edfa72eb06bfa65da30fabf7d2fe76d2d33f77bf + +commit 8054b906983ceaed01fabd8188d3dac24c05ba39 +Author: djm@openbsd.org +Date: Mon May 27 01:52:26 2024 +0000 + + upstream: don't need sys/queue.h here + + OpenBSD-Commit-ID: dd137396828171eb19e4911581812ca58de6c578 + +commit 210d4239733da6180ce853538aeb9413d5c62ad5 +Author: naddy@openbsd.org +Date: Sun May 26 20:35:12 2024 +0000 + + upstream: remove references to SSH1 and DSA server keys + + OpenBSD-Commit-ID: 57cc1c98d4f998981473734f144b904af7d178a2 + +commit f0b9261d7fdd0ef86806b49fe76344bd16770cd0 +Author: jsg@openbsd.org +Date: Thu May 23 23:47:16 2024 +0000 + + upstream: remove unused struct fwd_perm_list, no decl with complete + + type ok djm@ + + OpenBSD-Commit-ID: 416fb3970b7e73c76d2963c4f00cf96f2b2ee2fb + +commit 2477a98c3ef78e63b11a1393656e00288f52ae97 +Author: naddy@openbsd.org +Date: Wed May 22 15:24:55 2024 +0000 + + upstream: Do not pass -Werror twice when building with clang. + + OpenBSD-Commit-ID: 5f378c38ad8976d507786dc4db9283a879ec8cd0 + +commit 435844f5675245b4271f8581f15e6d1f34fde3bc +Author: miod@openbsd.org +Date: Wed May 22 11:49:36 2024 +0000 + + upstream: Do not pass -Werror if building with gcc 3, for asn1.h + + and bio.h cause (admittedly bogus) warnings with gcc 3. + + OpenBSD-Commit-ID: fb39324748824cb0387e9d67c41d1bef945c54ea + +commit fc5dc092830de23767c6ef67baa18310a64ee533 +Author: djm@openbsd.org +Date: Wed May 22 04:20:00 2024 +0000 + + upstream: this test has been broken since 2014, and has been + + testing the same key exchange algorithm repeatedly instead of testing all of + them. Spotted by nreilly AT blackberry.com in bz3692 + + Who broke the test? me. + + OpenBSD-Regress-ID: 48f4f5946276f975667141957d25441b3c9a50e2 + +commit fd4816791beaed2fdae7eea3e1494d1972b2a39d +Author: anton@openbsd.org +Date: Sun May 19 19:10:01 2024 +0000 + + upstream: Add missing kex-names.c source file required since the + + ssh split. + + OpenBSD-Regress-ID: ca666223f828fc4b069cb9016bff1eb50faf9fbb + +commit beccb7319c5449f6454889013403c336446d622e +Author: naddy@openbsd.org +Date: Fri May 17 14:42:00 2024 +0000 + + upstream: remove duplicate copy of relink kit for sshd-session + + OpenBSD-Commit-ID: 6d2ded4cd91d4d727c2b26e099b91ea935bed504 + +commit dcd79fa141311c287e0595ede684b7116122fae0 +Author: jsg@openbsd.org +Date: Fri May 17 06:42:04 2024 +0000 + + upstream: remove prototypes with no matching function; ok djm@ + + OpenBSD-Commit-ID: 6d9065dadea5f14a01bece0dbfe2fba1be31c693 + +commit 6454a05e7c6574d70adf17efe505a8581a86ca4f +Author: jsg@openbsd.org +Date: Fri May 17 06:38:00 2024 +0000 + + upstream: remove externs for removed vars; ok djm@ + + OpenBSD-Commit-ID: f51ea791d45c15d4927eb4ae7d877ccc1e5a2aab + +commit f3e4db4601ef7d2feb1d6f7447e432aaf353a616 +Author: deraadt@openbsd.org +Date: Fri May 17 06:11:17 2024 +0000 + + upstream: -Werror was turned on (probably just for development), + + and this is a simple way to satisfy older gcc. + + OpenBSD-Commit-ID: 7f698df54384b437ce33ab7405f0b86c87019e86 + +commit 24a1f3e5ad6f4a49377d4c74c36637e9a239efd0 +Author: Damien Miller +Date: Fri May 17 14:50:43 2024 +1000 + + attempt at updating RPM specs for sshd-session + +commit 17b566eeb7a0c6acc9c48b35c08885901186f861 +Author: djm@openbsd.org +Date: Fri May 17 04:42:13 2024 +0000 + + upstream: g/c unused variable + + OpenBSD-Commit-ID: aa6ef0778a1f1bde0d73efba72a777c48d2bd010 + +commit 01fb82eb2aa0a4eaf5c394ea8bb37ea4c26f8a3f +Author: jsg@openbsd.org +Date: Fri May 17 02:39:11 2024 +0000 + + upstream: spelling; ok djm@ + + OpenBSD-Commit-ID: bdea29bb3ed2a5a7782999c4c663b219d2270483 + +commit b88b690e99145a021fc1a1a116a11e0bce0594e7 +Author: djm@openbsd.org +Date: Fri May 17 01:45:22 2024 +0000 + + upstream: allow overriding the sshd-session binary path + + OpenBSD-Regress-ID: 5058cd1c4b6ca1a15474e33546142931d9f964da + +commit a68f80f2511f0e0c5cef737a8284cc2dfabad818 +Author: anton@openbsd.org +Date: Wed Apr 3 06:01:11 2024 +0000 + + upstream: Since ssh-agent(1) is only readable by root by now, use + + ssh(1) while generating data in tests. + + OpenBSD-Regress-ID: 24eb40de2e6b0ace185caaba35e2d470331ffe68 + +commit 92e55890314ce2b0be21a43ebcbc043b4abc232f +Author: djm@openbsd.org +Date: Fri May 17 01:17:40 2024 +0000 + + upstream: fix incorrect debug option name introduce in previous + + commit + + OpenBSD-Commit-ID: 66d69e22b1c072c694a7267c847f212284614ed3 + +commit 4ad72878af7b6ec28da6e230e36a91650ebe84c1 +Author: deraadt@openbsd.org +Date: Fri May 17 00:33:25 2024 +0000 + + upstream: construct and install a relink-kit for sshd-session ok + + djm + + OpenBSD-Commit-ID: 8b3820adb4da4e139c4b3cffbcc0bde9f08bf0c6 + +commit 02e679a2cb3f6df8e9dbb1519ed578226485157f +Author: Damien Miller +Date: Fri May 17 12:21:27 2024 +1000 + + Makefile support for sshd-session + +commit c0416035c5eaf70a8450d11c8833c5f7068ee7ad +Author: djm@openbsd.org +Date: Fri May 17 00:32:32 2024 +0000 + + upstream: missing files from previous + + OpenBSD-Commit-ID: 4b7be4434d8799f02365552b641a7a70a7ebeb2f + +commit 03e3de416ed7c34faeb692967737be4a7bbe2eb5 +Author: djm@openbsd.org +Date: Fri May 17 00:30:23 2024 +0000 + + upstream: Start the process of splitting sshd into separate + + binaries. This step splits sshd into a listener and a session binary. More + splits are planned. + + After this changes, the listener binary will validate the configuration, + load the hostkeys, listen on port 22 and manage MaxStartups only. All + session handling will be performed by a new sshd-session binary that the + listener fork+execs. + + This reduces the listener process to the minimum necessary and sets us + up for future work on the sshd-session binary. + + feedback/ok markus@ deraadt@ + + NB. if you're updating via source, please restart sshd after installing, + otherwise you run the risk of locking yourself out. + + OpenBSD-Commit-ID: 43c04a1ab96cdbdeb53d2df0125a6d42c5f19934 + +commit 1c0d81357921f8d3bab06841df649edac515ae5b +Author: djm@openbsd.org +Date: Thu May 9 09:46:47 2024 +0000 + + upstream: simplify exit message handling, which was more complicated + + than it needed to be because of unexpunged ssh1 remnants. ok markus@ + + OpenBSD-Commit-ID: 8b0cd2c0dee75fb053718f442aa89510b684610b + +commit cbbbf76aa6cd54fce32eacce1300e7abcf9461d4 +Author: tobias@openbsd.org +Date: Mon May 6 19:26:17 2024 +0000 + + upstream: remove SSH1 leftovers + + Authored with Space Meyer + + ok djm + + OpenBSD-Commit-ID: 81db602e4cb407baae472689db1c222ed7b2afa3 + +commit bc5dcb8ab9a4e8af54a724883732af378f42ea78 +Author: tobias@openbsd.org +Date: Tue Apr 30 15:40:43 2024 +0000 + + upstream: never close stdin + + The sanitise_stdfd call makes sure that standard file descriptors are + open (if they were closed, they are connected with /dev/null). + + Do not close stdin in any case to prevent error messages when stdin is + read multiple times and to prevent later usage of fd 0 for connections, + e.g. + + echo localhost | ssh-keyscan -f - -f - + + While at it, make stdin-related error messages nicer. + + Authored with Max Kunzelmann + + ok djm + + OpenBSD-Commit-ID: 48e9b7938e2fa2f9bd47e6de6df66a31e0b375d3 + +commit 6a42b70e56bef1aacdcdf06352396e837883e84f +Author: Damien Miller +Date: Wed May 8 09:43:59 2024 +1000 + + sync getrrsetbyname.c with recent upstream changes + +commit 385ecb31e147dfea59c1c488a1d2011d3867e60e +Author: djm@openbsd.org +Date: Tue Apr 30 06:23:51 2024 +0000 + + upstream: fix home-directory extension implementation, it always + + returned the current user's home directory contrary to the spec. + + Patch from Jakub Jelen via GHPR477 + + OpenBSD-Commit-ID: 5afd775eab7f9cbe222d7fbae4c793de6c3b3d28 + +commit 14e2b16bc67ffcc188906f65008667e22f73d103 +Author: djm@openbsd.org +Date: Tue Apr 30 06:16:55 2024 +0000 + + upstream: flush stdout after writing "sftp>" prompt when not using + + editline. + + From Alpine Linux via GHPR480 + + OpenBSD-Commit-ID: 80bdc7ffe0358dc090eb9b93e6dedb2b087b24cd + +commit 2e69a724051488e3fb3cd11531c4b5bc1764945b +Author: djm@openbsd.org +Date: Tue Apr 30 05:53:03 2024 +0000 + + upstream: stricter validation of messaging socket fd number; disallow + + usage of stderr. Based on GHPR492 by RealHurrison + + OpenBSD-Commit-ID: 73dbbe82ea16f73ce1d044d3232bc869ae2f2ce8 + +commit da757b022bf18c6f7d04e685a10cd96ed00f83da +Author: djm@openbsd.org +Date: Tue Apr 30 05:45:56 2024 +0000 + + upstream: add missing reserved fields to key constraint protocol + + documentation. + + from Wiktor Kwapisiewicz via GHPR487 + + OpenBSD-Commit-ID: 0dfb69998cfdb3fa00cbb0e7809e7d2f6126e3df + +commit 16d0b82fa08038f35f1b3630c70116979f49784f +Author: Damien Miller +Date: Tue Apr 30 12:39:34 2024 +1000 + + depend + +commit 66aaa678dbe59aa21d0d9d89a3596ecedde0254b +Author: djm@openbsd.org +Date: Tue Apr 30 02:14:10 2024 +0000 + + upstream: correctly restore sigprocmask around ppoll() reported + + by Tõivo Leedjärv; ok deraadt@ + + OpenBSD-Commit-ID: c0c0f89de5294a166578f071eade2501929c4686 + +commit 80fb0eb21551aed3aebb009ab20aeffeb01e44e0 +Author: djm@openbsd.org +Date: Tue Apr 30 02:10:49 2024 +0000 + + upstream: add explict check for server hostkey type against + + HostkeyAlgorithms. Allows HostkeyAlgorithms to disable implicit fallback from + certificate keys to plain keys. ok markus@ + + OpenBSD-Commit-ID: 364087e4a395ff9b2f42bf3aefdb2090bb23643a + +commit 5b28096d31ff7d80748fc845553a4aef5bb05d86 +Author: jsg@openbsd.org +Date: Tue Apr 23 13:34:50 2024 +0000 + + upstream: correct indentation; no functional change ok tb@ + + OpenBSD-Commit-ID: dd9702fd43de546bc6a3f4f025c74d6f3692a0d4 + +commit fd3cb8a82784e05f621dea5b56ac6f89bc53c067 +Author: semarie@openbsd.org +Date: Thu Apr 4 16:00:51 2024 +0000 + + upstream: set right mode on ssh-agent at boot-time + + which sthen@ + ok deraadt@ + + OpenBSD-Commit-ID: 662b5056a2c6171563e1626f9c69f27862b5e7af + +commit 54343a260e3aa4bceca1852dde31cd08e2abd82b +Author: deraadt@openbsd.org +Date: Tue Apr 2 12:22:38 2024 +0000 + + upstream: Oops, incorrect hex conversion spotted by claudio. + + While here try to improve how it reads a bit better. Surprising the + regression tests didn't spot this error, maybe it fails to roundtrip the + values. + + OpenBSD-Commit-ID: 866cfcc1955aef8f3fc32da0b70c353a1b859f2e + +commit ec78c31409590ad74efc194f886273ed080a545a +Author: deraadt@openbsd.org +Date: Tue Apr 2 10:02:08 2024 +0000 + + upstream: for parse_ipqos(), use strtonum() instead of mostly + + idiomatic strtoul(), but wow it's so gross. ok djm + + OpenBSD-Commit-ID: cec14a76af2eb7b225300c80fc0e21052be67b05 + +commit 8176e1a6c2e6da9361a7abb6fbf6c23c299f495b +Author: deraadt@openbsd.org +Date: Tue Apr 2 09:56:58 2024 +0000 + + upstream: can shortcut by returning strtonum() value directly; ok + + djm + + OpenBSD-Commit-ID: 7bb2dd3d6d1f288dac14247d1de446e3d7ba8b8e + +commit 9f543d7022a781f80bb696f9d73f1d1c6f9e31d6 +Author: deraadt@openbsd.org +Date: Tue Apr 2 09:52:14 2024 +0000 + + upstream: rewrite convtime() to use a isdigit-scanner and + + strtonum() instead of strange strtoul can might be fooled by garage + characters. passes regress/usr.bin/ssh/unittests/misc ok djm + + OpenBSD-Commit-ID: 4b1ef826bb16047aea3f3bdcb385b72ffd450abc + +commit 8673137f780d8d9e4cda3c4605cb5d88d5cea271 +Author: claudio@openbsd.org +Date: Tue Apr 2 09:48:24 2024 +0000 + + upstream: Remove unused ptr[3] char array in pkcs11_decode_hex. + + OK deraadt@ + + OpenBSD-Commit-ID: 3d14433e39fd558f662d3b0431c4c555ef920481 + +commit c7fec708f331f108343d69e4d74c9a5d86d6cfe7 +Author: deraadt@openbsd.org +Date: Tue Apr 2 09:32:28 2024 +0000 + + upstream: Replace non-idiomatic strtoul(, 16) to parse a region + + of 2-character hex sequences with a low-level replacement designed just for + the task. ok djm + + OpenBSD-Commit-ID: 67bab8b8a4329a19a0add5085eacd6f4cc215e85 + +commit 019a5f483b0f588da6270ec401d0b4bb35032f3f +Author: deraadt@openbsd.org +Date: Tue Apr 2 09:29:31 2024 +0000 + + upstream: Use strtonum() instead of severely non-idomatic + + strtoul() In particular this will now reject trailing garbage, ie. + '12garbage'. ok djm + + OpenBSD-Commit-ID: c82d95e3ccbfedfc91a8041c2f8bf0cf987d1501 + +commit 8231ca046fa39ea4eb99b79e0a6e09dec50ac952 +Author: deraadt@openbsd.org +Date: Mon Apr 1 15:50:17 2024 +0000 + + upstream: also create a relink kit for ssh-agent, since it is a + + long-running setgid program carrying keys with some (not very powerful) + communication channels. solution for testing the binary from dtucker. + agreement from djm. Will add it into /etc/rc in a few days. + + OpenBSD-Commit-ID: 2fe8d707ae35ba23c7916adcb818bb5b66837ba0 + +commit bf7bf50bd6a14e49c9c243cb8f4de31e555a5a2e +Author: deraadt@openbsd.org +Date: Mon Apr 1 15:48:16 2024 +0000 + + upstream: new-style relink kit for sshd. The old scheme created + + a Makefile by concatenating two Makefiles and was incredibly fragile. In the + new way a narrow-purposed install.sh script is created and shipped with the + objects. A recently commited /etc/rc script understands these files. + + OpenBSD-Commit-ID: ef9341d5a50f0d33e3a6fbe995e92964bc7ef2d3 + +commit 00e63688920905e326d8667cb47f17a156b6dc8f +Author: renmingshuai +Date: Fri Apr 12 10:20:49 2024 +0800 + + Shell syntax fix (leftover from a sync). + + Signed-off-by: renmingshuai + +commit 2eded551ba96e66bc3afbbcc883812c2eac02bd7 +Author: Darren Tucker +Date: Thu Apr 25 13:20:19 2024 +1000 + + Merge flags for OpenSSL 3.x versions. + + OpenSSL has moved to 3.4 which we don't currently accept. Based on + the OpenSSL versioning policy[0] it looks like all of the 3.x versions + should work with OpenSSH, so remove the distinction in configure and + accept all of them. + + [0] https://openssl.org/policies/general/versioning-policy.html + +commit 8673245918081c6d1dc7fb3733c8eb2c5a902c5e +Author: Darren Tucker +Date: Thu Apr 25 13:19:03 2024 +1000 + + Remove 9.6 branch from status page. + +commit 70d43049747fa3c66cf876d52271859407cec2fa +Author: Darren Tucker +Date: Thu Apr 25 13:16:58 2024 +1000 + + Update LibreSSL and OpenSSL versions tested. + + Update LibreSSL versions to current releases (3.8.4 & 3.9.1). + Add newly-released OpenSSL 3.3.0, and add tests against the 3.1 and + 3.3 branches. + +commit 88351eca17dcc55189991ba60e50819b6d4193c1 +Author: 90 +Date: Fri Apr 5 19:36:06 2024 +0100 + + Fix missing header for systemd notification + +commit 08f579231cd38a1c657aaa6ddeb8ab57a1fd4f5c +Author: Damien Miller +Date: Wed Apr 3 14:40:32 2024 +1100 + + notify systemd on listen and reload + + Standalone implementation that does not depend on libsystemd. + With assistance from Luca Boccassi, and feedback/testing from Colin + Watson. bz2641 +commit 2d8a388de215d9959d72bb11f03e07a6eb2e4614 +Author: Damien Miller +Date: Fri Oct 10 13:37:07 2025 +1100 + + depend + +commit 1d2676f4ffae35e2db37a35c385efaf2932cd639 +Author: Damien Miller +Date: Thu Oct 9 14:53:04 2025 +1100 + + update versions + +commit ecd65a492bd0ed3a44a1c07428107b2e148bfee4 +Author: djm@openbsd.org +Date: Wed Oct 8 00:32:52 2025 +0000 + + upstream: openssh-10.2 + + The only change since 10.1 is the channels.c fix + + OpenBSD-Commit-ID: 5eebeb0db14c694efd4ee96b5f16112e3e5d5ba9 + +commit ea9af2921cb6af8e65341531db3a7351917f0a92 +Author: djm@openbsd.org +Date: Wed Oct 8 21:02:16 2025 +0000 + + upstream: fix crash at exit (visible via ssh-keygen -D) when + + multiple keys loaded. ok markus deraadt dtucker + + OpenBSD-Commit-ID: baa9763ec69d162108dafd962792ec5610ff45c9 + +commit e49013576074ccd2d7ae75fb824170c739ce97a1 +Author: Damien Miller +Date: Thu Oct 9 10:07:40 2025 +1100 + + link ssh-keygen directly against ssh-pkcs11.c + + Matches what OpenBSD does and fixes ssh-keygen regression in + certifying keys using a CA key hosted via ssh-agent (bz3877) + +commit 684f2ceff8c0eeb775e8653cf32609f8fbfe07b1 +Author: Damien Miller +Date: Thu Oct 9 13:10:27 2025 +1100 + + some fixes to p11_setup + + 1. Use the ssh-keygen under test and not the one in $PATH + 2. Include a test PKCS#11 operation to ensure that the P11 stack is + working correctly. + + Previously, it was possible for p11_setup to return success on + configurations with PKCS#11 support disabled. + +commit af17ae64a5cfee42334883d2802f40f779131740 +Author: Damien Miller +Date: Thu Oct 9 13:12:15 2025 +1100 + + complete PKCS#11 stubs and move to ssh-pkcs11.c + + Should unbreak --disable-pkcs11 builds + +commit bcf7c05a473f92a35f4f3b561fd7a1e339e0a30f +Author: Darren Tucker +Date: Wed Oct 8 11:26:52 2025 +1100 + + Fix header name and move return outside of ifdef. + + Fixes from Mike Frysinger via Github PR#597. + +commit b937061fe4922caced7b91442b3233c0bd763492 +Author: Darren Tucker +Date: Tue Oct 7 21:10:33 2025 +1100 + + Check HAVE_MMAP too now that configure sets it. + +commit 8d57083c062f03098c9f767ec8d6278dc549a2f6 +Author: Darren Tucker +Date: Tue Oct 7 21:07:05 2025 +1100 + + Use calloc for sshkeys if mmap is not supported. + + Based on Github PR#597 from Mike Frysinger, any bugs added by me. + +commit c97b931bffa481c72ff4bfddd9d59a2110899289 +Author: Darren Tucker +Date: Tue Oct 7 20:25:07 2025 +1100 + + Add fcntl.h to includes. + + From FreeBSD via bz#3874: "This was previously included due to nested + includes in Heimdal's headers. Without this, the build fails with an + error due to redefining AT_FDCWD." + +commit 8aa13832315e52c4404c993a59c6139b44ac6114 +Author: Daan De Meyer +Date: Mon Mar 20 20:22:14 2023 +0100 + + Only set PAM_RHOST if the remote host is not "UNKNOWN" + + When using sshd's -i option with stdio that is not a AF_INET/AF_INET6 + socket, auth_get_canonical_hostname() returns "UNKNOWN" which is then + set as the value of PAM_RHOST, causing pam to try to do a reverse DNS + query of "UNKNOWN", which times out multiple times, causing a + substantial slowdown when logging in. + + To fix this, let's only set PAM_RHOST if the hostname is not "UNKNOWN". + +commit 0bd6649ea80ead0cd6404dbc25b64937421b556e +Author: Darren Tucker +Date: Tue Oct 7 20:10:56 2025 +1100 + + Don't copy native host keys for hostbased test. + + Some github runners (notably macos-14) seem to have host keys where + public and private do not match, so generate our own keys for testing + purposes. + +commit 33b63718d40ccc555b8c7a24331a3790b2efc6c5 +Author: Darren Tucker +Date: Tue Oct 7 20:10:07 2025 +1100 + + Add 10.1 branch to ci-status page. + +commit 52411f15353257e9ec883fc044b7a56b6fca242d +Author: Darren Tucker +Date: Tue Oct 7 20:04:40 2025 +1100 + + Add clock_gettime compat shim. + + This fixes the build on macOS prior to 10.12 Sierra, since it does not + have it. Found and tested by Sevan Janiyan. + +commit beae06f56e0d0a66ca535896149d5fb0b2e8a1b4 +Author: djm@openbsd.org +Date: Tue Oct 7 08:02:32 2025 +0000 + + upstream: don't reuse c->isatty for signalling that the remote channel + + has a tty attached as this causes side effects, e.g. in channel_handle_rfd(). + bz3872 + + ok markus@ + + OpenBSD-Commit-ID: 4cd8a9f641498ca6089442e59bad0fd3dcbe85f8 + +commit 476bab6259d5a6ea0402ec79bc47ed61e2c15e86 +Author: Damien Miller +Date: Mon Oct 6 12:52:25 2025 +1100 + + depend + +commit af956575eba6bf6b6d6bc817e1aa6ed73a365984 +Author: Damien Miller +Date: Mon Oct 6 12:51:13 2025 +1100 + + update versions + +commit 2fd0945913a30fbbe7c02503347961df03f28e66 +Author: Damien Miller +Date: Mon Oct 6 12:48:16 2025 +1100 + + sync ssh-copy-id to upstream version 527be673f4d + +commit 981bb32bc6062fa5d6f11de7ffb732967463bf57 +Author: djm@openbsd.org +Date: Mon Oct 6 01:45:22 2025 +0000 + + upstream: openssh-10.1 + + OpenBSD-Commit-ID: 2a232c2d2fc05a23519f69bc29e6d8c076b97d97 + +commit b9a640a1a0dccfb56be684cc7ade402f57cf7ebd +Author: dtucker@openbsd.org +Date: Fri Oct 3 01:03:45 2025 +0000 + + upstream: If write() returned short, the subsequent write would restart + + from the beginning of the buffer not the end of what was written. Fix, since + we want modpipe to corrupt data for testing purposes deliberately not + accidentally. ok djm@ + + OpenBSD-Regress-ID: 50ca74d287445c58944f070bb92dc13b1d054b43 + +commit a0e5446ac85aca5a3ef9844eeedf787300fdb8b3 +Author: naddy@openbsd.org +Date: Sat Oct 4 21:41:35 2025 +0000 + + upstream: typos: a ssh* -> an ssh* + + ok dtucker@ + + OpenBSD-Commit-ID: a70fd2e1b23089260e8f5a7921b0debc06b011cb + +commit ade92f53c3bd4ad7dcd95334a194add57ec9ff71 +Author: djm@openbsd.org +Date: Fri Oct 3 00:09:26 2025 +0000 + + upstream: stray newline + + OpenBSD-Commit-ID: b47ed4fa93b781c7ec8ae2936526a290f4e17e1f + +commit a9cbe10da2be5be76755af0cea029db0f9c1f263 +Author: djm@openbsd.org +Date: Fri Oct 3 00:08:02 2025 +0000 + + upstream: include openssl/bn.h explicitly in files where we use BN_* + + makes things simpler for portable; from Mike Frysinger + + OpenBSD-Commit-ID: 717e93403fd1108e175afd7451b5a4ab46a598fe + +commit 3957cc2914cdc88932c972413853f8b68c1ffba5 +Author: dtucker@openbsd.org +Date: Thu Oct 2 08:38:43 2025 +0000 + + upstream: Relax array check slightly. Prevents compiler warnings + + in -portable when there are no kbdint devices present. ok djm@ + + OpenBSD-Commit-ID: c1c050cecd642d6073c792201908fd225191df93 + +commit 6a239b057be2897d7a597daaf5394f2e7312dc65 +Author: djm@openbsd.org +Date: Thu Oct 2 04:23:11 2025 +0000 + + upstream: backout r1.243 (fix for fatal during tab-completion with + + some multibyte sequences) as it breaks the common case for tab completion. + + Will deal with it properly after release. + + OpenBSD-Commit-ID: 196d00f5ff19579214de45357f16a1fb2d624be1 + +commit b9f6a84ea383d811216de38219472214963c10b2 +Author: Darren Tucker +Date: Thu Oct 2 10:48:04 2025 +1000 + + Pass COMPATINCLUDES down to openbsd-compat too. + + Fixes build on Solaris, AIX and probably others. + +commit 047e0221eaf9815775e8ea78c6d6add5ab0f68c7 +Author: Darren Tucker +Date: Wed Oct 1 14:34:02 2025 +1000 + + Pass new "compat includes" path via AC_SUBST. + + This fixes the build when the directory path containing a space. + Found by Sevan Janiyan, tested by Job Snijders. This doesn't fix + "make tests", however that is a different, pre-existing problem + that needs to be addressed separately. + +commit 5c50ddbe4deac83995edc1d014e9ba0d5efa18a6 +Author: Darren Tucker +Date: Wed Oct 1 13:37:35 2025 +1000 + + Remove compat "include" dir during distclean. + +commit aceabd62ce5833716dd2e99d4be4fcb603d263cc +Author: dtucker@openbsd.org +Date: Wed Oct 1 00:33:37 2025 +0000 + + upstream: Set keys to NULL after freeing in tests where the + + variables will be used again. Should prevent Coverity "potential use after + free" warnings. + + OpenBSD-Regress-ID: 24d141657d25977e41dfb0c58e9b74ab093972bf + +commit eb30a0d1493a97b5c14728846576dc6af5d442da +Author: dtucker@openbsd.org +Date: Wed Oct 1 00:30:19 2025 +0000 + + upstream: Get rid of utf8 droppings in commment since it confuses + + older shells. From Sevan Janiyan via openssh-unix-dev. + + OpenBSD-Regress-ID: 67c11a5cff6ef23538c77e9b29d538e175e6cfe3 + +commit d478e250230e917eeb5032238df0b9af357404ee +Author: Darren Tucker +Date: Wed Oct 1 12:17:54 2025 +1000 + + Update OpenSSL & LibreSSL versions we test against. + +commit 2c504a74ed81d13c8198a89ed1040d0fc5f73129 +Author: djm@openbsd.org +Date: Tue Sep 30 00:10:42 2025 +0000 + + upstream: during sftp uploads, avoid a condition where a failed write + + could be ignored if a subsequent write succeeded. + + This is unlikely but technically possible because sftp servers are + allowed to reorder requests. + + Reported by Graziano Stefani, ok tb@ + + OpenBSD-Commit-ID: 03904bce2c7f787223d01d7e1179fde15753eca3 + +commit 1f7556753869654ba5e2bf61e384c5da2db5ca6a +Author: djm@openbsd.org +Date: Tue Sep 30 00:06:06 2025 +0000 + + upstream: avoid a fatal() when sftp tab-completes filenames that + + share common utf-8 characters that don't encode to a complete codepoint + + from menthu.zhou via GHPR#587; ok dtucker@ + + OpenBSD-Commit-ID: e07e4d8a8cac032ab536570b8214e6ef6839b585 + +commit 42b14ff1e06fd683c7d15a6b2816c16108873a5a +Author: djm@openbsd.org +Date: Tue Sep 30 00:03:09 2025 +0000 + + upstream: fix memory leak in mux_client_request_stdio_fwd GHPR#575 + + by Boris Tonofa; ok dtucker + + OpenBSD-Commit-ID: 410cdd05242304bd0196b9172ce5fcaf89d2d8ce + +commit e5055ef26abcffd3f99669e411ea6b35ca166111 +Author: Allison Karlitskaya +Date: Wed Sep 3 20:07:55 2025 +0200 + + Don't log audit messages with UNKNOWN hostname + + The `host` parameter to audit_log_acct_message() is documented as + follows: + + host - The hostname if known. If not available pass a NULL. + + but we pass the string "UNKNOWN" in case we don't know the hostname. + Make sure we pass NULL instead. + + This avoids having the audit system attempt to perform a DNS lookup on + the hostname "UNKNOWN", which tends to result in long delays when + attempting to login. + +commit d343df4019b4369ce7f87e9bf6bbc80b81cd263d +Author: zhangjun +Date: Fri Aug 22 16:49:07 2025 +0800 + + ensure struct passwd fields are non-NULL in pwcopy + + Android libc can return NULL pw_gecos, for example. + +commit 893a579e4b37e6bd89d206dc8e7ac2a906ccf114 +Author: dtucker@openbsd.org +Date: Mon Sep 29 21:37:52 2025 +0000 + + upstream: Add explicit check for array overflow. + + The array is bounded by a NULL sentinel which already prevents this, + however since we check the bit vector for overflow Coverity assumes that + check is for the devices array and flags it as a potential overflow. + Adding this additional check on the array placates CID 896018. ok djm@ + deraadt@ + + OpenBSD-Commit-ID: e92fff41341b38e4206a70655cc9acaaa032ebee + +commit 90f49a185ac1a786d9f7e9a710b369afb3692a65 +Author: dtucker@openbsd.org +Date: Mon Sep 29 21:30:15 2025 +0000 + + upstream: Move ifdef to start of file. Removes diff vs portable. + + OpenBSD-Commit-ID: 55058ac3d477e4c696575039f5b275522b99ffea + +commit 2f71b44d48dc8da7fb743d6ffe609aea5a645edb +Author: dtucker@openbsd.org +Date: Mon Sep 29 21:29:22 2025 +0000 + + upstream: Include misc.h. Removes diff vs portable. + + OpenBSD-Commit-ID: 8aa48451fe5c37f04a339450c4ed9cfb8f4c288f + +commit dfb991bdd826517bbce1cf62ce07bcb3e48a2f27 +Author: dtucker@openbsd.org +Date: Mon Sep 29 21:28:33 2025 +0000 + + upstream: Sort headers as per KNF. Removes diff vs portable. + + OpenBSD-Commit-ID: 55f5b9eaeb826a25cfb506a78136094275a71bcb + +commit c82f4dd6b723a8365b4c538d7c99fe8e46985ed0 +Author: dtucker@openbsd.org +Date: Mon Sep 29 07:40:55 2025 +0000 + + upstream: Null out keys after freeing in tests in the case where we + + potentially reuse the variable. Fixes Coverity CID 405057. + + OpenBSD-Regress-ID: c52e86502b33bfa6e448448a74a0217dd519dd58 + +commit fda31e1e5179b4e70c27094ebb303ee47c11a5a7 +Author: djm@openbsd.org +Date: Mon Sep 29 03:17:54 2025 +0000 + + upstream: avoid spurious error message when loading certificates + + only bz3869 + + OpenBSD-Commit-ID: e7848fec50d15cc142fed946aa8f79abef3c5be7 + +commit bcd88ded2fff97652d4236405a3354ca66f90f7e +Author: djm@openbsd.org +Date: Mon Sep 29 02:32:15 2025 +0000 + + upstream: kbd-interactive device names should be matched against + + the full device name, not a prefix. Doesn't matter in practice as there is + only one kbd-int device supported (PAM xor BSD auth), and an attacker would + still need to successfully authenticate against an incorrectly-selected + device. + + reported by ashamedbit, NobleMathews; ok deraadt@ + + OpenBSD-Commit-ID: cf75d4f99405fbb41354c4ae724a3b39a3b58f82 + +commit b1c4bf5c2f1c2b30698dbaadc5d823862213f1fc +Author: jsg@openbsd.org +Date: Thu Sep 25 12:52:21 2025 +0000 + + upstream: avoid use-after-free in update_krl_from_file() found with + + clang scan-build, ok dtucker@ + + OpenBSD-Commit-ID: 8ec86eca573740c94d5bc7e252959174555f4eb8 + +commit b06a150bc903a0cf898406384d5a34059d0f2d8f +Author: Darren Tucker +Date: Sat Sep 27 20:20:34 2025 +1000 + + Stop testing OpenBSD ubsan until fixed upstream. + +commit 97b32fa2af25c16aec4de85c5cbb63fd038b4dfa +Author: dtucker@openbsd.org +Date: Fri Sep 26 04:40:45 2025 +0000 + + upstream: Use $OBJ for temp file in maxstartups idempotence test. + + Fixes test in -portable when run out-of-tree. + + OpenBSD-Regress-ID: 8578be08238af4abe2dc91af1c199f7f71f1a7a2 + +commit b4ceca952b85752958d849508294afdc56dfcb9f +Author: Darren Tucker +Date: Fri Sep 26 22:28:13 2025 +1000 + + Shorten workflow names to fit in a single line. + +commit 9824ec515ed6256c1a98d66049471053f965b75e +Author: Darren Tucker +Date: Fri Sep 26 22:26:33 2025 +1000 + + Update link to oss-fuzz bug tracker. + + Remove 9.8 branch. + +commit 37d996bd0537837f15fc540d5aebb1ef2faf2268 +Author: dtucker@openbsd.org +Date: Thu Sep 25 22:17:29 2025 +0000 + + upstream: Check return codes of sshbuf functions. + + Fixes Coverity CIDs 405059 and 405061. + + OpenBSD-Regress-ID: defa55d32892172251bbd5efd15731ce55888247 + +commit 6c3c9f03c3c2cc4e40decbb49b8486abfb9e57df +Author: Darren Tucker +Date: Fri Sep 26 08:23:21 2025 +1000 + + Replace hand-rolled modulo with arc4random_uniform. + + Fixes potential modulo-by-zero UB flagged by Coverity CID 405068 + +commit e914e61eb88e22e5b725c399698256c54589ca32 +Author: Darren Tucker +Date: Thu Sep 25 17:50:07 2025 +1000 + + Remove status bits from OpenSSL >=3 version check. + + OpenSSL traditionally did not guarantee ABI compatibility across release + (and development) versions. Because of this, OpenSSH checked the lower 4 + "status" bits returned by OpenSSL_version_num(), which were originally + set to 0 for development versions and 0xf for release versions and, if + they did not match, would report the discrepancy and exit. + + OpenSSL (unintentionally) changed these bits in the 3.0.0 and subsequent + 3.x releases, setting them to zero in the release versions (which happened + to also match the documentation), then changed them back in the 3.5.3 + release. If OpenSSL was upgraded to (or from) this version without + recompiling OpenSSH, it would cause OpenSSH flag it as potentially + incompatible and refuse to use it. Ultimately OpenSSL rolled this + back, but the check now has no value so is being removed for OpenSSL + versions >=3. + + bz#3865 and https://github.com/openssl/openssl/issues/28575, ok djm@ + +commit 35f3e2a41c2afe7a68a8a4efb3eb385e7f8d247d +Author: Darren Tucker +Date: Thu Sep 25 18:06:55 2025 +1000 + + Update pledge() interface to match current OpenBSD. + + ok djm@ + +commit 7ce3823547578a3b083085744c1fea39237197a2 +Author: Darren Tucker +Date: Tue Sep 23 22:12:19 2025 +1000 + + Merge all putty tests into a single test. + + The lets us reuse the built OpenSSH binaries and replaces 12*4min of + tests with a single 14min one. + +commit 1362f6c0f4ca3306a201a6572bb9ec0d47d8edb3 +Author: Darren Tucker +Date: Thu Sep 25 18:20:53 2025 +1000 + + Add #ifdefs in pwfree to match those in pwcopy. + + Fixes build on many platforms. + +commit 8235dc3d82c0ac347a3600df0907c6573720fbaa +Author: djm@openbsd.org +Date: Thu Sep 25 07:05:11 2025 +0000 + + upstream: fix some one-off leaks in ssh.c; ok dtucker@ + + OpenBSD-Commit-ID: bf3c27ffe4b3cccb6553b554ec4c04929065a2bc + +commit 846987d1233f24bbe87ebed347e328f45525388a +Author: djm@openbsd.org +Date: Thu Sep 25 07:04:38 2025 +0000 + + upstream: fix some one-off leaks in ssh-keygen; ok dtucker@ + + OpenBSD-Commit-ID: 32f51289c93246474659aa49067926fcab9e02e8 + +commit a1a7df8b3694fdd7b55ad6bb8fa7b3d5d7f5b89a +Author: djm@openbsd.org +Date: Thu Sep 25 07:00:43 2025 +0000 + + upstream: fix some leaks in ssh-add; feedback/ok dtucker@ + + OpenBSD-Commit-ID: 441302917de31a128c1d6d63acccc67042fcf349 + +commit a8a2702bcd9e81a086e6d2c278f1b62f9d8bf3a1 +Author: djm@openbsd.org +Date: Thu Sep 25 06:57:54 2025 +0000 + + upstream: fix some leaks; feedback/ok dtucker@ + + OpenBSD-Commit-ID: 05bdbc2e494b87a4a79e509020bd8249c86a4ff0 + +commit a071af0682d686de85cf471f5e04deaee4d90adb +Author: djm@openbsd.org +Date: Thu Sep 25 06:45:50 2025 +0000 + + upstream: wait for the unprivileged sshd-auth process to exit + + before closing the fd it uses to report log messages + + This avoids a race where the child process notices the + fd was closed before exiting and spams the logs. + + ok dtucker@ + + OpenBSD-Commit-ID: 7cddaa41be3b955e6bed570900db7ab8817b1e76 + +commit 4fddebe7f524b3403c876c3b399d5ce7ce3390a6 +Author: djm@openbsd.org +Date: Thu Sep 25 06:33:19 2025 +0000 + + upstream: add some functions to free various structs, including + + channels data and packet state; ok dtucker@ tb@ + + OpenBSD-Commit-ID: a8b3705309d632cdae370d4147a03e703087b0d1 + +commit d0c1e73d408a24b2db18c0aa1a0108bea0f24210 +Author: djm@openbsd.org +Date: Thu Sep 25 06:31:42 2025 +0000 + + upstream: fix leaks of config objects in + + mm_decode_activate_server_options ok dtucker@ tb@ + + OpenBSD-Commit-ID: 211f4d7d02e847bd1bcb460f6beb11658809a742 + +commit b62aa85dcbc8f03bf91d26d14fbf8fd5e172d882 +Author: djm@openbsd.org +Date: Thu Sep 25 06:25:38 2025 +0000 + + upstream: clarify intent and avoid (harmess, defined behaviour) + + unsigned underflow. ok tb@ + + OpenBSD-Commit-ID: b73bf5f1f381c3e4561a6cc706fb1cd77c939cd8 + +commit 6f28a935cc7d073e6647643e81d98b5831df204f +Author: jsg@openbsd.org +Date: Thu Sep 25 06:23:19 2025 +0000 + + upstream: consistently use NULL for null pointer constants found + + with sparse, ok djm@ + + OpenBSD-Commit-ID: 1067504b63732d809d0d57ad4bc626818d112772 + +commit 0af7e5b690e2cfe8824f04f154b0e543509dbefd +Author: jsg@openbsd.org +Date: Thu Sep 25 02:15:39 2025 +0000 + + upstream: remove unneeded externs ok djm@ + + OpenBSD-Commit-ID: fe553193e910a122505142a4e1db7358cc1ae653 + +commit ae62a16118bb96a8e449ef25f5e55ef86a52cefb +Author: jsg@openbsd.org +Date: Thu Sep 25 02:12:16 2025 +0000 + + upstream: remove prototype for removed ssh_packet_set_tos() ok + + djm@ + + OpenBSD-Commit-ID: 396f82995074ef4d7b9ce44168266ef4640d9985 + +commit d8588478850463f8945aa18d0358b2b227f8b57a +Author: jsg@openbsd.org +Date: Wed Sep 24 00:51:28 2025 +0000 + + upstream: spelling; ok dtucker@ + + OpenBSD-Commit-ID: 93870117b0153859dd8baa80b97e44d4558c786b + +commit eff358890a7cab1e7c2fec62e5b9914d2c1c8703 +Author: Darren Tucker +Date: Tue Sep 23 16:51:34 2025 +1000 + + Merge VM tests into a single workflow file. + + Should make it easier to manage, although it may cause a few extra runs. + +commit d00015d21190517a1f505eb8120f716b1c2e4055 +Author: Darren Tucker +Date: Tue Sep 23 16:38:45 2025 +1000 + + Test openssl-3.6 branch not beta1. + +commit 31fce4fc5aaf79b9a4bccf09467e86c56b482bde +Author: Darren Tucker +Date: Tue Sep 23 15:51:14 2025 +1000 + + Test openssl-3.6.0-beta1. + +commit b94e7251a17a497669e825cb70ac79c96bdc3472 +Author: Darren Tucker +Date: Tue Sep 23 11:32:57 2025 +1000 + + Specify rpath when building OpenSSL. + +commit 83853aa5e35f3da0690bccd2983764d4e749a670 +Author: Darren Tucker +Date: Mon Sep 22 15:26:17 2025 +1000 + + Factor out OpenSSL install and test more versions. + + Move OpenSSL installation into its own script with a "-a" option to + install the "next" version to test for ABI compatibility. + +commit 2c1d38f7ffc8b8ec244bfe17ec8a85b3d737dcab +Author: Darren Tucker +Date: Mon Sep 22 16:55:49 2025 +1000 + + Exclude generated openbsd-compat/include directory. + +commit 67b3ed101a18348b564507f55e3ed4b7e0d23ff9 +Author: Darren Tucker +Date: Sat Sep 20 15:07:36 2025 +1000 + + Add OpenSSL 3.x ABI cross-compatibility test. + +commit c682c9f45a10ee0dc37fd716cfccd42271f92ddc +Author: Darren Tucker +Date: Sat Sep 20 15:05:19 2025 +1000 + + Add tests for OpenSSL 3.4 and 3.5 versions. + +commit 1659d0ac095608b809fd3173d2c48b7b39d40b02 +Author: Darren Tucker +Date: Sat Sep 20 15:53:04 2025 +1000 + + Build OpenSSL with -j4 to speed it up. + +commit ca9ac1109e2c875ea33da6818c1841aa2181e962 +Author: Darren Tucker +Date: Sat Sep 20 15:16:30 2025 +1000 + + Rerun tests if run_tests.sh changes. + +commit bc328144f149af07139a0f2c1329018cd85b86b7 +Author: djm@openbsd.org +Date: Fri Sep 19 01:32:45 2025 +0000 + + upstream: log at level INFO when PerSourcePenalties actually blocks + + access to a source address range. Previously this was logged at level + VERBOSE, which hid enforcement actions under default config settings. + + ok dtucker, markus + + OpenBSD-Commit-ID: ea2b0d7c2253ff5205719d74b526cf2870df894d + +commit 80993390bed15bbd1c348f3352e55d0db01ca0fd +Author: Darren Tucker +Date: Wed Sep 17 17:41:41 2025 +1000 + + Whitespace. + +commit fc704057ce6b75637645a4b9c917565b3563e21b +Author: Darren Tucker +Date: Wed Sep 17 17:33:25 2025 +1000 + + Move Gihub VMs to their own status line. + +commit 2202e5f9008003044cac01ed70d83deec42ad4e0 +Author: Darren Tucker +Date: Tue Sep 16 23:00:14 2025 +1000 + + Use relative URLs for status + +commit 7c32e09ea3e5c7e1fa0b7e2d4ddc83f8beadafed +Author: Darren Tucker +Date: Mon Sep 15 17:21:15 2025 +1000 + + Add VM test targets via vmaction on Github. + +commit a4aa090a3d40dddb07d5ebebc501f6457541a501 +Author: djm@openbsd.org +Date: Mon Sep 15 03:00:22 2025 +0000 + + upstream: memory leaks in unit tests + + OpenBSD-Regress-ID: af11ac7b8034b99ca324af4dae1ef5cd7700b273 + +commit 6f5942454ad6756355f3b4983ab882cf15e44440 +Author: djm@openbsd.org +Date: Mon Sep 15 05:17:37 2025 +0000 + + upstream: fix leaks of struct sftp_conn in scp; ok dtucker@ + + OpenBSD-Commit-ID: 76bea50b5b87b750c3771bf80feb6067d994a9d2 + +commit 52f38c76fcb38dfe619d8caa3bb4bb782c785026 +Author: djm@openbsd.org +Date: Mon Sep 15 04:52:41 2025 +0000 + + upstream: leak of principals file lines; ok dtucker@ + + OpenBSD-Commit-ID: 918bf1b70e5a969059300f3c23d45911690d9015 + +commit b9464cee0fd084d89d91696a17b3621b4cf512bf +Author: djm@openbsd.org +Date: Mon Sep 15 04:52:12 2025 +0000 + + upstream: leak of authentication options at exit; ok dtucker@ + + OpenBSD-Commit-ID: ba559799c2ff9b10afc3abefb1797c0843a6ff24 + +commit 0bb37080c86674de7cdfb56c80add3cd316c68a8 +Author: djm@openbsd.org +Date: Mon Sep 15 04:51:35 2025 +0000 + + upstream: memleak of keys not used for authentication; ok + + dtucker@ + + OpenBSD-Commit-ID: ddfda79d243150fbd382d8f2cd75a90a072b3669 + +commit ee99f6e93e0ee90eedbd27ffb9b7f9fef7b98010 +Author: djm@openbsd.org +Date: Mon Sep 15 04:50:42 2025 +0000 + + upstream: memleak of certificate path; ok dtucker@ + + OpenBSD-Commit-ID: 90dc5390f2756ba339e2e6df54d4b8651d64c1e7 + +commit 42fc6b6f9fbf58293b070f4de377c7695c275a8a +Author: djm@openbsd.org +Date: Mon Sep 15 04:49:41 2025 +0000 + + upstream: memleak of hostkey when downgrading host cert->key; ok + + dtucker + + OpenBSD-Commit-ID: f6f1f38a8ec144fb615434f6877066cf4610b826 + +commit bc60bd55cbc1f8139c840668733b51475cbefd93 +Author: djm@openbsd.org +Date: Mon Sep 15 04:49:00 2025 +0000 + + upstream: memleak of editline history; ok dtucker@ + + OpenBSD-Commit-ID: a244c54eb074cf7fbe28f7ac4f03ace270f7a999 + +commit ee77ab9b2ca2d70daf8d4352f5daffa8036ece64 +Author: djm@openbsd.org +Date: Mon Sep 15 04:48:29 2025 +0000 + + upstream: memleak of rfwd callback context; ok dtucker@ + + OpenBSD-Commit-ID: 70b2aafeaace90703dd16a44a2a0b723d9155f33 + +commit 0088b3f0ab2c615ae95b9f374963abaa0ab837ec +Author: djm@openbsd.org +Date: Mon Sep 15 04:47:49 2025 +0000 + + upstream: memleaks of request packet and hostkeys blob; ok + + dtucker@ + + OpenBSD-Commit-ID: 313b13a8e36b4ca8e064ee56792e67e0670a386a + +commit d68451a25808c4eee74b898873cd4761f73651ed +Author: djm@openbsd.org +Date: Mon Sep 15 04:41:20 2025 +0000 + + upstream: memleak of KRL revoked certs struct; ok dtucker + + OpenBSD-Commit-ID: f319868e0b2de49c41c735e75b87c403f009f5f9 + +commit 67940cc2f329427d3acb64d4893faf4527e58d5c +Author: djm@openbsd.org +Date: Mon Sep 15 04:40:34 2025 +0000 + + upstream: memleak of kex->server_sig_algs; ok dtucker@ + + OpenBSD-Commit-ID: 41a3f64edd2c9b8addb2e445514ae25c24819e2c + +commit fae8e41741d23298c94a1ea3ef8704a1cc186cb5 +Author: djm@openbsd.org +Date: Mon Sep 15 04:39:58 2025 +0000 + + upstream: fix memleak of channel forwarding permissions; ok + + dtucker@ + + OpenBSD-Commit-ID: 069745547109bc8fcc09fab5b19c53599cae99fd + +commit 03872018c14ed943bc01a4e88be59195a742f106 +Author: djm@openbsd.org +Date: Mon Sep 15 04:39:15 2025 +0000 + + upstream: when merging auth options into the active set, don't + + leak the old struct sshauthopt; ok dtucker@ + + OpenBSD-Commit-ID: c6bfd7bc2932e37f811b3c53272c3b919d33e75b + +commit efed5da4ced88170cf474246eff771dd16c7092f +Author: djm@openbsd.org +Date: Mon Sep 15 04:38:00 2025 +0000 + + upstream: fix memleak when applying certificate options; ok + + dtucker + + OpenBSD-Commit-ID: 36c219dcc05f4df82a0f9c500bdf5dbfea925289 + +commit edc601707b583a2c900e49621e048c26574edd3a +Author: djm@openbsd.org +Date: Thu Sep 11 07:23:32 2025 +0000 + + upstream: disable ssh-add autoexpiry of certificates when testing + + expired certificates + + OpenBSD-Regress-ID: 64aadd23d37fd0b3a06498151f2cf83be7ac342c + +commit c60153e4878f3a6700af69adbdd1863003e78abf +Author: djm@openbsd.org +Date: Thu Sep 11 07:22:37 2025 +0000 + + upstream: correct getopt() string + + OpenBSD-Commit-ID: 05ef9581a3dab32ec93aa5b9c3349ed1e7da9ec8 + +commit 7a4738af45201c115a9e20f830f30ed38ce6be76 +Author: djm@openbsd.org +Date: Thu Sep 11 03:29:58 2025 +0000 + + upstream: need time.h for time(3) + + OpenBSD-Commit-ID: 530964039cccab679432b6c5b28d2b0aa9760b00 + +commit 0c719c6aabc061f02a907fc96c390d0449b49f26 +Author: djm@openbsd.org +Date: Thu Sep 11 02:54:42 2025 +0000 + + upstream: When adding certificates to an agent, set the expiry to + + the certificate expiry time plus a short (5 min) grace period. + + This will cause the agent to automtically remove certificates shortly + after they expire. + + A new ssh-add -N option disables this behaviour. + + Feedback/ok deraadt@ + + OpenBSD-Commit-ID: 92fed1bba1025069ad45deebb534be7530e181df + +commit e9dcccc3541b0ae1c43581ed26215d5cc82e4be0 +Author: jsg@openbsd.org +Date: Mon Sep 8 00:31:54 2025 +0000 + + upstream: remove unused 0-sized files; ok deraadt@ + + OpenBSD-Commit-ID: 7e8178786157e863f6ff63c5d55200d7b6b04f9e + +commit d16b1b484a024ee6b35094e7d9d55bf96b96253b +Author: dtucker@openbsd.org +Date: Fri Sep 5 10:34:35 2025 +0000 + + upstream: Tabs->spaces. Removes diff vs portable. + + OpenBSD-Commit-ID: 06598021a9f08188dab29ac956b2baa002a0ff85 + +commit 3d8ae7f235b96da604b08c44ae83420e367eeab4 +Author: Tim Rice +Date: Mon Sep 8 12:53:10 2025 -0700 + + modified: regress/rekey.sh + Fix for when building out of tree. + +commit 54abadd3f286efea0dbbdbfea8011d5e1e30c074 +Author: Darren Tucker +Date: Sun Sep 7 13:35:22 2025 +1000 + + Accept OpenSSL 4.0.0-dev versions. + + They seem to work, at least for now. + +commit 67a8bf4e4057597170bfa923fe2ce5bf90c43974 +Author: Maxim Khon +Date: Mon Aug 18 12:05:42 2025 +0000 + + Use SSH_TUN_COMPAT_AF on FreeBSD. + + Otherwise tun forwarding from other OSes fails as soon as the first IPv6 + message is sent by the other side (which is usually a Router Solicitation + ICMPv6 message which is sent as soon as the interface is up): all other + OS'es use SSH_TUN_COMPAT_AF or SSH_TUN_PREPEND_AF which effectively uses + OpenBSD AF_INET/AF_INET6 values. + +commit 3ca274e44cb2c2351376fc14e4c3e92ba4a8f87b +Author: Darren Tucker +Date: Fri Sep 5 21:32:30 2025 +1000 + + Check for nlist function. + + Check for nlist function presence before attenmpting to use it instead + of relying on the presence of the nlist.h header. Mac OS X, in particular + has the header, but only has the function in the 32bit libraries. + +commit ee32a36c62424f13907023595bfa8b23a528ced1 +Author: dtucker@openbsd.org +Date: Fri Sep 5 10:23:55 2025 +0000 + + upstream: Order includes as per KNF and add time.h. Removes diff + + vs portable. + + OpenBSD-Commit-ID: 38043f0bfa17c48ef6d1a744c2834b4405bc9311 + +commit 0ac179c9540e2b05b4c1194db69ce01306c253d3 +Author: dtucker@openbsd.org +Date: Fri Sep 5 10:17:21 2025 +0000 + + upstream: Order headers as per KNF. Removes diff vs portable. + + OpenBSD-Commit-ID: 4df519fd9fa13ce9653adf7a3d1076e20591d886 + +commit e80322284f3ee70b6b760a9f83179470d675e5ba +Author: dtucker@openbsd.org +Date: Fri Sep 5 10:01:35 2025 +0000 + + upstream: Order headers as per KNF. + + OpenBSD-Commit-ID: 7156b69b0364c68e181e0f6fa17c0f05c72e8670 + +commit bb8ac0515e68cab63db2d026eb60127185a3d2b8 +Author: Darren Tucker +Date: Fri Sep 5 20:39:16 2025 +1000 + + Resync header order with upstream. + +commit 024b694249482698b0c73d24da0eaec696fca8c8 +Author: Darren Tucker +Date: Fri Sep 5 20:37:04 2025 +1000 + + Resync header order with upstream. + +commit aed6a958bc108faab64bc2855d6ed93894cfc6ff +Author: Darren Tucker +Date: Fri Sep 5 20:30:20 2025 +1000 + + Sync includes with upstream. + +commit 22cfd2dd32f34f0cea218dd651f3aa9544b6e3b5 +Author: Darren Tucker +Date: Fri Sep 5 20:26:14 2025 +1000 + + Move ssh-pkcs11.h include to match upstream. + +commit b34c16bc4cac2962cc6a7517efbc4fed2c8a2d9a +Author: Darren Tucker +Date: Fri Sep 5 20:20:27 2025 +1000 + + Reorder includes to match upstream. + +commit 441a8fa9a0178704bce497bff92ca43fcf04bf7a +Author: dtucker@openbsd.org +Date: Fri Sep 5 09:58:08 2025 +0000 + + upstream: Order headers as per KNF. Removes diff vs portable. + + OpenBSD-Commit-ID: db72be57429418f6a4319bbe34c98fc103e11ce0 + +commit 19d6a7afb256c4afc571dbf56a013ef91cd9596f +Author: dtucker@openbsd.org +Date: Fri Sep 5 09:49:26 2025 +0000 + + upstream: Order headers as per KNF. Also removes diff vs + + -portable. + + OpenBSD-Commit-ID: 2061307dc938712e524bc9da48a52f545e43670e + +commit 932e9f200bd48b7568eb21ec456c67ec92d517e2 +Author: dtucker@openbsd.org +Date: Fri Sep 5 09:31:31 2025 +0000 + + upstream: Remove unused rmd160.h header. ripemd160 support was + + removed in 2017. + + OpenBSD-Commit-ID: 937fca21498b921adf6e04bac120f4a2e7975b3c + +commit f93de828b9b0f29bff51d38ea92d0759595ec30b +Author: Darren Tucker +Date: Fri Sep 5 20:07:16 2025 +1000 + + Create replacement nlist.h if needed. + + Remove #ifdef HAVE_NLIST_H wrapper. ok djm@ + +commit 6aac2beaa53467e83f6a137376b6dcf423ab6f6c +Author: Darren Tucker +Date: Fri Sep 5 19:55:20 2025 +1000 + + Create replacement endian.h if needed. + + Remove #ifdef HAVE_ENDIAN_H wrapper. ok djm@ + +commit a60721c894f0a2ce973876d0f55617e187e6fab1 +Author: Darren Tucker +Date: Fri Sep 5 19:52:48 2025 +1000 + + Add /* WITH_OPENSSL */ comments. + + Removes diffs vs upstream. + +commit c729a833298d9d55ffb22771cf1400dfdc640164 +Author: Darren Tucker +Date: Fri Sep 5 19:22:37 2025 +1000 + + Move sys/time.h include to match upstream. + +commit caa973dd06a7be43c29353b256c9a473f5ad9882 +Author: Darren Tucker +Date: Fri Sep 5 19:13:52 2025 +1000 + + Create replacement netgroup.h if needed. + + Remove #ifdef HAVE_NETGROUP_H wrapper. ok djm@ + +commit 7d30526b7df14d960a5de63d6af823ffdab86518 +Author: Darren Tucker +Date: Fri Sep 5 18:24:59 2025 +1000 + + Remove stray #endif left from previous. + +commit 4911f2600fdbb1959311bb1886bfe51f7dd4a74e +Author: Darren Tucker +Date: Fri Sep 5 18:08:51 2025 +1000 + + Create replacement libgen.h if needed. + + Remove #ifdef HAVE_LIBGEN_H wrapper. ok djm@ + +commit 65dcdb56f5daee519ec824ae17e64412d2492f90 +Author: Darren Tucker +Date: Fri Sep 5 18:05:15 2025 +1000 + + Create replacement sys/un.h if needed. + + Remove #ifdef HAVE_SYS_UN_H wrapper. ok djm@ + +commit 60334af5a908ac3b263d2ec696f9977e20b739cb +Author: Darren Tucker +Date: Fri Sep 5 18:03:55 2025 +1000 + + Reformat replacement header check one per line. + +commit cd9ba068e36b0f37374d2eba2d19dacc7ea9a167 +Author: Darren Tucker +Date: Fri Sep 5 17:55:33 2025 +1000 + + Create replacement time.h if needed. + + Remove #ifdef HAVE_TIME_H wrapper. ok djm@ + +commit ea586edbcbec7089f768ed682a79a399eaa1e5b1 +Author: Darren Tucker +Date: Fri Sep 5 17:50:18 2025 +1000 + + Create replacement sys/stat.h if needed. + + Remove #ifdef HAVE_SYS_STAT_H wrapper. ok djm@ + +commit 59b80707c6cf45230597a800e7d2ce6b00ce35b5 +Author: Darren Tucker +Date: Fri Sep 5 17:44:07 2025 +1000 + + Create replacement sys/time.h if needed. + + Remove #ifdef HAVE_SYS_TIME_H wrapper. ok djm@ + +commit 82fed5110fe09e9af258a8f5a2f92ffb397fff5b +Author: Darren Tucker +Date: Fri Sep 5 17:31:15 2025 +1000 + + Create replacement ifaddrs.h if needed. + + Remove #ifdef HAVE_IFADDRS_H wrapper. ok djm@ + +commit 53887d8ebc583b51e996cb2bdeb11e054d36343b +Author: Darren Tucker +Date: Fri Sep 5 17:27:43 2025 +1000 + + Create replacement util.h if needed. + + Remove #ifdef HAVE_UTIL_H wrapper. ok djm@ + +commit 5f09983d1e724097bd577097fb0f2c00c2436f21 +Author: Darren Tucker +Date: Fri Sep 5 17:24:50 2025 +1000 + + Create replacement paths.h if needed. + + Remove #ifdef HAVE_PATHS_H wrapper. ok djm@ + +commit d45b17dc5a0598dda2b11dc89598203408d2d59c +Author: Darren Tucker +Date: Fri Sep 5 17:17:52 2025 +1000 + + Create replacement poll.h if needed. + + Remove #ifdef HAVE_POLL_H wrapper. ok djm@ + +commit 9b2c5a2db0650e394597839ef00d797f57568937 +Author: Darren Tucker +Date: Fri Sep 5 17:06:14 2025 +1000 + + Fill in missing system header files. + + Create replacement header files inside openbsd-compat for common headers + that are missing on a given platform. Usually these are just empty, + but in some cases they'll include the equivalent file. This avoids + having to wrap those includes in '#ifdef HAVE_FOO_H' and reduces the + diff vs OpenBSD. + + If we create any such headers, add the path to includes. + + Initially just stdint.h, more to follow. + + ok djm@ + +commit f64701ca25795548a61614d0b13391d6dfa7f38c +Author: djm@openbsd.org +Date: Thu Sep 4 03:04:44 2025 +0000 + + upstream: repair test after changes to percent expansion of usernames + + on the commandline. + + Test more cases that should/shouldn't expand and lightly test + username validity checks. + + OpenBSD-Regress-ID: ad4c12c70bdf1f959abfebd1637ecff1b49a484c + +commit 45698669d49949868b1f3d13dfda1b7cb70060ad +Author: djm@openbsd.org +Date: Thu Sep 4 00:37:10 2025 +0000 + + upstream: unit tests for sshbuf_equals and sshbuf_dtourlb64; ok + + deraadt@ + + OpenBSD-Regress-ID: bab54e2d4caa813036a63ee67e92c93e6712a5b9 + +commit 4be445116f1b56f14254b98d8b132bb25777e160 +Author: djm@openbsd.org +Date: Thu Sep 4 00:34:17 2025 +0000 + + upstream: unit tests for a bunch of misc.c functions; ok deraadt@ + + OpenBSD-Regress-ID: 886cf142605405e777ee77a96b48694dc2e9235d + +commit e3699ff47df336f57da2e78188d0057f8368af56 +Author: djm@openbsd.org +Date: Thu Sep 4 00:32:31 2025 +0000 + + upstream: fix sshbuf_dtourlb64() to not choke on empty buffers; + + previously it incorrectly returned an error in this situation; ok deraadt + + OpenBSD-Commit-ID: e62773d6e8cb95a19aab54f0af0edbcd47b345c0 + +commit 8e85ad33cfcc71e03594e53f2e19d8ce2e27dcc6 +Author: djm@openbsd.org +Date: Thu Sep 4 00:31:49 2025 +0000 + + upstream: fix rtrim() function to not attempt to delete whitespace + + inside a string, just at the end. ok deraadt@ + + OpenBSD-Commit-ID: d44deaa43580cd88de978dd5509b14e905b67b84 + +commit 43b3bff47bb029f2299bacb6a36057981b39fdb0 +Author: djm@openbsd.org +Date: Thu Sep 4 00:30:06 2025 +0000 + + upstream: don't allow \0 characters in url-encoded strings. + + Suggested by David Leadbeater, ok deraadt@ + + OpenBSD-Commit-ID: c92196cef0f970ceabc1e8007a80b01e9b7cd49c + +commit 35d5917652106aede47621bb3f64044604164043 +Author: djm@openbsd.org +Date: Thu Sep 4 00:29:09 2025 +0000 + + upstream: Improve rules for %-expansion of username. + + Usernames passed on the commandline will no longer be subject to + % expansion. Some tools invoke ssh with connection information + (i.e. usernames and host names) supplied from untrusted sources. + These may contain % expansion sequences which could yield + unexpected results. + + Since openssh-9.6, all usernames have been subject to validity + checking. This change tightens the validity checks by refusing + usernames that include control characters (again, these can cause + surprises when supplied adversarially). + + This change also relaxes the validity checks in one small way: + usernames supplied via the configuration file as literals (i.e. + include no % expansion characters) are not subject to these + validity checks. This allows usernames that contain arbitrary + characters to be used, but only via configuration files. This + is done on the basis that ssh's configuration is trusted. + + Pointed out by David Leadbeater, ok deraadt@ + + OpenBSD-Commit-ID: e2f0c871fbe664aba30607321575e7c7fc798362 + +commit f38a552dc71f20df2544338099e3fe2563f1a9ca +Author: Damien Miller +Date: Wed Sep 3 09:42:39 2025 +1000 + + missing header + +commit cc4eb3d6943cb57e08ab3abbcf92644deb429e46 +Author: djm@openbsd.org +Date: Tue Sep 2 11:08:34 2025 +0000 + + upstream: simplify algorithm list functions using xextendf(); ok + + dtucker@ + + OpenBSD-Commit-ID: ffc5f8d0c25b95705a8a66c8b634f98d23bd92dc + +commit 8866d24cdd1d6e73bb3220b753f94e255c49ff96 +Author: djm@openbsd.org +Date: Tue Sep 2 11:04:58 2025 +0000 + + upstream: unit test for xextendf() + + OpenBSD-Regress-ID: ddb3b4db1a52dda23696b967470882fe2b9c3af7 + +commit 2f369d3fd0ff3715c2b32dff5cb35c0330272445 +Author: djm@openbsd.org +Date: Tue Sep 2 09:41:23 2025 +0000 + + upstream: fix comment on sshbuf_froms() - it *returns* an error + + code, the allocated buffer is passed via argument + + OpenBSD-Commit-ID: b2b0a76df71328f39c3e2ad941a4d87085d8335d + +commit 6fd93060bb2ec35a7f0bf96d1a74104bab49e017 +Author: djm@openbsd.org +Date: Tue Sep 2 09:40:19 2025 +0000 + + upstream: GssStrictAcceptor was missing from sshd -T output; fix + + OpenBSD-Commit-ID: 6014049ccfedc48a208e37d5488ade6bdc2d1c44 + +commit d94a9a8c54e9036961c1100c6f445c50ab9b6b40 +Author: Damien Miller +Date: Tue Sep 2 19:38:39 2025 +1000 + + portable-specific comment grammer/spelling fixes + +commit a0b095fa03d3c08d723a803ce25540fddd955c53 +Author: djm@openbsd.org +Date: Tue Sep 2 09:34:48 2025 +0000 + + upstream: grammar and typos in comments + + OpenBSD-Commit-ID: de954daffcd0147ce142d55e8a374810cd19d7ed + +commit 23a2bb750547a9a5251cbc44c5ceb1d05303befe +Author: Damien Miller +Date: Tue Sep 2 19:30:07 2025 +1000 + + replace remaining manual logging of __func__ + + Use the appropriate log macro that prepends the function name + (e.g. logit_f/debug2_f/etc). + +commit a9b0b69f15e63bc4e8c8b38e24ee85ea076a7e11 +Author: djm@openbsd.org +Date: Tue Sep 2 09:26:21 2025 +0000 + + upstream: replace remaining cases where we manually included __func__ + + in a debug or error log with the respective *_f log variant + + OpenBSD-Commit-ID: 46a280d78bcc0bc98f28e65a30b613366600328f + +commit 19f7cb39eecb4b8f768f37e8294dc3a9142e022b +Author: djm@openbsd.org +Date: Mon Sep 1 23:55:29 2025 +0000 + + upstream: test MaxStatups idempotency; ok dtucker@ + + OpenBSD-Regress-ID: b5d713c2709000fa5e41d82c0cf8627e13cb43f9 + +commit c357c4a1e626feba9a968b5f0cb832b989b2d433 +Author: djm@openbsd.org +Date: Thu Aug 21 05:55:30 2025 +0000 + + upstream: benchmark more diffie-hellman-group* KEXs + + use current KEX names, i.e. remove the "@openssh.com" where the KEX + has been standardised + + OpenBSD-Regress-ID: a67e9da4efd9a971d39cb2481093f836046f9b7f + +commit 9313233a735733821dfd170b70782fb7da492962 +Author: djm@openbsd.org +Date: Tue Sep 2 01:03:43 2025 +0000 + + upstream: fix previous + + OpenBSD-Commit-ID: 09d95dfb5e064a1d0e74afba8d77474cc1d110a4 + +commit 683d0abe596b069a896f1688f86256f1beeb0cdc +Author: djm@openbsd.org +Date: Mon Sep 1 23:53:16 2025 +0000 + + upstream: Make MaxStartups and PerSourceNetBlockSize first-match-wins + + as advertised. bz3859 reported by jan.v.hofmann; ok dtucker + + OpenBSD-Commit-ID: 08f7786f1b3b4a05a106cdbd2dc5f1f2d8299447 + +commit a9a3f025d76f06a6601e6e8d52b468ec467865d9 +Author: djm@openbsd.org +Date: Fri Aug 29 03:50:38 2025 +0000 + + upstream: remove experimental support for XMSS keys; + + ok deraadt markus + + OpenBSD-Commit-ID: 38eaf4df6189acad9e46eddf7cf32d7f6d07df35 + +commit 908e9d55139bed19ed87d6fec749974eb42702c6 +Author: caspar@openbsd.org +Date: Mon Aug 18 18:39:33 2025 +0000 + + upstream: ssh_config.5: say "post-quantum" instead of "post quantum + + safe", and rephrase the sentence to make it easier to read. + + Input djm@, input and OK deraadt@, OK dtucker@ + + OpenBSD-Commit-ID: c3ee4d1cafdcfc20cc0d2f086021efce4b19c075 + +commit ceca966bde4ab38b2434876416da12fe16747459 +Author: job@openbsd.org +Date: Mon Aug 18 09:16:36 2025 +0000 + + upstream: Delete unused accessor function + + OK dtucker@ + + OpenBSD-Commit-ID: 93b59ac088fb254e1189729ece5bb9656d6e810b + +commit 3ef1a87d0a29eac94f32371af628e81eb2e2d817 +Author: Damien Miller +Date: Mon Aug 18 17:00:26 2025 +1000 + + Fix pledge(2) special casing + + Unbreaks non-OpenBSD platforms + +commit 5e9ca80fe65e407428dc46ed45804724d08b91b7 +Author: Damien Miller +Date: Mon Aug 18 16:47:23 2025 +1000 + + Match version instead of groups in connect-bigconf + + The connect-bigconf makes a giant config file to test config passing + between the sshd subprocesses. Previously it used a bunch of "Match + group" lines to construct a large file. However checking group + membership can be expensive (e.g. if a large groups database is + present or if group lookup is remote via NSS). This could be slow + enough to exceed LoginGraceTime. + + This switches it to "Match version" which is just a string compare + and does just as well for making a giant nonsense config file. + +commit 6c84609e5f9ddd49e250d5cf190b2820dbeca178 +Author: Damien Miller +Date: Mon Aug 18 16:47:00 2025 +1000 + + depend + +commit 9184fa363687fcb5dac056b093fb3b8e9d327242 +Author: Damien Miller +Date: Mon Aug 18 16:45:15 2025 +1000 + + check for setsockopt IP_TOS in OpenBSD pledge + + OpenBSD has recently relaxed the pledge(2) sandbox to allow some + setsockopt options to be changed without the "inet" promise. + + This adds compatibility for OpenBSD that predates this relaxation. + +commit ae44cd74f3a4ac711152f50b2712803ccf785593 +Author: djm@openbsd.org +Date: Mon Aug 18 04:50:35 2025 +0000 + + upstream: cast + + OpenBSD-Commit-ID: d69bd2328513c2dcd99f4f346b77e2bd90cf1964 + +commit c2c8bae39380392449ac3297061cbfc486126ad5 +Author: djm@openbsd.org +Date: Mon Aug 18 04:38:21 2025 +0000 + + upstream: missing set_log_handler() call in ssh-auth.c, exposed after + + last commit + + OpenBSD-Commit-ID: 09f5c3cf33c18b8ad321edbf96c30ae3deada2b0 + +commit 056022261e6cf7eb65bbacac72afe5f4d5945f2c +Author: Damien Miller +Date: Mon Aug 18 14:22:32 2025 +1000 + + depend + +commit b7ee13fbbb4ebafcf71f29685f053ecb97d1bcef +Author: Damien Miller +Date: Mon Aug 18 14:22:18 2025 +1000 + + wrap SIGINFO in ifdef + +commit 289239046b2c4b0076c14394ae9703a879e78706 +Author: djm@openbsd.org +Date: Mon Aug 18 03:43:01 2025 +0000 + + upstream: Make ssh(1) and sshd(8) set IP QoS (aka IP_TOS, IPV6_TCLASS) + + continually at runtime based on what sessions/channels are open. + + Previously, ssh(1) and sshd(8) would pick a QoS value when they + were started and use it for the whole connection. This could + produce suboptimal choices for the QoS value, e.g. for multiplexed + sessions that started interactive but picked up a sftp client, + or sessions that moved large amounts of data via port forwarding. + + Now the QoS value will change to the non-interactive IPQoS whenever + a "non-interactive" channel is open; basically any channel that lacks + a tty other than agent forwarding. + + This is important now that the default interactive IPQoS is EF + (Expedited Forwarding), as many networks are configured to allow + only relatively small amounts of traffic of this class and they will + aggressively deprioritise the entire connection if this is exceeded. + + NB. because ssh(1) and sshd(8) now change IP_TOS/IPV6_TCLASS + continually via setsockopt(), this commit requires a recent pledge(2) + change that landed recently in the OpenBSD kernel. Please ensure + you have updated to a kernel from within the last two weeks before + updating OpenSSH. + + with job@ deraadt@ + + OpenBSD-Commit-ID: 325fc41717eecdf5e4b534bfa8d66817425b840f + +commit dc5147028ff19213a32281dad07bba02e58da3fa +Author: djm@openbsd.org +Date: Mon Aug 18 03:29:11 2025 +0000 + + upstream: SIGINFO handler for sshd(8) to dump active + + channels/sessions ok deraadt@ + + OpenBSD-Commit-ID: 9955cb6d157c6d7aa23a819e8ef61b1edabc8b7d + +commit f807a598c96be683d97810481e954ec9db6b0027 +Author: djm@openbsd.org +Date: Mon Aug 18 03:28:36 2025 +0000 + + upstream: SIGINFO handler for ssh(1) to dump active + + channels/sessions ok deraadt@ + + OpenBSD-Commit-ID: 12f88a5044bca40ef5f41ff61b1755d0e25df901 + +commit 9b61679d73a8a001c25ab308db8a3162456010cf +Author: djm@openbsd.org +Date: Mon Aug 18 03:28:02 2025 +0000 + + upstream: add channel_report_open() to report (to logs) open + + channels; ok deraadt@ (as part of bigger diff) + + OpenBSD-Commit-ID: 7f691e25366c5621d7ed6f7f9018d868f7511c0d + +commit 80b5ffd22abd4093201939e31d1ea6dc8cc7913a +Author: djm@openbsd.org +Date: Mon Aug 18 01:59:53 2025 +0000 + + upstream: make -E a no-op in sshd-auth. Redirecting logging to a + + file doesn't work in this program as logging already goes via the parent + sshd-session process. ok dtucker@ + + OpenBSD-Commit-ID: 73325b9e69364117c18305f896c620a3abcf4f87 + +commit 3a039108bd25ff10047d7fa64750ed7df10c717c +Author: Damien Miller +Date: Mon Aug 18 13:46:37 2025 +1000 + + allow some socket syscalls in seccomp sandbox + + Allow getsockname(2), getpeername(2) and getsockopt(2). + + Also allow setsockopt(2) but only IP_TOS and IPV6_TCLASS. + + Note that systems that use the older socketcall(2) mux syscall will + not have IP_TOS and IPV6_TCLASS allowlisted. On these platforms, + these calls will be soft-blocked (i.e. will fail rather than + terminate the whole process with a sandbox violation). + + Needed for upcoming IPQoS change; ok dtucker@ + +commit a00f5b02e171bc6d6fb130050afb7a08f5ece1d8 +Author: Damien Miller +Date: Mon Aug 18 13:44:53 2025 +1000 + + handle futex_time64 properly in seccomp sandbox + + Previously we only allowed __NR_futex, but some 32-bit systems + apparently support __NR_futex_time64. We had support for this + in the sandbox, but because of a macro error only __NR_futex was + allowlisted. + + ok dtucker@ + +commit 32deb00b38b4ee2b3302f261ea1e68c04e020a08 +Author: dtucker@openbsd.org +Date: Thu Aug 14 10:03:44 2025 +0000 + + upstream: Cast serial no for %lld to prevent compiler warnings on some + + platforms. + + OpenBSD-Commit-ID: afadd741622f16c6733d461c0d6053ed52868a57 + +commit 883886c959ecab152650e231335857eb3193c662 +Author: dtucker@openbsd.org +Date: Thu Aug 14 09:44:39 2025 +0000 + + upstream: Cast serial no for %lld to prevent compiler warnings on some + + platforms. + + OpenBSD-Commit-ID: 46c6063284d318f7e4dc922479a3e394c94b0588 + +commit fde5a4d2cd01bea700439fa6d5bbad88e65c99bd +Author: dtucker@openbsd.org +Date: Thu Aug 14 09:26:53 2025 +0000 + + upstream: Cast serial no for %lld to prevent compiler warnings on some + + platforms. + + OpenBSD-Commit-ID: 15644234b58abc9c6da2994f0422a5aa344a9e89 + +commit ab5074dfb614e3801fecbd376d8ed4cea613c629 +Author: sthen@openbsd.org +Date: Tue Aug 12 11:09:48 2025 +0000 + + upstream: fix typo, ok markus dtucker + + OpenBSD-Commit-ID: 8f223da7633752162c64a659c6cf55202703d870 + +commit 8b6c1f402feb9eb6438003a312d7ffe8d5669896 +Author: deraadt@openbsd.org +Date: Mon Aug 11 14:37:43 2025 +0000 + + upstream: Handle localtime_r() failure by return "UNKNOWN-TIME" + + which is only used in user-visible contexts. freebsd 288773 shows their + localtime_r() has failed at least once for unknown reason. discussed with djm + + OpenBSD-Commit-ID: 68f4c92d46b2578d4594b0ed940958d597fd61ac + +commit 0e1b8aa27f7c86d412c9e54ad9e2cae30d9ddab4 +Author: djm@openbsd.org +Date: Mon Aug 11 10:55:38 2025 +0000 + + upstream: ssh(1): add a warning when the connection negotiates a + + non-post quantum safe key agreement algorithm. + + Controlled via a new WarnWeakCrypto ssh_config option, defaulting + to on. This option might grow additional weak crypto warnings in + the future. + + More details at https://openssh.com/pq.html + + mostly by deraadt@ feedback dtucker@ ok deraadt@ + + OpenBSD-Commit-ID: 974ff243a1eccceac6a1a9d8fab3bcc89d74a2a4 + +commit 2ebc6384258b58ace0ad2adb2593744f62749235 +Author: djm@openbsd.org +Date: Wed Aug 6 23:44:09 2025 +0000 + + upstream: all state related to the ssh connection should live in + + struct ssh or struct packet_state; one static int escaped this rule, so move + it to struct packet_state now. + + ok millert tb + + OpenBSD-Commit-ID: bd6737168bf61a836ffbdc99ee4803468db90a53 + +commit 60b909fb110f77c1ffd15cceb5d09b8e3f79b27e +Author: dtucker@openbsd.org +Date: Wed Aug 6 11:22:53 2025 +0000 + + upstream: Improve sentence. ok djm@ + + OpenBSD-Commit-ID: 9c481ddd6bad110af7e530ba90db41f6d5fe2273 + +commit 9ffa98111dbe53bf86d07da8e01ded8c5c25456b +Author: djm@openbsd.org +Date: Wed Aug 6 04:53:04 2025 +0000 + + upstream: when refusing a certificate for user authentication, log + + enough information to identify the certificate in addition to the reason why + it was being denied. Makes debugging certificate authz problems a bit easier. + + ok dlg@ + + OpenBSD-Commit-ID: 4c4621b2e70412754b3fe7540af8f4bf02b722b1 + +commit 2a31009c36eb2da412c2784fe131fcb6ba800978 +Author: job@openbsd.org +Date: Tue Aug 5 09:08:16 2025 +0000 + + upstream: Use the operating system default DSCP marking for + + non-interactive traffic + + It seems the CS1 traffic class mark is considered ambiguous and therefore + somewhat unhelpful (see RFC 8622 for more considerations). But, the new + 'LE' scavenger class (also proposed in RFC 8622) offers high probability + of excessive delays & high packet loss, which would be inappropriate + for use with, for example, X11 forwardings. In fact, it is not known to + SSH what's appropriate because SSH is not aware of the content of what + passing through session forwardings. Therefore, no marking is appropriate. + Non-interactive traffic simply is best effort. + + OK djm@ deraadt@ + + OpenBSD-Commit-ID: db1da1a432ecd53fc28feb84287aedb6bec80b01 + +commit 6ebd472c391a73574abe02771712d407c48e130d +Author: djm@openbsd.org +Date: Tue Aug 5 04:00:15 2025 +0000 + + upstream: a bunch of the protocol extensions we support now have RFCs + + and I-Ds that are more complete and detailed than what we have in the + PROTOCOL.* files. Refer to these when possible instead of documenting them + here. + + OpenBSD-Commit-ID: 4fa5b0fcf5d5f24093d33d9e82c7ca4850d50d70 + +commit ec3465f59c651405e395092f3ad606f8992328d8 +Author: job@openbsd.org +Date: Thu Jul 31 11:23:39 2025 +0000 + + upstream: Deprecate support for IPv4 type-of-service (TOS) IPQoS + + keywords + + Type of Service (ToS) was deprecated in the late nineties and replaced + with the Differentiated Services architecture. Diffserv has significant + advantages for operators because this mechanism offers more granularity. + + OpenSSH switched its default IPQoS from ToS to DSCP values in 2018. + + IPQoS configurations with 'lowdelay', 'reliability', or 'throughput' will be + ignored and instead the system default QoS settings apply. Additionally, a + debug message is logged about the deprecation with a suggestion to use DSCP. + + with/OK deraadt@ sthen@ djm@ + + OpenBSD-Commit-ID: 40c8c0c5cb20151a348728703536af2ec1c754ba + +commit 65909fa114e7dd7511800db2b7bacb8774afe887 +Author: job@openbsd.org +Date: Thu Jul 31 09:38:41 2025 +0000 + + upstream: Set default IPQoS for interactive sessions to Expedited + + Forwarding (EF) + + Marking interactive session data with DSCP value EF (RFC3246, RFC3247) + helps inform the network on relative priority compared to other traffic. + This is especially useful for differentiated treatment over wireless media. + + Following the reconciled IETF Diffserv to IEEE 802.11 mappings (RFC 8325), + traffic marked with DSCP value EF maps to User Priority 6 in QoS Control, + in turn mapping to the high priority WMM AC_VO access category. + + OK djm@ + + OpenBSD-Commit-ID: aadda7b9da794d70d7c6b381a861a0610afce1b3 + +commit d1c6c67a50fc957010fa027c6ab970424e9b9142 +Author: Darren Tucker +Date: Sat Aug 2 14:49:00 2025 +1000 + + Disable security key tests for bigendian interop + +commit e85248df3f1073343da87a6b00512e6a1e4a863d +Author: Darren Tucker +Date: Sat Aug 2 12:51:42 2025 +1000 + + Comment out atime restore test. + + This works on filesystems mounted 'noatime', but on others the stat() + resets atime causing the test to fail. + +commit b1c4cedbee107dc611ce091f27ea9f1de28ee378 +Author: Darren Tucker +Date: Fri Aug 1 19:29:00 2025 +1000 + + Replace fbsd64ppc VM with physical host. + + Run 64bit bigendian interop test on NetBSD arm64be instead. + +commit 284abbed9a8d815b1ec5e96aff885d77e26537e7 +Author: dtucker@openbsd.org +Date: Wed Jul 30 10:17:13 2025 +0000 + + upstream: Plug leak in case where sigp is passed as NULL. Coverity CID + + 483725, ok djm@ + + OpenBSD-Commit-ID: 47cf7b399c84e102b670b9f97ab6926c9a7256b5 + +commit dc630e6d81be8aa495254839731e4f3521cf9e31 +Author: djm@openbsd.org +Date: Wed Jul 30 04:27:42 2025 +0000 + + upstream: unbreak WITH_OPENSSL=no builds, also allowing ed25519 + + keys to be used via PKCS#11 when OpenSSH is built without libcrypto. + + OpenBSD-Commit-ID: ecf26fdf7591bf2c98bac5136fbc36e0b59c3fc2 + +commit a5bec2cdfc4f38ddb6211809851aae29ba99a35a +Author: djm@openbsd.org +Date: Wed Jul 30 04:19:17 2025 +0000 + + upstream: fix variable name in disabled code + + OpenBSD-Commit-ID: 5612e979575d5da933c8b720d296423fd84392f5 + +commit 5e4bfe6c16924b1c21a733f3e218cfcba98e301e +Author: Damien Miller +Date: Sat Jul 26 19:19:46 2025 +1000 + + more ec/ed25519 fixing + +commit 2603098959eff55cbe188c3dfcbe5302808a80fc +Author: Damien Miller +Date: Sat Jul 26 14:27:53 2025 +1000 + + repair build for libcrypto without ed25519 support + +commit a729163c56ecc002c0cb04db56e7d86ceec2e8b0 +Author: djm@openbsd.org +Date: Sat Jul 26 01:53:31 2025 +0000 + + upstream: regression tests for Ed25519 keys in PKCS#11 tokens + + OpenBSD-Regress-ID: 50067c0716abfea3a526b4a0c8f1fe15e7665c0f + +commit 361ff0ca308ac02449e71689fc5ea72114db43db +Author: djm@openbsd.org +Date: Sat Jul 26 01:51:44 2025 +0000 + + upstream: Support ed25519 keys hosted on PKCS#11 tokens. + + Tested on Yubikeys and against SoftHSM2. + + feedback/ok tb@ + + OpenBSD-Commit-ID: 90ddb6529f2e12e98e8bba21d8592e60579ce2e4 + +commit 2b530cc3005a71c5ba6b712978872fc9c147439c +Author: djm@openbsd.org +Date: Fri Jul 25 13:06:07 2025 +0000 + + upstream: update our PKCS#11 API header to v3.0; + + feedback/ok tb@ + + OpenBSD-Commit-ID: e67fa6a26e515c2b1fb7b0d1519d138aafb3e017 + +commit 550d2a4a66c50f7641563a63b900761d99efb24a +Author: Damien Miller +Date: Fri Jul 25 23:04:33 2025 +1000 + + another attempt at fixing !EC builds + +commit ed1e370d84e9dc39bc31c19cca12222d991fdc6f +Author: dtucker@openbsd.org +Date: Fri Jul 25 11:50:45 2025 +0000 + + upstream: Don't snprintf a NULL since not all platforms support it. + + OpenBSD-Commit-ID: 6e0c268e40047e96fab6bc56dc340580b537183b + +commit eedab8db12d57c4f4583f6b60e48a4ce25b47b9c +Author: Damien Miller +Date: Fri Jul 25 16:21:43 2025 +1000 + + unbreak !EC builds + +commit 203f5ac6cfa0e257db7509d4bb830e8a4bba6211 +Author: djm@openbsd.org +Date: Thu Jul 24 06:04:47 2025 +0000 + + upstream: test code now needs to link ssh-pkcs11-client.c any time + + sshkey.c is included + + OpenBSD-Regress-ID: 9d07188eae9a96801c3150b3433bb220626d4443 + +commit 33b4f05c8ddab24aa6c47afb313b8cbd0d4b77f4 +Author: Damien Miller +Date: Fri Jul 25 12:47:17 2025 +1000 + + update clang-16 -> clang-19 + +commit 03e9e993ef1ef5accc6457152278cab5988f9b3d +Author: Damien Miller +Date: Fri Jul 25 12:46:59 2025 +1000 + + include ssh-pkcs11-client.o as common dep + +commit 2f5269938a8e4769f484c9d45419a86529078ede +Author: Damien Miller +Date: Fri Jul 25 12:46:10 2025 +1000 + + remove vestigial stub + +commit bf33a73c40522ce60961d4fff316a7187fb06ca0 +Author: djm@openbsd.org +Date: Thu Jul 24 23:27:04 2025 +0000 + + upstream: this should include stdlib.h explicitly + + OpenBSD-Commit-ID: 1c0cc5c3838344b33ae4ab7aa62c01530357bf29 + +commit 9f8ccc3b81b53324cc489f3fe00f03c329c0acb2 +Author: djm@openbsd.org +Date: Thu Jul 24 06:59:51 2025 +0000 + + upstream: less stale reference to PKCS#1 1.5 hash OIDs; feedback + + from tb@ + + OpenBSD-Commit-ID: 9fda77978491a130a7b77d87d40c79277b796721 + +commit 1641ab8744f500f55f12155d03f1a3116aaea374 +Author: djm@openbsd.org +Date: Thu Jul 24 06:12:08 2025 +0000 + + upstream: factor out encoding of a raw ed25519 signature into its + + ssh form into a separate function + + OpenBSD-Commit-ID: 3711c6d6b52dde0bd1f17884da5cddb8716f1b64 + +commit a8c0e5c871c0c7ee5ae93e353b1499a53c09c71d +Author: djm@openbsd.org +Date: Thu Jul 24 05:44:55 2025 +0000 + + upstream: Help OpenSSH's PKCS#11 support kick its meth habit. + + The PKCS#11 code in OpenSSH used the libcrypto public key method API + (e.g. the delightfully named RSA_meth_free()) to delegate signing + operations to external keys. This had one advantage - that it was + basically transparent to callers, but also had a big disadvantage - + that we'd manually have to track the method implementations, their + state and their relationships to the underlying PKCS#11 objects. + + This rips this out and replaces it with explicit delegation to + PKCS#11 code for externally hosted keys via the ssh-pkcs11-helper + subprocess. This is very similar to how we handle FIDO keys in + OpenSSH (i.e. via ssh-sk-helper). All we need to track now is a + much simpler mapping of public key -> helper subprocess. + + Kicking our libcrypto meth dependency also makes it much easier + to support Ed25519 keys in PKCS#11, which will happen in a subsequent + commit. + + feedback / ok tb@ + + OpenBSD-Commit-ID: a5a1eaf57971cf15e0cdc5a513e313541c8a35f0 + +commit 259c66aebe4e1f9d60e548f728ff74083bcccddf +Author: Darren Tucker +Date: Thu Jul 24 22:02:49 2025 +1000 + + Remove DEBUG_ACTIONS variable. + + If needed it can be set in github if needed. + +commit 40fb2dc4ece76c8f0c624d90a17bc1bbf47f3729 +Author: djm@openbsd.org +Date: Wed Jul 23 05:07:19 2025 +0000 + + upstream: add a ssh_config RefuseConnection option that, when + + encountered while processing an active section in a configuration file, + terminates ssh(1) with an error message that contains the argument to the + option. + + This may be useful for expressing reminders or warnings in config + files, for example: + + Match host foo + RefuseConnection "foo is deprecated, use splork instead" + + ok djg + + OpenBSD-Commit-ID: 5b0072fcd08ad3932ab21e27bbaa66b008d44237 + +commit defc806574d2256036d69a291caf0f3484844de6 +Author: miod@openbsd.org +Date: Sat Jul 12 05:28:33 2025 +0000 + + upstream: Add missing inter-library dependencies to LDADD and + + DPADD. ok tb@ deraadt@ + + OpenBSD-Commit-ID: a05e13a7e2c0b65bb4b47184fef731243431c6ff + +commit e6805e2a6b33e001e1a7257b85ab779fd592a578 +Author: Jan Tojnar +Date: Thu May 18 16:30:35 2023 +0200 + + Add gnome-ssh-askpass4 for GNOME 40+ + + GTK 3 has been in maintenance mode for a while now, and it is on the road + to being abandoned. As a result, the dialogue looks out of place on modern + systems. + + We could port it to GTK 4 but without the program being registered as an + application (i.e. having a .desktop file), GNOME Shell would ask for + permission to grab input every time. + + Let’s instead use the GNOME Shell’s native prompt through the unstable + Gcr API. + +commit f9dc519259804702cab0fa0ca8b193a360e3ec38 +Author: Damien Miller +Date: Fri Jul 11 17:20:27 2025 -0700 + + let ga_init() fail gracefully if getgrouplist does + + Apparently getgrouplist() can fail on OSX for when passed a non-existent + group name. Other platforms seem to return a group list consisting of + the numeric gid passed to the function. + + This makes ga_init() handle this failure case gracefully, where it will + return success but with an empty group list array. + + bz3848; ok dtucker@ + +commit f01a899b92ab8c5e6ff71214658bd09636c47e87 +Author: djm@openbsd.org +Date: Fri Jul 11 23:26:59 2025 +0000 + + upstream: add a "Match Group NoSuchGroup" to exercise groupaccess.c + + OpenBSD-Regress-ID: 7ff58e6f0eb21eb9064dd0cfa78c3b6f34b5f713 + +commit 1052fa62b35e0bb25b0c1efb9fdd7870e4a68ab6 +Author: Damien Miller +Date: Fri Jul 11 15:36:49 2025 -0700 + + more diagnostics when getgrouplist fails + +commit eddd1d2daa64a6ab1a915ca88436fa41aede44d4 +Author: djm@openbsd.org +Date: Fri Jul 4 09:51:01 2025 +0000 + + upstream: Fix mistracking of MaxStartups process exits in some + + situations. At worst, this can cause all MaxStartups slots to fill and sshd + to refuse new connections. + + Diagnosis by xnor; ok dtucker@ + + OpenBSD-Commit-ID: 10273033055552557196730f898ed6308b36a78d + +commit c971f3d93efe4c00d73b276cdbab66e7c66c9b5c +Author: Darren Tucker +Date: Sat Jul 5 20:50:50 2025 +1000 + + Add include for gssapi definitions. + + Patch from dbelyavs at redhat.com via bz#3846. + +commit 007b69f21cf9e64125b241d4411a5e47f5028aa8 +Author: djm@openbsd.org +Date: Fri Jul 4 07:52:17 2025 +0000 + + upstream: add a regress test for configurations > 256KB + + mostly by Dmitry Belyavskiy + + OpenBSD-Regress-ID: fcedb249e4cf2447e078a839877f99730ee79024 + +commit 0cf38d74463bcf80510e7fd1b3d9328e7d91eb00 +Author: djm@openbsd.org +Date: Fri Jul 4 07:47:35 2025 +0000 + + upstream: the messaging layer between sshd-session and sshd-auth had a + + maximum message size of 256KB. Some people apparently have configurations + larger than this and would hit this limit. + + Worse, there was no good logging that could help diagnose what was + going wrong. + + So this bumps the maximum message size to 4MB and implements an early + check (usable via the sshd -t test mode) that will report it to the + user where it is hopefully more visible. + + bz3808, reported by Dmitry Belyavskiy, ok dtucker@ + + OpenBSD-Commit-ID: 69c303fb68cbd1a4735936835d67a71e7b57f63b + +commit fd10cea0f16e928ae2b52fbeadccd475d0438eb4 +Author: djm@openbsd.org +Date: Fri Jul 4 00:17:55 2025 +0000 + + upstream: mux: fix incorrect return value check in local forward + + cancellation + + channel_cancel_lport_listener() returns 1 on success and 0 on failure. + The previous code incorrectly checked for `== -1`, a value the function + never returns, so failure was not detected and the "port not found" + error message was never shown when cancelling dynamic or local port + forwards. + + From: Boris Tonofa + + OpenBSD-Commit-ID: 3e9d2252a4d0bd318d4f25e2b518afb44acea170 + +commit 29cf521486bf97ab9de5b9b356f812107e0671bc +Author: Damien Miller +Date: Wed Jul 2 13:47:38 2025 +1000 + + wrap some autoconf macros in AC_CACHE_CHECK + + This allows skipping/overriding the OSSH_CHECK_CFLAG_COMPILE and + OSSH_CHECK_CFLAG_LINK macros used to discover supported compiler + or linker flags. E.g. + + $ ./configure ossh_cv_cflag__fzero_call_used_regs_used=no + [...] + checking if cc supports compile flag -ftrapv and linking succeeds... yes + checking if cc supports compile flag -fzero-call-used-regs=used and linking succeeds... (cached) no + checking if cc supports compile flag -ftrivial-auto-var-init=zero... yes + + Patch from Colin Watson, ok dtucker@ + +commit b28e91aff80fd24341de8cb3c34dc454d6b75228 +Author: dtucker@openbsd.org +Date: Sun Jun 29 08:20:21 2025 +0000 + + upstream: Add shebang path to askpass script. Required for exec on + + some platforms (musl, probably others). + + OpenBSD-Regress-ID: 35cdeed12ae701afcb812f800c04d817325cd22a + +commit 83d3ffc0fc0f5e4473ab43f0d42a1cf9497ce0b5 +Author: dtucker@openbsd.org +Date: Sun Jun 29 05:35:00 2025 +0000 + + upstream: Check dropbear server version for required features. + + Dropbear added the '-D' flag in version 2025.87. We need that for the + dropbear-server test, so skip on older versions. + + OpenBSD-Regress-ID: 9db0b84edd54d3c00ab17db1dc6d62af4644c550 + +commit 0b17d564cfae82f2a52e9b4d588657da47ea4e43 +Author: Darren Tucker +Date: Sun Jun 29 14:34:48 2025 +1000 + + Encrypt temporary password we're setting. + + Now that we want to actually use the random password for tests, we need + to correctly encrypt it, instead of just setting it to a random string + that's not the "locked" value. + +commit 700205bd861c25cc7564010cf63d984d8db5098a +Author: Darren Tucker +Date: Sun Jun 29 11:27:17 2025 +1000 + + Fix env again. + +commit 223a1beac7b7be9252f69055781c9c15f4d8a607 +Author: Darren Tucker +Date: Sun Jun 29 11:24:42 2025 +1000 + + Move env again. + +commit d32614b448528ac08a65caac323a34b4f559a204 +Author: Darren Tucker +Date: Sun Jun 29 11:22:00 2025 +1000 + + Move env to where it (hopefully) belongs. + +commit 8a9384de483b8fb69a800e0347273686a5715fc3 +Author: Darren Tucker +Date: Sun Jun 29 11:14:18 2025 +1000 + + Enable password tests on Github ephemeral VMs. + +commit bcfe7340d9b622ecd978c87dbf885c8b5a503ca2 +Author: dtucker@openbsd.org +Date: Sat Jun 28 13:34:08 2025 +0000 + + upstream: Add simple regression test for dropbear as a server. + + OpenBSD-Regress-ID: 7abe1f6607d0cd49839918aade8f135d2462d389 + +commit 838d5ec4b12fb519ed9db76e5beccf11b7ee212f +Author: dtucker@openbsd.org +Date: Tue Jun 24 12:28:23 2025 +0000 + + upstream: Add simple test for password auth. Requires some setup + + so does not run by default. + + OpenBSD-Regress-ID: d5ded47a266b031fc91f99882f07161ab6d1bb70 + +commit 57fb460165ae3b2d591f2468d7fe13cc1abda26d +Author: djm@openbsd.org +Date: Tue Jun 17 01:24:32 2025 +0000 + + upstream: add RCS ID + + OpenBSD-Regress-ID: 6e30094e3bf0a1c65efb75c67a87093304a3e619 + +commit 688fa02728f2efbf18388bc1a8e94e7ba7ee4f11 +Author: djm@openbsd.org +Date: Tue Jun 24 09:22:03 2025 +0000 + + upstream: make "Match !final" not trigger a 2nd pass ssh_config + + parsing pass (unless hostname canonicalisation or a separate "Match final" + does). bz3843 + + ok dtucker@ + + OpenBSD-Commit-ID: ce82b6034828888f0f3f1c812e08f5e87400d802 + +commit 5ba8391d697740a838fd8811434f707f0e079baa +Author: djm@openbsd.org +Date: Thu Jun 19 05:49:05 2025 +0000 + + upstream: better debug diagnostics when loading keys. Will now list + + key fingerprint and algorithm (not just algorithm number) as well as making + it explicit which keys didn't load. + + OpenBSD-Commit-ID: ee3e77a0271ab502e653922c6d161b1e091f8fee + +commit b360f3a675e24b0dbb2ec30d985e3b6756996c0d +Author: djm@openbsd.org +Date: Tue Jun 17 01:20:17 2025 +0000 + + upstream: whitespace + + OpenBSD-Commit-ID: 6e96814bcf70d0edbb0749ec61cc4fd8707f286d + +commit ad38ec5f1b6768944d64ed7709da8706538b5509 +Author: djm@openbsd.org +Date: Tue Jun 17 01:19:27 2025 +0000 + + upstream: fix leak on error path; Coverity CID 481976 + + OpenBSD-Commit-ID: 963dba2c804e2fd8efea2256092899874d0dbc7b + +commit 5f761cdb2331a12318bde24db5ca84ee144a51d1 +Author: Darren Tucker +Date: Tue Jun 17 21:46:37 2025 +1000 + + Update obsd tests to use current images. + +commit 1e8347e3543a415067ccc556aefea97656ecafb7 +Author: Damien Miller +Date: Tue Jun 17 09:48:47 2025 +1000 + + add sshd-auth to RPM spec files + +commit dd800444943bd64913507f6005586136d49f63db +Author: dtucker@openbsd.org +Date: Mon Jun 16 09:09:42 2025 +0000 + + upstream: Limit each moduli size to a max of 100 entries. + + OpenBSD-Commit-ID: 747219d54565030ff7c45298b9f5e971801f6cb2 + +commit 05f7bf46d1e2c101e9cbdd3df2ccee484bed969f +Author: dtucker@openbsd.org +Date: Mon Jun 16 09:07:08 2025 +0000 + + upstream: Now that ssh-keygen defaults to the maximum memory for + + moduli generation we no longer need to run it twice to get enough. Use mkdir + -p instead of a conditional, which allows "make -jN" to work without error. + + OpenBSD-Commit-ID: c2eb57285424f819f9520fa33e0d6d3c4a361a5e + +commit df3f903d616763a105570610a616dacf0f83438e +Author: dtucker@openbsd.org +Date: Mon Jun 16 09:02:19 2025 +0000 + + upstream: Fix overflow check in sshbuf_dup_string. It's already + + constrained by SSHBUF_SIZE_MAX, but still worth fixing the check. Patch from + afonot via github PR#573, with & ok djm@ + + OpenBSD-Commit-ID: 438888498e66472fc6a48133196d6538d27bff18 + +commit 80916d0d3794e2f92dd6998d7c45daba484e4f18 +Author: dtucker@openbsd.org +Date: Mon Jun 16 08:53:04 2025 +0000 + + upstream: Plug mem leak. Patch from afonot via github PR#574, ok djm@ + + OpenBSD-Commit-ID: 65619f14ef206028ce39bc31f704b832a0609688 + +commit bd1bd7e8296aa51a4b3958cef2fbb17894ba94e9 +Author: dtucker@openbsd.org +Date: Mon Jun 16 08:49:27 2025 +0000 + + upstream: Save return value from sshbuf_len instead of calling it + + multiple times. Fixes Coverity CID 470521. + + OpenBSD-Regress-ID: 356b8b43c8a232deaf445c1ff7526577b177a8e9 + +commit 2827b6ac304ded8f99e8fbc12e7299133fadb2c2 +Author: dtucker@openbsd.org +Date: Fri Jun 13 07:35:14 2025 +0000 + + upstream: Plug leak. Coverity CID 405058. + + OpenBSD-Regress-ID: 7fb2fce68d2cb063cdb94d5d66f84fa3a2902792 + +commit 9cdc72b829e9f0e24dedc533cbe87291d8a88c9e +Author: dtucker@openbsd.org +Date: Fri Jun 13 07:23:07 2025 +0000 + + upstream: Remove dead code flagged by Coverity CID 307783. ok djm@ + + OpenBSD-Regress-ID: e579f5ec2fd2eb2fe2bad654d16f2ba655a3e035 + +commit 930a45ee759728c8ba711c45a2a985b8191bd297 +Author: dtucker@openbsd.org +Date: Thu Jun 12 10:09:39 2025 +0000 + + upstream: Set user, host and path to NULL immediately before calling + + parse_user_host_path in tests. This ensures that we don't accidentally use + the previous value if the function under test doesn't set them Also fixes + Coverity CIDs 405056 405065 405066. + + OpenBSD-Regress-ID: 43678ff59001712f32214fe303b1c21c163c2960 + +commit 2314d87f9b8b430532111fd6e5e8df0cf9068c9c +Author: dtucker@openbsd.org +Date: Thu Jun 12 09:26:57 2025 +0000 + + upstream: Plug mem leak on error path here too. + + Coverity CID 307781. + + OpenBSD-Regress-ID: 18e053d9b661fbb4227d3db03172077c1216bb2e + +commit 567ef4e7ddc5c1e7a461560963a1dc759669821d +Author: dtucker@openbsd.org +Date: Thu Jun 12 09:19:43 2025 +0000 + + upstream: Plug mem leak on error path. + + Coverity CID 307776. + + OpenBSD-Regress-ID: c44246690973e1b8643e51079a2faa7ace26490c + +commit 5d415897ac04e237f1fa73b9dcb9ba8fb3ac812b +Author: dtucker@openbsd.org +Date: Wed Jun 11 13:27:11 2025 +0000 + + upstream: Remove dead code ternary. We always report at least + + KB/s, so B/s is never used. Coverity CID 291809, ok djm@ + + OpenBSD-Commit-ID: a67c5bcc9e19c8965bfeace0e337b13660efa058 + +commit 4b3d27032ba88dd089b721f3bbe3e4a8d23b4ae1 +Author: dtucker@openbsd.org +Date: Wed Jun 11 13:24:05 2025 +0000 + + upstream: Improve termination condition of while loop to compare + + size_t's. Assuming read() does what it's supposed to this shouldn't matter, + but should be more robust. Flagged by Coverity CID 470514, ok djm@ + + OpenBSD-Commit-ID: d7b5ad60feb797b3464964b9ea67fd78fb9d6cc6 + +commit 5530e5f83b3cd3425ea3dbab02da15140befdd91 +Author: Darren Tucker +Date: Tue Jun 10 18:40:56 2025 +1000 + + Replace Windows 2019 runners with 2025 ones. + + The windows-2019 runners are being decomissioned. + +commit a22ff3c6f11edd00c19981f9cb85d3b25d305a56 +Author: Darren Tucker +Date: Wed Jun 4 18:33:52 2025 +1000 + + Disable _FORTIFY_SOURCE during snprintf test. + + Prevents mistakenly detecting snprintf as broken on FreeBSD 15 with + _FORTIFY_SOURCE enabled. bz#3809, patch from jlduran at gmail.com + +commit 203bb886797677aa5d61b57be83cfdc1b634bc9c +Author: dtucker@openbsd.org +Date: Mon Jun 2 14:09:34 2025 +0000 + + upstream: Fix x11_channel_used_recently() to return true when channel + + has been used within the last second, instead of more than a second ago. + Should fix ~5s delay on X client startup when ObscureKeystrokeTiming is + enabled. bz#3820, ok (& sigh) djm@ + + OpenBSD-Commit-ID: b741011e81fb3e3d42711d9bd3ed8a959924dee4 + +commit dc6c134b48ba4bcfadedcea17b4eddac329601d9 +Author: dtucker@openbsd.org +Date: Thu May 29 13:27:27 2025 +0000 + + upstream: When there's more than one x11 channel in use, return + + lastused of most recently used x11 channel instead of the last one found. ok + djm@ + + OpenBSD-Commit-ID: 94a72bf988d40a5bae2e38608f4e117f712569fe + +commit 73ef0563a59f90324f8426c017f38e20341b555f +Author: djm@openbsd.org +Date: Sat May 24 11:41:51 2025 +0000 + + upstream: replace xmalloc+memset(0) with xcalloc(); from AZero13 via + + GHPR417 + + OpenBSD-Commit-ID: 921079436a4900325d22bd3b6a90c8d0d54f62f8 + +commit 3a61f5ed66231881bee432c7e7c6add066c086af +Author: djm@openbsd.org +Date: Sat May 24 09:46:16 2025 +0000 + + upstream: fix punctuation around host key fingerprints to make them + + easier to copy and paste. + + Patch from Till Maas via GHPR556; ok dtucker@ + + OpenBSD-Commit-ID: c0100182a30b6925c8cdb2225b18140264594b7b + +commit b12d4ab1e16f57c6c348b483b1dbdd4530aaaddd +Author: dtucker@openbsd.org +Date: Sat May 24 08:13:29 2025 +0000 + + upstream: Replace strncmp + byte count with strprefix in Penalty + + config parsing. ok kn@, djm@ + + OpenBSD-Commit-ID: 34a41bb1b9ba37fb6c7eb29a7ea909547bf02a5a + +commit a356d978e30dd9870c0b3a7d8edca535b0cd2809 +Author: dtucker@openbsd.org +Date: Sat May 24 08:09:32 2025 +0000 + + upstream: Make the display number check relative to + + X11DisplayOffset. + + This will allows people to use X11DisplayOffset to configure much higher + port ranges if they really want, while not changing the default behaviour. + Patch from Roman Gubarev via github PR#559, ok djm@ + + OpenBSD-Commit-ID: e0926af5dc0c11e364452b624c3ad0cda88550b5 + +commit e18983d03ab969e2f12485d5c0ee61e6d745a649 +Author: Darren Tucker +Date: Sat May 24 17:20:57 2025 +1000 + + Remove progressmeter.o from libssh.a. + + It's now explicitly included by the binaries that need it (scp & sftp). + bz#3810, patch from jlduran at gmail.com + +commit f8967045ad9d588bc11426642070bf8549065e62 +Author: dtucker@openbsd.org +Date: Sat May 24 06:50:28 2025 +0000 + + upstream: Null out keys between test runs. + + BENCH_START and BENCH_FINISH are actually a while() loop in disguise, + so if sshkey_generate does not reset the key pointer on failure the test + may incorrectly pass. It also confuses Coverity (CID 551234). + + OpenBSD-Regress-ID: bf4d32079fc6df6dce1f26c2025f4ed492f13936 + +commit a26091ecdb2a3d72b77baf3c253e676a3c835a24 +Author: djm@openbsd.org +Date: Sat May 24 04:41:12 2025 +0000 + + upstream: add some verbosity + + OpenBSD-Regress-ID: 11c86cda4435b5f9ab6172c4742b95899666c977 + +commit 484563ec70e30472ab4484d49bca9a83771d785c +Author: djm@openbsd.org +Date: Sat May 24 04:41:03 2025 +0000 + + upstream: use start_ssh_agent() to ensure we get logging + + add some verbosity + + OpenBSD-Regress-ID: a89bf64696b9fb1b91be318e6b8940c9ab21c616 + +commit e3c58113ebb3397b252ff26e0e94f726b7db7a8a +Author: djm@openbsd.org +Date: Sat May 24 04:40:37 2025 +0000 + + upstream: add a start_ssh_agent() function that sets up an agent + + with logging + + OpenBSD-Regress-ID: 7f9f30f9c64acbd4b418a5e1a19140cc988071a8 + +commit 3de011ef7a761751afe28ac7ef97fe330d784595 +Author: dtucker@openbsd.org +Date: Sat May 24 06:43:37 2025 +0000 + + upstream: Plug leak of startup_pollfd in debug and child paths. + + Coverity CID 405024, ok djm@ + + OpenBSD-Commit-ID: db46047229253e9c4470c8bbf5f82706ac021377 + +commit d0245389bc55f16082cadd0a39dda5af1c415dfa +Author: Darren Tucker +Date: Sat May 24 17:11:38 2025 +1000 + + ssh-keygen changes were fixup'ed into single commit. + +commit 140bae1df2b7246bb43439d039bf994159973585 +Author: Marco Trevisan (Treviño) +Date: Mon Sep 30 13:14:11 2024 +0200 + + auth-pam: Check the user didn't change during PAM transaction + + PAM modules can change the user during their execution, in such case ssh + would still use the user that has been provided giving potentially + access to another user with the credentials of another one. + + So prevent this to happen, by ensuring that the final PAM user is + matching the one that initiated the transaction. + +commit 216824172724a50a4a75439fb2b4b8edccf5b733 +Author: dtucker@openbsd.org +Date: Sat May 24 03:37:40 2025 +0000 + + upstream: Remove ssh-keygen's moduli screen -Omemory option. + + This vaguely made sense 20 years ago, but these days you'd be hard + pressed to *find* a machine small enough to not support the maximum + (127MB), and no one is screening moduli on such machines anyway, + so just use the max. This also fixes Coverity CID 470522 by deleting + code in question. "kill it with fire" djm@. + + OpenBSD-Commit-ID: 39036aa406a99f0a91923aa3a96afff1205558e6 + +commit f5cd14e81fa29b4924959cb2e1f9c206aae2d502 +Author: dtucker@openbsd.org +Date: Sat May 24 02:33:33 2025 +0000 + + upstream: Fix compile error on 32bit platforms. + + Spotted by & ok tb@ + + OpenBSD-Commit-ID: cbcf518247886f3c7518fc54cb3bd911ffc69db7 + +commit eccc15014fe146e8590568e6737a3097bfac3415 +Author: dtucker@openbsd.org +Date: Sat May 24 02:01:28 2025 +0000 + + upstream: Use pointer from strprefix in error message, + + missed in previous. + + OpenBSD-Commit-ID: d2cdec6cf0fcd4b0ee25e4e3fad8bc8cf0ee657d + +commit 91903511d0597c3bea218167f9ca5a176fa0dc20 +Author: dtucker@openbsd.org +Date: Fri May 23 12:52:45 2025 +0000 + + upstream: Replace strncmp and strncasecmp with hand-counting bytes + + with strprefix. nits lucas@, ok lucas@ djm@ + + OpenBSD-Commit-ID: f0888807f151ea2bdaf6fed36303ae81f259d1d4 + +commit 0c64d69e4e24a3ab06f7922ef389e7399c4dfb88 +Author: dtucker@openbsd.org +Date: Fri May 23 11:54:50 2025 +0000 + + upstream: Include stdint.h for UINT32_MAX. + + OpenBSD-Commit-ID: edc29ed67e8bd03bac729d9b4849066d1d3a8cb9 + +commit 3e11478f585408888defa56fa47e8dc6567378d0 +Author: dtucker@openbsd.org +Date: Fri May 23 11:25:35 2025 +0000 + + upstream: Ensure args to nh_update() fit within uint32, which it + + should always anyway. Placates Coverity CID 470520. While there, fix the + upstream URL. ok djm@ + + OpenBSD-Commit-ID: 2478e89fde089a49fa02f9faf6287d35959c9f92 + +commit f097d7bd07da4634c1a723d1dc4fcf56e7d0e147 +Author: dtucker@openbsd.org +Date: Fri May 23 09:26:25 2025 +0000 + + upstream: Don't leak the args list. Coverity CIDs 481569 & 481570, + + ok job@ tb@. + + OpenBSD-Commit-ID: becabcd00513d13d1435b68b7ccffa7151b72393 + +commit a4ea7f6042f25b41061a83445016a1ea4f470f7b +Author: dtucker@openbsd.org +Date: Fri May 23 08:40:13 2025 +0000 + + upstream: Explictly set LC_ALL=C on each sort invocation. + + Remove it from sshd_config (where it could be overridden by shell startup + scripts, eg on macos-15) causing random test failures. with & ok djm@ + + OpenBSD-Regress-ID: ad0a6678964784096e9a9e6d15ead36beed92f18 + +commit 7674c03caed80cb3565d14690c92068a14051967 +Author: Darren Tucker +Date: Fri May 23 16:39:18 2025 +1000 + + Allow setting LTESTS in repo variables. + +commit d8b5bd36078e5b6d78da4633f0cc9b90ffda8b50 +Author: Darren Tucker +Date: Fri May 23 16:26:20 2025 +1000 + + Rename debugging variable RUN_ONLY_TEST. + + to RUN_ONLY_TARGET_CONFIG to make it more obvious what it matches. + +commit a79a2c1190bd3124da21d9e1582dd94877c7f972 +Author: Darren Tucker +Date: Fri May 23 16:11:48 2025 +1000 + + chown regress logs before uploading. + +commit 24889a33071086b6f1f62568b0c2bd0a4955ac49 +Author: dtucker@openbsd.org +Date: Fri May 23 01:14:35 2025 +0000 + + upstream: Import regenerated moduli. + + OpenBSD-Commit-ID: 07e29dc891e29b31e03e2e5493658b4a9ac19431 + +commit 4b8bee62d72ffb3c419c9ead6c9fb1a586283868 +Author: deraadt@openbsd.org +Date: Fri May 23 00:40:45 2025 +0000 + + upstream: use "const char * const" for malloc_options here also + + OpenBSD-Commit-ID: 869715b9c7e1dd5b85efd07814e7e53f0286eea2 + +commit 6629eee21ca9d0a597a04dcac744a1ad882f912e +Author: dtucker@openbsd.org +Date: Thu May 22 12:14:19 2025 +0000 + + upstream: Adjust debug message to prevent (unsigned) integer overflow. + + Fixes Coverity CID 481110, ok djm@ + + OpenBSD-Commit-ID: 26178bf3b812707fb498ea85d076cadd1f2eb686 + +commit 7acb70e05e9977ceca7b33df84ceaea337b1efef +Author: bluhm@openbsd.org +Date: Thu May 22 04:34:18 2025 +0000 + + upstream: Fix OpenBSD RCS ID typos. from Andrius V + + OpenBSD-Regress-ID: 5c03a2ef5323969fc4978f2eec4f1a25c48c572a + +commit 2b2a7a2a0d70023b439080bb2770ff36522dbea8 +Author: Darren Tucker +Date: Thu May 22 22:09:48 2025 +1000 + + Remove debug change accidentally commited. + + Fixes Coverity CID 481160. + +commit 450a8a1df1577ddbe68fe8da1fb8514d3781ef32 +Author: Darren Tucker +Date: Thu May 22 21:16:37 2025 +1000 + + Collect all of regress dir on failure. + + This may allow us to sort through its entrails and determine the cause + of some types of failures. + +commit de25e739781c4c09d20abd410f50f0a6f192dc72 +Author: Damien Miller +Date: Thu May 22 18:42:44 2025 +1000 + + minimal shims for fstatat(2)/unlinkat(2) in agent + + Add some very minimal and task-specific replacements for + fstatat(2) and unlinkat(2) in the ssh-agent socket cleanup + loop, for platforms that lack these functions. ok dtucker@ + +commit 6d192645a613aa814d51050b0458f37265b90d6c +Author: dtucker@openbsd.org +Date: Thu May 22 04:22:03 2025 +0000 + + upstream: Output the current name for PermitRootLogin's + + "prohibit-password" in sshd -T instead of its deprecated alias + "without-password". bz#3788, patch from cjwatson at debian.org. + + OpenBSD-Commit-ID: 2d5df18d5ad33a9b6c7547ec78a8e6ea13813df9 + +commit 1ccf42378df202472e7254f37f7dabb2f5723955 +Author: dtucker@openbsd.org +Date: Thu May 22 03:53:46 2025 +0000 + + upstream: Copy arg to be passed to dirname(). + + POSIX allows dirname() to modify its args and return a pointer into it, + so this prevents an overlapping strlcpy. bz#3819, patch from cjwatson + at debian.org + + OpenBSD-Commit-ID: c32e496e6a1618aba31c8b7a9d4e1376c5ea6aa1 + +commit b5877b7b3e597f47578ade9dbe7e4332f112dfc4 +Author: dtucker@openbsd.org +Date: Thu May 22 03:41:10 2025 +0000 + + upstream: Add $OpenBSD$ marker for easier syncing. + + OpenBSD-Commit-ID: 27ff3e1e2e6610d9981ebe43ae9b783236800035 + +commit 58d094c7cb974d7bd3ba6eb1059b186a2ac3dd55 +Author: djm@openbsd.org +Date: Wed May 21 12:12:20 2025 +0000 + + upstream: Correct FILES section to mention new default path to + + agent sockets. Spotted by / ok jmc@ + + OpenBSD-Commit-ID: 91d736d78d71a4276c9cbb075b1462bbc3df55a6 + +commit d1d5c8b9b8de8283618c18d0dafdec6a209911cc +Author: Darren Tucker +Date: Thu May 22 12:25:35 2025 +1000 + + Fix nc install some more. + +commit 49a2412ad23162e44be9e0b2cb12f6daf6b666d7 +Author: Darren Tucker +Date: Thu May 22 12:21:11 2025 +1000 + + Fix cvs up of nc. + +commit df22801b3f0ae245f825cf9c9dbb4543e41a7c5c +Author: Darren Tucker +Date: Thu May 22 11:34:04 2025 +1000 + + Install nc during upstream test. + + This ensures that the installed nc matches the expectations of the + regress tests. + +commit e391c5289c2b687ff886cf780dc8fcb426e4d5d2 +Author: Darren Tucker +Date: Thu May 22 10:52:31 2025 +1000 + + Remove 9.7 branch from CI status page. + + It's been obsolete long enough that github no longer reports its + status. + +commit b71773c20d566fa5dcaf9edf3139bdcb3f2c4bc2 +Author: Damien Miller +Date: Wed May 21 19:14:47 2025 +1000 + + pull a small netcat SOCKS4A fix from upstream + +commit 0adb2db25eff3fe1c90c55654387ae1e4e18a396 +Author: djm@openbsd.org +Date: Wed May 21 08:41:52 2025 +0000 + + upstream: test SOCKS4A; ok tb + + OpenBSD-Regress-ID: d880b75280295cd581a86e39bb0996d347f122d2 + +commit 5699f4e9553c6a228fd9dc578d99e3aa6451c014 +Author: djm@openbsd.org +Date: Wed May 21 08:36:39 2025 +0000 + + upstream: remove log tarballing "it seemed like a good idea at the + + time" - dtucker@ + + ensure that log files have correct perms when running under sudo/doas + + ok dtucker@ + + OpenBSD-Regress-ID: 20588c14b05de9519f85d638b374b66ae0678c89 + +commit 0c14e6b69a20f20d602e0e72559ca3f4dbc797fb +Author: djm@openbsd.org +Date: Wed May 21 06:44:24 2025 +0000 + + upstream: use logit_f("...") instead of logit("func: ...") + + OpenBSD-Commit-ID: c8d49eb39a9abff3cbcaeaf7df9d48468a5a0695 + +commit 1743589d038476f28dc4dfb1f69317649ae22ac5 +Author: djm@openbsd.org +Date: Wed May 21 06:43:48 2025 +0000 + + upstream: function to make a sshbuf from a hex string; useful in + + tests + + also constify some arguments + + OpenBSD-Commit-ID: 00f9c25b256be0efd73f2d8268ff041bc45ffb2c + +commit 83729cf503289104d7e64a69be14579523988cb6 +Author: Damien Miller +Date: Wed May 21 18:47:46 2025 +1000 + + merge netcat SOCKS4A support from OpenBSD + + Not a full sync of this file as we have diverged substantially + from upstream (it has libtls support, etc.) + +commit 750f1867476bda36879f69e25e8f52cb45c58807 +Author: Darren Tucker +Date: Tue May 20 22:17:02 2025 +1000 + + Include OpenSSL compat shim where needed. + +commit 6fb728df50c1afd338cb0223a84ce24579577eff +Author: Darren Tucker +Date: Tue May 20 19:28:55 2025 +1000 + + Run all tests on Cygwin again. + + ... now that we've fixed ci-setup on Cygwin. + +commit 648a3a008cf1cfa54631d2f0457b5313c455f484 +Author: Darren Tucker +Date: Tue May 20 18:48:23 2025 +1000 + + Use USERNAME rather than LOGNAME on Cygwin. + + LOGNAME is specified by POSIX, but Windows (or at least, github's + Windows images) don't set it. + +commit 0214e53124c09528b6ee29b9a551442b5611a454 +Author: Darren Tucker +Date: Tue May 20 18:28:52 2025 +1000 + + Add debug output when setting up CI environment. + +commit 9d9a2c0369419f3b4952e597db7b8696f54e7f3a +Author: Darren Tucker +Date: Tue May 20 19:16:38 2025 +1000 + + Include openssl compat shims in test. + + Fixes tests on platforms using older LibreSSL releases prior to 3.4. + +commit 1a9b1cfa4e8b807c7f82fdba8f730c2abdbba071 +Author: Darren Tucker +Date: Tue May 20 18:14:06 2025 +1000 + + Add compat shims for EC_POINT affine_coordinates + + LibreSSL <3.4 does not have EC_POINT_[gs]et_affine_coordinates + but does have the now-deprecated _GFp variantes. We still support + LibreSSL back as far as 3.2.x so add a compat shim. + +commit cff2175200b412a9207a4fe5c1bdcc54e8a73d07 +Author: tb@openbsd.org +Date: Mon May 12 05:42:02 2025 +0000 + + upstream: Use EC_POINT_[sg]et_affine_coordinates() + + It is available in all supported OpenSSL flavors/versions and the _GFp + variants will be removed from LibreSSL. + + ok hshoexer jsing + + OpenBSD-Regress-ID: 66cf1561e7b6c49002978f2d6720956f33a882f0 + +commit 2d35e24739b515394017b74465a0996c384cf28f +Author: tb@openbsd.org +Date: Mon May 12 05:41:20 2025 +0000 + + upstream: Use EC_POINT_[sg]et_affine_coordinates() + + It is available in all supported OpenSSL flavors/versions and the _GFp + variants will be removed from LibreSSL. + + ok hshoexer jsing + + OpenBSD-Commit-ID: ecedca0e1ffa80e0c9ef7c787bc6a972882c596b + +commit 17003b9f1cd7b7bf1f52493cc4a1ab95727c3ed7 +Author: djm@openbsd.org +Date: Fri May 9 02:42:03 2025 +0000 + + upstream: make the progress-meter code safe against being called + + when not initialised; spotted by tb@ feedback/ok tb@ deraadt@ + + OpenBSD-Commit-ID: a9fda1ee08a24c62e0981ff6d15ca93b63467038 + +commit 2d023e7a95d673e93ccc1978bf8931f7335b2b53 +Author: tedu@openbsd.org +Date: Thu May 8 17:32:53 2025 +0000 + + upstream: convert a last quad_t to int64_t. ok deraadt djm + + OpenBSD-Commit-ID: 1c9e01ba1a9ccf442a9cdf10f222077f66885f1f + +commit fc8c56ade809f66f7df4b5153a4d92593631c12a +Author: Darren Tucker +Date: Tue May 20 15:01:29 2025 +1000 + + Set runner pasword to random string. + + The most recent version of the Github ubuntu-latest image sets the + password field to "!" which sshd considers to be a locked account, + breaking most of the tests. + +commit c404686c17daeda7e95ca6fc14c8a4a570cf975d +Author: Darren Tucker +Date: Sun May 11 22:54:13 2025 +1000 + + Debug log for why an account is considered locked. + +commit ee1d31781cf0d292a50b4df4cb8cb6ffcbfbe9af +Author: Darren Tucker +Date: Sun May 11 16:35:31 2025 +1000 + + Move debug log output into separate workflow step. + + Should reduce the need to scroll back to find out which test actually + failed. + +commit ddfb78a15f57a33427d462b9c401de5c8e6799da +Author: Darren Tucker +Date: Sat May 10 21:48:06 2025 +1000 + + Skip sftp-perm on Cygwin too. + +commit 8846caccb86b3f5a4f1c10bfffcc9cf1adc17925 +Author: Darren Tucker +Date: Sat May 10 10:23:30 2025 +1000 + + Remove CYGWIN binmode as it's now obsolete. + +commit cf795d55437e6c1ffe85e90e0fae00e885e50036 +Author: Darren Tucker +Date: Sat May 10 09:25:18 2025 +1000 + + Also skip sftp-cmds test on Cygwin. + + Fails at the hardlink step. + +commit d1b28639c1cb382943bd92c68992ea74af9b5773 +Author: Darren Tucker +Date: Sat May 10 08:52:11 2025 +1000 + + Tell Cygwin to use native symlinks. + +commit 56782dad7d7f96b4943951227515bd7904ac3cf7 +Author: Darren Tucker +Date: Sat May 10 08:26:37 2025 +1000 + + Skip keygen-knownhost test on Cygwin. + + It fails but at this time it's not clear why. + +commit d5cbac2364b03e55b733a2422a07e78e16d2a118 +Author: Darren Tucker +Date: Sat May 10 07:59:44 2025 +1000 + + Pass Cygwin setup location to CI setup. + + (instead of hard coding it, wrongly). + +commit 82f1f52c5582f005761e4e200c279ddd9c6781e4 +Author: Darren Tucker +Date: Sat May 10 06:37:24 2025 +1000 + + Add RUN_ONLY_TEST to limit which tests are run. + + For testing, you can set the repo variable RUN_ONLY_TEST in your repo + (Repo -> Settings -> Security -> Actions -> Variables) to run only that test. + +commit 140ba45895de8ebfb3e2517b0ddee58729979c29 +Author: Darren Tucker +Date: Fri May 9 19:32:06 2025 +1000 + + Move misc-agent.o to LIBSSH_OBJS. + + It's needed by the fuzzer. + +commit 3357bf2fe2d11b6ed4465c1ed2871bd1099cbbc5 +Author: Darren Tucker +Date: Fri May 9 19:08:36 2025 +1000 + + Put PRIV_ECDSA back, it's still used. + + Should fix oss-fuzz test. + +commit f5726215957bb34e18bb872d527845c2f64e2389 +Author: Darren Tucker +Date: Thu May 8 18:56:39 2025 +1000 + + Since it's unused, make dirfd() take void *. + + Some platforms (eg Old BSDs) in some configurations define DIR to "void + *", which causes compile errors in the no-op implementation. + +commit 1511f113a27d8aafe080aa6493cb3c0cf2b5abe0 +Author: Darren Tucker +Date: Thu May 8 11:38:24 2025 +1000 + + Add no-op implmentation of dirfd(). + + Fixes build on pre-POSIX.1 2008 systems. + +commit 086369736a9496b39af0d9f09443fa81b59b7f05 +Author: Daniel Kahn Gillmor +Date: Wed Apr 16 10:18:34 2025 +1000 + + ssh-agent: exit 0 from SIGTERM under systemd socket-activation + + When the ssh-agent service is configured to be launched under systemd + socket-activation, the user can inspect the status of the agent with + something like: + + systemctl --user status ssh-agent.service + + If the user does: + + systemctl --user stop ssh-agent.service + + it causes the `systemd --user` supervisor to send a SIGTERM to the + agent, which terminates while leaving the systemd-managed socket in + place. That's good, and as expected. (If the user wants to close the + socket, they can do "systemctl --user stop ssh-agent.socket" instead) + + But because ssh-agent exits with code 2 in response to a SIGTERM, the + supervisor marks the service as "failed", even though the state of the + supervised service is exactly the same as during session startup (not + running, ready to launch when a client connects to the socket). + + This change makes ssh-agent exit cleanly (code 0) in response to a + SIGTERM when launched under socket activation. This aligns the systemd + supervisor's understanding of the state of supervised ssh-agent with + reality. + + Signed-off-by: Daniel Kahn Gillmor + +commit 755c3d082e59e6884f28d30e6333a1444e9173d1 +Author: Darren Tucker +Date: Wed May 7 21:05:06 2025 +1000 + + Skip d_type check on platforms that don't have it. + + On those, the subsequent stat() should catch the sockets. + +commit 207289a5663bdf49903e1aeb938dcc0924e2ac63 +Author: dtucker@openbsd.org +Date: Wed May 7 10:44:26 2025 +0000 + + upstream: Rename sockaddr_un sun -> sunaddr. + + This makes things easier in -portable, where on Solaris an derivatives + "sun" is defined to "1", causing compilation errors. ok deraadt@. + + OpenBSD-Commit-ID: 0669043afb49856b57b382f0489221bd98305d3b + +commit 7cc8e150d51a4545b86d996692b541419b35d1a3 +Author: djm@openbsd.org +Date: Tue May 6 06:05:48 2025 +0000 + + upstream: remove DSA from the regression/unit test suite too. + + OpenBSD-Regress-ID: 4424d2eaf0bce3887318ef6d18de6c06f3617d6e + +commit 0404fa799746c283325a463c363436eb152daefc +Author: djm@openbsd.org +Date: Tue Apr 15 05:31:24 2025 +0000 + + upstream: another missing ifdef + + OpenBSD-Regress-ID: 4f71f8f122eac4cbf7f1d2088a9be45317dd3e4a + +commit c5dbbe8805caaee132545ab4cffd3b2221e80975 +Author: djm@openbsd.org +Date: Tue Apr 15 05:00:13 2025 +0000 + + upstream: missing ifdef + + OpenBSD-Regress-ID: 7260fb672de5738c17dec06c71a5be0186bb2b09 + +commit 93e904a673a632604525fdc98b940b7996f1ce54 +Author: djm@openbsd.org +Date: Wed May 7 04:10:21 2025 +0000 + + upstream: memory leak on error path; bz3821 + + OpenBSD-Commit-ID: 65577596a15ad6dd9a1ab3fc24c1c31303ee6e2b + +commit 55b38ff4d7286c8fac2a472da664462e0f2d75e0 +Author: deraadt@openbsd.org +Date: Tue May 6 15:15:05 2025 +0000 + + upstream: test ssh-agent with the -T flag to force the old /tmp + + location rather than inside the homedir. During relink operation, + /.ssh/agent was created which is surprising. This test sequence could use + some improvement so this is a temporary fix. observed by florian, change ok + semarie + + OpenBSD-Commit-ID: c7246a6b519ac390ca550719f91acfdaef1fa0f0 + +commit a32d28d792567253bb601362f36391f155f8f772 +Author: djm@openbsd.org +Date: Tue May 6 05:40:56 2025 +0000 + + upstream: finally remove DSA signature support from OpenSSH. + + feedback/ok tb@, ok deraadt@ + + OpenBSD-Commit-ID: bfe6ee73c1b676c81a2901030c791f8ec888228f + +commit 928f8dcc1bb622c25be409c34374b655d0149373 +Author: djm@openbsd.org +Date: Mon May 5 05:51:11 2025 +0000 + + upstream: Now that there's an I-D for certificate keys, refer to + + that instead of the much more basic format description we had previously. + + OpenBSD-Commit-ID: cf01e0727a813fee8626ad7b3aa240621cc92014 + +commit fe883543bece18c975fa53aa02104f0433645d99 +Author: jmc@openbsd.org +Date: Mon May 5 05:47:28 2025 +0000 + + upstream: - add full stop to the text in -a - move the -U and -u + + text to the correct place + + OpenBSD-Commit-ID: 2fb484337a0978c703f61983bb14bc5cbaf898c2 + +commit 5fd6ef297dec23e3574646b6334087131230d0a6 +Author: Darren Tucker +Date: Tue May 6 19:01:00 2025 +1000 + + Add minimal implementations of fstatat and unlinkat. + + Fixes build on some pre-POSIX.1-2008 platforms. + +commit d2480827b3ef6ec119965822afdff35d734b2dee +Author: Darren Tucker +Date: Tue May 6 08:15:34 2025 +1000 + + New location of cygwin setup. + +commit 57eb87b15bd0343372f99d661ce95efb25a16f1e +Author: Darren Tucker +Date: Tue May 6 08:07:23 2025 +1000 + + Boringssl now puts libcrypto in a different place. + +commit 61525ba967ac1bb7394ea0792aa6030bcbbad049 +Author: Darren Tucker +Date: Mon May 5 20:45:42 2025 +1000 + + Handle systems that don't have st_mtim. + + Ignores nanoseconds, but it's checking for >1h old so a few nanoseconds + shouldn't matter much. Fixes build on Mac OS X. + +commit 27861e9b15151898841097c14ee974c026093131 +Author: Darren Tucker +Date: Mon May 5 19:09:25 2025 +1000 + + Supply timespecsub if needed. + +commit 7c0e6626e4be53efcfbb92f0c6382a76f1138e38 +Author: Darren Tucker +Date: Mon May 5 19:08:48 2025 +1000 + + includes.h for compat, time.h for clock_gettime. + +commit 7a7cc3cf721fe7fe9f4925d92bb7c694b8550a7f +Author: Darren Tucker +Date: Mon May 5 18:51:34 2025 +1000 + + Cygwin install in back on D: + +commit 6ab8133c067a8e91ba69ce7ca04f95b50f2f2d7b +Author: Damien Miller +Date: Mon May 5 14:59:30 2025 +1000 + + depend + +commit 12912429cf39cfeca97dd18a8f875ad9824d1751 +Author: djm@openbsd.org +Date: Mon May 5 03:35:06 2025 +0000 + + upstream: missing file in previous commit + + OpenBSD-Commit-ID: e526c97fcb2fd9f0b7b229720972426ab437d7eb + +commit 80162f9d7e7eadca4ffd0bd1c015d38cb1821ab6 +Author: djm@openbsd.org +Date: Mon May 5 02:48:06 2025 +0000 + + upstream: Move agent listener sockets from /tmp to under + + ~/.ssh/agent for both ssh-agent(1) and forwarded sockets in sshd(8). + + This ensures processes (such as Firefox) that have restricted + filesystem access that includes /tmp (via unveil(3)) do not have the + ability to use keys in an agent. + + Moving the default directory has the consequence that the OS will no + longer clean up stale agent sockets, so ssh-agent now gains this + ability. + + To support $HOME on NFS, the socket path includes a truncated hash of + the hostname. ssh-agent will by default only clean up sockets from + the same hostname. + + ssh-agent gains some new flags: -U suppresses the automatic cleanup + of stale sockets when it starts. -u forces a cleanup without + keeping a running agent, -uu forces a cleanup that ignores the + hostname. -T makes ssh-agent put the socket back in /tmp. + + feedback deraadt@ naddy@, doitdoitdoit deraadt@ + + OpenBSD-Commit-ID: 8383dabd98092fe5498d5f7f15c7d314b03a93e1 + +commit 566443b5f5d7bc4c5310313b4e46232760850c7a +Author: djm@openbsd.org +Date: Mon May 5 02:40:30 2025 +0000 + + upstream: correct log messages; the reap function is used for more + + than just the preauth process now + + OpenBSD-Commit-ID: 768c5b674bd77802bb197c31dba78559f1174c02 + +commit e048230106fb3f5e7cc07abc311c6feb5f52fd05 +Author: djm@openbsd.org +Date: Wed Apr 30 05:26:15 2025 +0000 + + upstream: make writing known_hosts lines more atomic, by writing + + the entire line in one operation and using unbuffered stdio. + + Usually writes to this file are serialised on the "Are you sure you + want to continue connecting?" prompt, but if host key checking is + disabled and connections were being made with high concurrency + then interleaved writes might have been possible. + + feedback/ok deraadt@ millert@ + + OpenBSD-Commit-ID: d11222b49dabe5cfe0937b49cb439ba3d4847b08 + +commit c991273c18afc490313a9f282383eaf59d9c13b9 +Author: djm@openbsd.org +Date: Wed Apr 30 05:23:15 2025 +0000 + + upstream: fix a out-of-bounds read if the known_hosts file is + + truncated after the hostname. + + Reported by the OpenAI Security Research Team + + ok deraadt@ + + OpenBSD-Commit-ID: c0b516d7c80c4779a403826f73bcd8adbbc54ebd + +commit b5b405fee7f3e79d44e2d2971a4b6b4cc53f112e +Author: Darren Tucker +Date: Sun Apr 20 09:07:57 2025 +1000 + + Set Windows permssions on regress dir. + + Prevents "unprotected private key file" error when running tests. + +commit 76631fdd04824c3e50ea6551d3611b1fe0216a41 +Author: Darren Tucker +Date: Fri Apr 18 08:18:52 2025 +1000 + + Add 10.0 branch to test status page. + +commit c627b468d3b99e487e2b24c90958ae57e633d681 +Author: Darren Tucker +Date: Fri Apr 18 08:14:16 2025 +1000 + + cygwin-install-action now puts setup.exe on D: + +commit 52bddbc1a7f53a1e5c871767913648eb639ac6d5 +Author: Darren Tucker +Date: Fri Apr 18 08:10:32 2025 +1000 + + Include time.h for clock_gettime(). + +commit 9b50cb171b5c56184ce6fa3994ce62f9882d2daf +Author: Darren Tucker +Date: Thu Apr 17 16:51:14 2025 +1000 + + Add includes.h for new tests. + + Fixes builds on older platforms. + +commit 46e52fdae08b89264a0b23f94391c2bf637def34 +Author: Darren Tucker +Date: Wed Apr 16 22:29:17 2025 +1000 + + Provide INFINITY if it's not provided. + + INFINITY is specified in c99, so define if not provided. + +commit 849c2fd894aa87a7e40c71e8d5bda5392b1205be +Author: Darren Tucker +Date: Tue Apr 15 21:58:49 2025 +1000 + + Look for sqrt(), possibly in libm. + + The unit tests now use sqrt(), which in some platforms (notably + DragonFlyBSD and Solaris) is not in libc but rather libm. Since only + the unit tests use this, add TESTLIBS and if necessary put libm in it. + +commit 1ec5b39f1f673beac039bb42c98a11aa2b08a0b2 +Author: dtucker@openbsd.org +Date: Tue Apr 15 09:22:25 2025 +0000 + + upstream: Cast signalled_keydrop to int when logging to prevent warning + + on platforms where sig_atomic_t is not the same as int. bz#3811, patch from + jlduran at gmail com. + + OpenBSD-Commit-ID: b6bc9e9006e7f81ade57d41a48623a4323deca6c + +commit f3d465530e75cb6c02e2cde1d15e6c4bb51ebfd9 +Author: djm@openbsd.org +Date: Tue Apr 15 04:00:42 2025 +0000 + + upstream: basic benchmarking support for the unit test framework enable + + with "make UNITTEST_BENCHMARK=yes" + + ok dtucker@ + + OpenBSD-Regress-ID: 7f16a2e247f860897ca46ff87bccbe6002a32564 + +commit 609fe2cae2459d721ac11d23cd27b8a94397ef3c +Author: jmc@openbsd.org +Date: Mon Apr 14 05:41:42 2025 +0000 + + upstream: rework the text for -3 to make it clearer what default + + behaviour is, and adjust the text for -R to make them more consistent; + + issue raised by mikhail mp39590; + behaviour explained by naddy + + ok djm + + OpenBSD-Commit-ID: 15ff3bd1518d86c84fa8e91d7aa72cfdb41dccc8 + +commit 8725dbc5b5fcc3e326fc71189ef8dba4333362cc +Author: Damien Miller +Date: Wed Apr 9 17:02:17 2025 +1000 + + update version numbers + +commit cc7feb9458ad3b893b53dc9c7500d1affd208bde +Author: djm@openbsd.org +Date: Wed Apr 9 07:00:21 2025 +0000 + + upstream: openssh-10.0 + + OpenBSD-Commit-ID: db5b4a1f1c9e988f8f166b56dc5643606294b403 + +commit fc86875e6acb36401dfc1dfb6b628a9d1460f367 +Author: djm@openbsd.org +Date: Wed Apr 9 07:00:03 2025 +0000 + + upstream: Fix logic error in DisableForwarding option. This option + + was documented as disabling X11 and agent forwarding but it failed to do so. + Spotted by Tim Rice. + + OpenBSD-Commit-ID: fffc89195968f7eedd2fc57f0b1f1ef3193f5ed1 + +commit dd73459e351b0a2908aed90910c8ff9b0b381c6d +Author: djm@openbsd.org +Date: Wed Apr 9 01:24:40 2025 +0000 + + upstream: oops, I accidentally backed out the typo fix + + OpenBSD-Commit-ID: f485f79bf3e9ebbe1de13ac96150cf458956cfd8 + +commit 0cb945891944bada5850e85d60afa3c807cf1af6 +Author: djm@openbsd.org +Date: Wed Apr 9 01:23:47 2025 +0000 + + upstream: typo + + OpenBSD-Commit-ID: f912725c7d303720706b3ccfb2cb846d46296d13 + +commit cd4a6bd50b658d707867caa1f5aa40b35c2b6c19 +Author: Damien Miller +Date: Wed Apr 9 09:49:55 2025 +1000 + + initialise websafe_allowlist in agent fuzzer + +commit 55b7cb48af96c1102ef8ab5a73bb329cbed30945 +Author: djm@openbsd.org +Date: Tue Apr 8 23:10:46 2025 +0000 + + upstream: typo + + OpenBSD-Regress-ID: 08477b936d1d0c1e8a98aa1c0e1bdde8871894c9 + +commit 985d8cbcd3438cc36b4e709476f1783e358ddfb1 +Author: djm@openbsd.org +Date: Tue Apr 8 23:10:08 2025 +0000 + + upstream: typo + + OpenBSD-Commit-ID: 6e683e13e72bf1e43bbd3bbc6a8332d5a98bdc99 + +commit 000c3d14e94d8f7597087c457260ea9417045b65 +Author: dtucker@openbsd.org +Date: Mon Apr 7 08:12:22 2025 +0000 + + upstream: Include time.h for time(). + + Fixes warning on some platforms when building without openssl. + + OpenBSD-Commit-ID: 04ca29b8eaae1860c7adde3e770baa1866e30a54 + +commit 49b8b9bf829e08af22366530614a5e59ac341ca9 +Author: tb@openbsd.org +Date: Wed Apr 2 04:28:03 2025 +0000 + + upstream: Wrap #include in #ifdef WITH_DSA + + ok djm + + OpenBSD-Commit-ID: ed01a7c102243f84e4a317aefb431916d98aab15 + +commit f80fb819e5521e13f167edbcc3eed66e22ad0c2a +Author: Damien Miller +Date: Thu Apr 3 09:10:19 2025 +1100 + + remove all instances of -pie from LDFLAGS + + Previously only the first instance of this flag was removed. + Unbreaks build on OpenSUSE Tumbleweed. Patch from Antonio Larrosa + +commit 6c9872faa1c297a84c6d3e3b95a927be99eadbf6 +Author: djm@openbsd.org +Date: Tue Apr 1 23:23:20 2025 +0000 + + upstream: remove ability to enable DSA support. Actual code will be + + g/c'd separately. ok deraadt@ + + OpenBSD-Commit-ID: 2a032b75156c4d922e8343fa97ff6bc227f09819 + +commit 8460aaa4e1f8680f03cc5334556b9440b401f010 +Author: dtucker@openbsd.org +Date: Fri Mar 28 21:45:55 2025 +0000 + + upstream: Add TEST_SSH_SSHD_ENV to sshd lines here too. + + OpenBSD-Regress-ID: 045f2c88b42d694b404db51c5de5eca20d748ff1 + +commit 5e60f5937b9c33190b9d7614f72d85d4a9b38d3d +Author: dtucker@openbsd.org +Date: Fri Mar 28 06:04:07 2025 +0000 + + upstream: Pass "ControlMaster no" to ssh when invoked by scp & sftp. + + If you have ControlMaster auto (or yes) in your config, and the + first connection you make is via scp or sftp, then you may get a + few unexpected options applied to it (eg ForwardX11 no), since sftp + and sftp explicitly disable those for reasons. These effects will + persist beyond the initial scp or sftp command. + + This explicitly disables persistent session *creation* by scp and sftp. + It will not prevent them from using an existing session if one has + already been created. + + From Github PR#557, ok djm@ kn@ + + OpenBSD-Commit-ID: 9dad7c737466837e0150c4318920f46d844770c4 + +commit bbd36869dfb4b770cc9e6a345c04a585a0955aec +Author: dtucker@openbsd.org +Date: Fri Mar 28 05:41:15 2025 +0000 + + upstream: Set sshd environment variables during sshd test run too. + + OpenBSD-Regress-ID: 50cb325d92c390a2909662c901f6ac5d80b6f74d + +commit 98f05b1484daddef2f56b79e24540523b5016143 +Author: dtucker@openbsd.org +Date: Fri Mar 28 05:36:24 2025 +0000 + + upstream: Add TEST_SSH_SSHD_ENV variable which is added to sshd's + + environment. Will be used in Portable to tweak behaviour of tcmalloc's + debugging. + + OpenBSD-Regress-ID: 67e38c3c4517ddb72c8a3549a3325a166d7bb6d6 + +commit 8cd9ed4df0eccc825eca0c45354a37332e125e38 +Author: dtucker@openbsd.org +Date: Fri Mar 28 05:33:30 2025 +0000 + + upstream: chown log directory in addition to log files. + + OpenBSD-Regress-ID: b520d54a0bbf2c6554413c798218bda26b385ad9 + +commit e32de6bf4f3229d4838beb127de45eed1377ccc5 +Author: Darren Tucker +Date: Fri Mar 28 16:47:58 2025 +1100 + + Be explicit about environment variables for tests. + + This will make it easier to reproduce a test failure by cut-and-paste of + the corresponding line from the github log. + +commit 77a3e6ba47381547b3fe4b29223256f276fbd07e +Author: Darren Tucker +Date: Fri Mar 28 16:46:40 2025 +1100 + + Add tcmalloc flags to TEST_SSH_SSHD_ENV. + + This will get passed to sshd via test-exec.sh. + +commit a73890e340fbd6121251854b658a72d738b86c84 +Author: Darren Tucker +Date: Thu Mar 27 23:04:44 2025 +1100 + + Add PuTTY 0.81, 0.82 and 0.83 to tests. + +commit 90a28de0d49570324d1695c0b4686354ef3bcae0 +Author: Darren Tucker +Date: Thu Mar 27 22:30:40 2025 +1100 + + Include TCMALLOC_STACKTRACE_METHOD in output. + + If TCMALLOC_STACKTRACE_METHOD happens to be set, include it in the debug + output to make reproducing test cases easier. + +commit fd5a6bb6dd7657c4bd8cd0ee11d5c8ddf0d927b2 +Author: Darren Tucker +Date: Thu Mar 27 20:15:11 2025 +1100 + + Test with-linux-memlock-onfault in kitchensink. + +commit 22330711e2459c23d9736ee16e0e2ee0fcc30b9a +Author: Collin Funk +Date: Wed Mar 26 18:24:59 2025 -0700 + + Include fcntl.h so AT_FDCWD does not get redefined. + +commit 6c49e5f7dcaf886b4a702a6c003cae9dca04d3ea +Author: Daniil Tatianin +Date: Thu Feb 27 11:37:13 2025 +0300 + + Add support for locking memory on Linux + + Linux wakes up kcompactd threads in order to make more contiguous memory + available on the system, it does this by migrating live movable pages + (actively modifying live processes' page tables and constantly flooding + them with page invalidation IPIs, which can be up to millions per + second), which causes the process to become unresponsive for up to + seconds or even minutes in some severe cases. In case of sshd, we want + to always be able to connect to the system, even if it's under heavy + kcompactd load. + + Introduce an option to protect sshd and its children sessions from being + compacted by kcompactd (this works in cojunction with + compact_unevictable_allowed = 0). Note that we depend on MCL_ONFAULT + being available, which was introduced in linux 4.4. MCL_ONFAULT allows + the system to lock pages lazily, thus drastically reducing memory usage + of a locked process (without MCL_ONFAULT, every existing mapping in the + process is instantly write-faulted). + +commit fdc4853c5b1567934d43ab13282f03033cc21325 +Author: Daniil Tatianin +Date: Thu Feb 27 11:46:25 2025 +0300 + + platform: introduce a way to hook new session start + + Previously this was possible via post_fork_child, but ever since sshd + was split into multiple binaries, this is now no longer possible becase + of execv. + +commit 1b311b6b17be81577514c38e8be4f5740d7df496 +Author: dtucker@openbsd.org +Date: Wed Mar 19 06:11:15 2025 +0000 + + upstream: Prevent theoretical NULL deref in throughlocal_sftp. + + Coverity CID 405019, although at the moment it's not reachable. ok djm@ + + OpenBSD-Commit-ID: 630d46c1021b69fbb470e349976c70e9a48b7644 + +commit 96493ebd6ff48bbb802576e208794a26928569b0 +Author: Darren Tucker +Date: Wed Mar 19 17:35:10 2025 +1100 + + Fix workflow syntax again. + +commit 575c43fd4c44d376b1771c0fdaf4941021ba88c9 +Author: Darren Tucker +Date: Tue Mar 18 20:54:48 2025 +1100 + + Differentiate logfiles better. + +commit 8a1294638f3a47d46263ea574fa85c8e115ea893 +Author: Darren Tucker +Date: Tue Mar 18 20:27:46 2025 +1100 + + Fix another typo in workflow. + +commit bd9e6bbcc864b3e10c4e11f5aec1b3a5e3a89b55 +Author: Darren Tucker +Date: Tue Mar 18 18:16:12 2025 +1100 + + Fix syntax error in workflow. + +commit ce88a1bb4a2e6425752094f7a2eb4adfb0ca7971 +Author: Darren Tucker +Date: Tue Mar 18 18:13:14 2025 +1100 + + Identify each logfile while printing them. + +commit b58e429960c4791fc4e30bb7c70d1f77d538b546 +Author: djm@openbsd.org +Date: Tue Mar 18 04:53:14 2025 +0000 + + upstream: fix NULL dereference for Match conditions missing + + arguments, e.g. "Match user". Spotted by Coverity (CID 477813) + + OpenBSD-Commit-ID: 13584281cfa23b8ebc41f9d128a6b9464ae960d4 + +commit 0ce5281f017c3ad7bdcc2bbd9745119a73e0cbb8 +Author: tb@openbsd.org +Date: Fri Mar 14 09:49:49 2025 +0000 + + upstream: Fix EVP_CIPHER_CTX_ctrl() return checks + + While this API tries to translate negative return values (i.e. -1) to 0 + in BoringSSL and LibreSSL, it is still possible for it to return negative + values in prinicple. We even incorrectly document that -1 can be returned + while Boring and OpenSSL plead the Fifth. + + In OpenSSL 3 there are now code paths that explicitly return -1 and they + started shifting their return checks to <= 0 - of course they do this in + inconsistent and sometimes incorrect manner. While these paths aren't + reachable from ssh right now, who can really tell what happens in the two + hundred lines of inscrutable bloated mess this has become. + + So error check with <= 0 to ensure that we don't accidentally translate an + error to success. + + ok markus schwarze + + OpenBSD-Commit-ID: a855c833cf4ecfce43bedc761f26ad924f70483c + +commit 2e81100763d5885e500f065b04c16ed87ce74318 +Author: Darren Tucker +Date: Mon Mar 17 21:35:55 2025 +1100 + + Fix debug log path. + +commit 442a44970179d70ebb62bba792699eaec978a1db +Author: Darren Tucker +Date: Fri Mar 14 16:24:06 2025 +1100 + + Also lazily unmount workspace in case of straggers. + +commit 20427f6735fe5ddab31911ce5315adc71acf47d8 +Author: Darren Tucker +Date: Fri Mar 14 16:17:39 2025 +1100 + + Make sure upstream tests run on correct hardware. + +commit 91a2f70a56827ae31649baf17227b0914ac5aa36 +Author: Darren Tucker +Date: Fri Mar 14 13:47:27 2025 +1100 + + Add OpenBSD upstream test on obsdsnap-arm64. + +commit c20f7413525602b0ea786d8974d03a81f7ca2a92 +Author: Damien Miller +Date: Thu Mar 13 10:45:53 2025 +1100 + + rebuild .depend + +commit d47ef958b89c6fa809302d654009d3dfabe11b75 +Author: djm@openbsd.org +Date: Wed Mar 12 22:43:44 2025 +0000 + + upstream: remove assumption that the sshd_config and any configs + + included from it can fit in a (possibly enlarged) socket buffer, by having + the sshd listener mainloop actively manage sending the configuration to the + sshd-session subprocess. + + work by markus@ w/ a little feedback from me; + ok me and committing on his behalf + + OpenBSD-Commit-ID: 8f54451483f64951853074adb76bc4f838eaf3ae + +commit 9c90b563943c16418d737433ac478974b8761ee5 +Author: dtucker@openbsd.org +Date: Tue Mar 11 11:46:44 2025 +0000 + + upstream: Prime caches for DNS names needed for tests. + + When running the SSHFP tests, particularly on an ephemeral VM, the first + query or two can fail for some reason, presumably because something isn't + fully initialized or something. To work around this, issue queries for the + names we'll need before we need them. + + OpenBSD-Regress-ID: 900841133540e7dead253407db5a874a6ed09eca + +commit 10124eefe875a3e4e1cfb84ebe6a613ed3213b78 +Author: dtucker@openbsd.org +Date: Tue Mar 11 09:06:50 2025 +0000 + + upstream: Some dd's don't understand "1m", so handle seperately. + + OpenBSD-Regress-ID: 1d983b27c96f28f69d3a288c19e8d8c58e1b2ee3 + +commit c21c8fc319376c2f5e0da166e9e89a97a245ae72 +Author: Darren Tucker +Date: Tue Mar 11 19:17:46 2025 +1100 + + Lazily unmount github workspace at end of workflow. + + Sometimes when a test times out the workspace is still busy when we try + to unmount it, which leaves the runner unusable until it's cleaned up + manually. We try to unmount this in the first step, but that usually + doesn't work since it fails during setup before it starts our workflow. + Move it to the end and make it a lazy unmount so it hopefully works + eventually. + +commit 4bcbac742968f5086cfd4c570a51de25ef77931f +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:50:20 2025 +0000 + + upstream: Add regress test for sftp resume. + + OpenBSD-Regress-ID: 37f629b3014338fa23a85df1e1bb320ea12282e1 + +commit e2c4f070b43a4fd7d59a9350e2fe78df605830b5 +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:46:02 2025 +0000 + + upstream: Use ssh binary instead of the (smaller) script when + + preparing test data files since it's faster. + + OpenBSD-Regress-ID: 4215e42682fdb73e131e10645d4a1a23a91d64f5 + +commit 62f02e95ba5cda4649c482d30f4370e2360eb94d +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:43:45 2025 +0000 + + upstream: Set up dbclient's known_hosts as it expects. + + OpenBSD-Regress-ID: 9e0898e8423237ce5023be53787bb4062e0d0418 + +commit 395284bd52887dbaf7e78200c857d7f2d9ce398e +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:43:03 2025 +0000 + + upstream: Use $DBCLIENT to access dbclient for consistency. + + OpenBSD-Regress-ID: 81e1b41e1ffc49aba1e6fcaeb6242f3b7875ea3c + +commit 97e10c0005a784622c61cb4e8bb7858b410bbcc6 +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:42:08 2025 +0000 + + upstream: Check if dbclient supports SHA1 before trying SHA1-based + + KEX. + + Dropbear 2025.87 removed SHA1 support by default, which means + diffie-hellman-group14-sha1 is not available. Unfortunately there isn't a + flag to query supported KEX, so instead check MACs and if it doesn't have + SHA1 methods, assuming SHA1 based KEXes are likewise not available. Spotted + by anton@. + + OpenBSD-Regress-ID: acfa8e26c001cb18b9fb81a27271c3b51288d304 + +commit 29a5127f808d00aa539fd27d83a65c2c56179b0e +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:48:51 2025 +0000 + + upstream: Set highwater when resuming a "put". Prevents bogus "server + + reordered acks" debug message. ok djm@ + + OpenBSD-Commit-ID: aa7f6d0fc2e893c8c278ea3e6e0974c2eca83f5d + +commit 6575859d7acb110acf408707f98ed9744ca7d692 +Author: dtucker@openbsd.org +Date: Mon Mar 3 06:54:37 2025 +0000 + + upstream: Test for %-token and env var expansion in SetEnv. + + OpenBSD-Regress-ID: bd6139a6177ac4afb29a0ce4afc23567b22ef9f9 + +commit fd7ad8d7bf7dbdeb8f11a8b51aa9d31df1a17e52 +Author: dtucker@openbsd.org +Date: Sun Mar 2 07:41:06 2025 +0000 + + upstream: Also test User expansions when supplied via -l option and + + user@host. + + OpenBSD-Regress-ID: 56415859260b53ef0dd20f71225ba5fdf6320f50 + +commit e6cfd783f1491b502db9322aa970822c63f1667d +Author: dtucker@openbsd.org +Date: Sat Mar 1 06:12:47 2025 +0000 + + upstream: Tests for User expansion of %-tokens and environment + + variables. + + OpenBSD-Regress-ID: 7ed21dd0e09fb1f3537b8b177f171018aa501628 + +commit 197e503b8e4b642ce0f405a5d65da4256fa96431 +Author: djm@openbsd.org +Date: Fri Dec 6 16:25:58 2024 +0000 + + upstream: use glob(3) wildcards in AuthorizedKeys/PrincipalsFile + + tests to exercise this feature; ok dtucker + + OpenBSD-Regress-ID: 7f7b19c0b05b1862cc6521ce61b2b301a3f9cc3b + +commit 396202180180a4ac16788d469508a348789dafa1 +Author: djm@openbsd.org +Date: Fri Dec 6 10:37:42 2024 +0000 + + upstream: implement attestation verification for ED25519 keys + + OpenBSD-Regress-ID: c44fa5cdb434375a8b5545fdb4fc651061afca1f + +commit b49875428cda9c16c5bd52552100da2b419cda5f +Author: dtucker@openbsd.org +Date: Mon Mar 3 06:53:09 2025 +0000 + + upstream: Add %-token and environment variable expansion to SetEnv. + + feedback deraadt@ jmc@, nits and ok djm@ + + OpenBSD-Commit-ID: 2f6e5070481cb73e6f35fd1c6608c1eeff88a5c1 + +commit b6bba67e6c31d268480773e4fed16d0a32b4218e +Author: djm@openbsd.org +Date: Sun Mar 2 22:44:00 2025 +0000 + + upstream: fix PerSourcePenalty incorrectly using "crash" penalty when + + LoginGraceTime was exceeded. Reported by irwin AT princeton.edu via bz3797 + + OpenBSD-Commit-ID: 1ba3e490a5a9451359618c550d995380af454d25 + +commit 38d69fee1b06948f160d94abd07b6b297630d30a +Author: Damien Miller +Date: Sun Mar 2 22:06:53 2025 +1100 + + include __builtin_popcount replacement function + + Some systems/compilers lack __builtin_popcount(), so replace it as + necessary. Reported by Dennis Clarke; ok dtucker@ + +commit c94138d02a45dda5015f38f5a60b0bdde29019c1 +Author: djm@openbsd.org +Date: Sun Mar 2 11:03:13 2025 +0000 + + upstream: whitespace + + OpenBSD-Commit-ID: 1bd8953a37451ef7e0991f9fceec5e8005fe986a + +commit 65d2c59628e68e166046efa69e76c1d395a8df6e +Author: dtucker@openbsd.org +Date: Sun Mar 2 07:02:49 2025 +0000 + + upstream: Make a copy of the user when handling ssh -l, so that + + later during User token expansion we don't end up freeing a member of argv. + Spotted by anton@'s regress tests. + + OpenBSD-Commit-ID: 2f671a4f5726b66d123b88b1fdd1a90581339955 + +commit bd30cf784d6e825ef71592fb723c41d4f2fd407b +Author: dtucker@openbsd.org +Date: Sat Mar 1 06:11:26 2025 +0000 + + upstream: Allow %-token and environment variable expansion in User, + + with the exception of %r and %C which are self-referential. Requested in + bz#3477, ok djm@, man page improvements jmc@ + + OpenBSD-Commit-ID: caeb46251ee073662f6f5864c6f7b92d8ac80fa8 + +commit 94f59dcfc57f95ae044f75c3ce544329c8956c35 +Author: Darren Tucker +Date: Sat Mar 1 10:28:59 2025 +1100 + + Rebuild config files if Makefile changes. + + This ensures paths are updated if they are changed by re-running configure. + Patch from rapier at psc.edu. + +commit dfd9880585db1570656022f9fe1519df673f7b8a +Author: Darren Tucker +Date: Wed Feb 26 18:16:03 2025 +1100 + + Check for le32toh, le64toh, htole64 individually. + + It appears that at least some versions of endian.h in glibc do not have + the latter two, so check for and replace each one individually. + bz#3794, ok djm@ + +commit cb99e8eb228df366af33f4fe88d7a9dd0dbf0756 +Author: djm@openbsd.org +Date: Tue Feb 25 06:25:30 2025 +0000 + + upstream: ressurect fix for "match invalid-user" that got clobbered + + by 1.423 + + OpenBSD-Commit-ID: d18bf0945976e0f3467d710d4bc8bdbe181c0567 + +commit 487cf4c18c123b66c1f3f733398cd37e6b2ab6ab +Author: deraadt@openbsd.org +Date: Fri Feb 21 18:22:41 2025 +0000 + + upstream: Also prohibit , (comma) in hostnames, proposed by David + + Leadbeater ok djm millert + + OpenBSD-Commit-ID: 2837fa31dc6e81976f510f0a259edaa559b20b07 + +commit 3bc6de98c830bd5207f6c371ba69c5874f06305b +Author: Damien Miller +Date: Mon Feb 24 17:27:50 2025 +1100 + + Try to fix github tcmalloc target failure + + tcmalloc may, depending on the stacktrace generator it uses, create + pipe(2) fds during shared library initialisation. These will later + get clobbered by ssh/sshd calling closefrom() and chaos will ensue. + Tell tcmalloc to use an unwinder that doesn't pull this stuff. + +commit 922e54bbfe8c8479453693ef52350338f0c19124 +Author: Damien Miller +Date: Fri Feb 21 13:44:35 2025 +1100 + + cleanup last mention of ubuntu-20.04 + +commit bc4b3f6dc1738d389e5c9dcca8c56d7e153fee49 +Author: Damien Miller +Date: Fri Feb 21 13:44:13 2025 +1100 + + prune gcc/clang versions to be tested + + Test only the oldest and latest versions of each + +commit 94b73755f931d592a612ef5cb998694643eab5ff +Author: Damien Miller +Date: Fri Feb 21 11:30:22 2025 +1100 + + Update AWS-LC version number + + Patch from Shubham Mittal bz bz3792 + +commit 6887099fae6d9f3482e1075d034e9343dc413200 +Author: Damien Miller +Date: Fri Feb 21 11:22:34 2025 +1100 + + adjust workflows for ubuntu version transition + + remove workflows for unsupported compilers, add a few for additional + supported compilers, move some workflows to run on ubuntu-latest + +commit 33bb47e6f74f2ca8093946e6f462d655a9ae46d3 +Author: Damien Miller +Date: Thu Feb 20 17:10:32 2025 +1100 + + Add ubuntu-*-arm test runners + +commit a0c95fbb215b2168fa51b15906e2d6990d7fef6b +Author: Damien Miller +Date: Thu Feb 20 17:03:28 2025 +1100 + + remove ubuntu-20.04 Github action runners + + ubuntu-20.04 is deprecated now, so migrate all its unique runners + to ubuntu-22.04. + + ok dtucker@ + +commit 0cbeedba81b57c56379e1d202b9ccd3b72af7ddc +Author: Damien Miller +Date: Tue Feb 18 19:03:42 2025 +1100 + + openssh-9.9p2 + +commit 0832aac79517611dd4de93ad0a83577994d9c907 +Author: djm@openbsd.org +Date: Tue Feb 18 08:02:48 2025 +0000 + + upstream: Fix cases where error codes were not correctly set + + Reported by the Qualys Security Advisory team. ok markus@ + + OpenBSD-Commit-ID: 7bcd4ffe0fa1e27ff98d451fb9c22f5fae6e610d + +commit 6ce00f0c2ecbb9f75023dbe627ee6460bcec78c2 +Author: djm@openbsd.org +Date: Tue Feb 18 08:02:12 2025 +0000 + + upstream: Don't reply to PING in preauth phase or during KEX + + Reported by the Qualys Security Advisory team. ok markus@ + + OpenBSD-Commit-ID: c656ac4abd1504389d1733d85152044b15830217 + +commit 9e5bd74a85192c00a842f63d7ab788713b4284c3 +Author: jmc@openbsd.org +Date: Sat Feb 15 06:48:56 2025 +0000 + + upstream: - use \& when contructs like "e.g." end a line, to avoid + + double spacing - macro is Qq not Oq + + OpenBSD-Commit-ID: 17e5d2d7f288cc7fc536e3af252224525f9fb43a + +commit f519e71fb7a46314ae16e2a75490649dc0bd01a2 +Author: Damien Miller +Date: Sat Feb 15 13:12:40 2025 +1100 + + depend + +commit 9131ac64b0ebe66dc1de9d44bf8d1bd64a24c350 +Author: djm@openbsd.org +Date: Sat Feb 15 01:52:07 2025 +0000 + + upstream: add "Match version" support to ssh_config. Allows + + matching on the local version of OpenSSH, e.g. "Match version OpenSSH_10.*" + + ok markus@ + + OpenBSD-Commit-ID: c0cb504d0b9e43ccf12e68a544a7cd625e89758d + +commit 192a20df00c8a56fe7d92ffa23d959c865d7fb9e +Author: djm@openbsd.org +Date: Sat Feb 15 01:50:47 2025 +0000 + + upstream: Add support for "Match sessiontype" to ssh_config. Allows + + matching on the type of session requested, either "shell" for interactive + sessions, "exec" for command execution sessions, "subsystem" for subsystem + requests, such as sftp, or "none" for transport/forwarding-only sessions. + + ok markus@ + + OpenBSD-Commit-ID: eff5c001aecb2283d36639cfb28c0935a8bfd468 + +commit caa3c0c77082888236b0b0c4feb3e6879731b3ba +Author: djm@openbsd.org +Date: Sat Feb 15 01:48:30 2025 +0000 + + upstream: "Match command ..." support for ssh_config to allow + + matching on the remote command specified on the commandline. + + Also relaxes matching rules for `Match tagged` to allow + `Match tagged ""` to match an empty tag value. This also works + for command. + + ok markus@ + + OpenBSD-Commit-ID: 00dcfea425bf58d824bf5e3464cfc2409121b60d + +commit 38f6000e9851a00e2e4b8e1eb4ea6a243ef7e6a3 +Author: Damien Miller +Date: Tue Feb 11 10:32:26 2025 +1100 + + depend + +commit aa1409e7a0a5605f0127651a3ba5a348666325bc +Author: djm@openbsd.org +Date: Mon Feb 10 23:19:26 2025 +0000 + + upstream: include arguments the command was invoked with, and + + operating system name, version and architecture in startup debugging output; + ok dtucker + + OpenBSD-Commit-ID: 2a509d319aaf31a6bf9998e1842832883fbc3edd + +commit 857ac20f5fe19f183defba5dbf4b7d9e6400230c +Author: djm@openbsd.org +Date: Mon Feb 10 23:16:51 2025 +0000 + + upstream: include line number in Match debug messages, makes it a + + little easier to see what's going on + + OpenBSD-Commit-ID: 1fcf4aa2ee667711b9497ded0fa52d757c69b1df + +commit af49d474e481d2d78b2f06b06a06b0b37629358e +Author: djm@openbsd.org +Date: Mon Feb 10 23:00:29 2025 +0000 + + upstream: fix "Match invalid-user" from incorrectly being activated + + in initial configuration pass when no other predicates were present on the + match line + + OpenBSD-Commit-ID: 02703b4bd207fafd03788bc4e7774bf80be6c9a8 + +commit 1c67bae3f5834e48ded71c406f2039dea6e536db +Author: schwarze@openbsd.org +Date: Sun Feb 9 18:24:08 2025 +0000 + + upstream: In a section 1 manual, use the plain English words + + "standard output" rather than the overly technical abbreviation "stdout" - we + are not talking about a device file or a FILE * object here. Issue reported + by on the groff mailing list. + + OpenBSD-Commit-ID: a0816999f970e6159523bed8484f62c42ec93109 + +commit 85b3d68dd931416ede657f371f1d60cdc3a66f34 +Author: dtucker@openbsd.org +Date: Fri Jan 17 00:09:41 2025 +0000 + + upstream: Fix debug logging of user specific delay. Patch from + + Achim Leitner (fjl5) via github PR#552. + + OpenBSD-Commit-ID: 834a869ed9b15058d3c1ef0cd75402ef989255d8 + +commit e4e5b06fdf4532705669c0ae944b364022d16b9d +Author: dtucker@openbsd.org +Date: Thu Jan 16 06:37:10 2025 +0000 + + upstream: Call log_init in sshd-auth and sshd-session immediately + + after parsing the config file so that any log settings set in the config file + take effect immediately. Move version banners to immediately after that, and + make them distinct per binary. ok djm@ + + OpenBSD-Commit-ID: acf3d090638edf9b6e6f78eed96b537fe671f0f5 + +commit 0643994b20f2cc54bca80842a984b3052ff1a6a9 +Author: dtucker@openbsd.org +Date: Wed Jan 15 22:23:13 2025 +0000 + + upstream: Use strprefix helper when processing sshd -C test args + + instead of counting bytes by hand. ok djm@ + + OpenBSD-Commit-ID: 2866d369d96fe04bf76112260ac37e489f98a9a9 + +commit 66efd0fbb6b8b95f8a520f2cdf8ede14e62b30b3 +Author: Damien Miller +Date: Thu Feb 6 09:38:09 2025 +1100 + + add support for AWS-LC (AWS libcrypto) + + Patch from Shubham Mittal via bz3784; ok dtucker + +commit 826483d51a9fee60703298bbf839d9ce37943474 +Author: Tim Rice +Date: Mon Dec 16 15:36:54 2024 -0800 + + fix old typo (s/SYSVINITSTOPT/SYSVINITSTOP/) + +commit 1a8ce460f1d0c3f7304edba0733783b57b430e21 +Author: dtucker@openbsd.org +Date: Thu Dec 12 09:09:09 2024 +0000 + + upstream: Plug leak on error path, spotted by Coverity. ok djm@ + + OpenBSD-Commit-ID: b1859959374b4709569760cae0866d22a16606d3 + +commit 924f996144fc0ae1a659fadcfc2237d1ae935fc4 +Author: Xavier Hsinyuan +Date: Mon Dec 9 11:21:05 2024 +0800 + + Add $(srcdir) for standalone sk-libfido2 make target. + + Fix out-of-tree build failure due to incorrect path for `sk-usbhid.c`. + +commit bbc9c18e84de29c83fa03e69290979fcca54a2b2 +Author: djm@openbsd.org +Date: Sat Dec 7 10:12:19 2024 +0000 + + upstream: replace bespoke logging of MaxSessions enforcement with + + new ratelimited logging infrastructure. + + Add ratelimits to logging of connections dropped by PerSourcePenalties + + ok dtucker + + OpenBSD-Commit-ID: f22fe7c39607e4361aadf95e33773ffd68c59489 + +commit 5a6ddf946cf105189c2c99a04f86ce95edc55fc5 +Author: djm@openbsd.org +Date: Sat Dec 7 10:05:36 2024 +0000 + + upstream: add infrastructure for ratelimited logging; feedback/ok + + dtucker + + OpenBSD-Commit-ID: 18a83e5ac09d59aaf1e834fd6b796db89dd842e7 + +commit 85f0c1e75e8f6c5d83b8070918ee2f6ab16d403e +Author: djm@openbsd.org +Date: Fri Dec 6 16:24:27 2024 +0000 + + upstream: allow glob(3) patterns for sshd_config AuthorizedKeysFile + + and AuthorizedPrincipalsFile directives; bz2755 ok dtucker + + OpenBSD-Commit-ID: 3e3e05a17fca39bba78b993a07b44664519adf7f + +commit 9a9ffee6e10bcd039f1f9385599577441ebe542a +Author: djm@openbsd.org +Date: Fri Dec 6 16:21:48 2024 +0000 + + upstream: support VersionAddendum in the client, mirroring the + + option of the same name in the server; bz2745 ok dtucker@ + + OpenBSD-Commit-ID: 6ff7905b3f9806649bde750515786553fb89cdf4 + +commit 41ab0ccecd68232e196efae5e224b31ca104c423 +Author: djm@openbsd.org +Date: Fri Dec 6 16:02:12 2024 +0000 + + upstream: clarify encoding of options/extensions; bz2389 + + OpenBSD-Commit-ID: c4e92356d44dfe6d0a4416deecb33d1d1eba016c + +commit 5488810359f0fd91e2f7b919c70a3798e46376cb +Author: djm@openbsd.org +Date: Fri Dec 6 15:17:15 2024 +0000 + + upstream: ignore SIGPIPE here; some downstreams have had this for + + years... + + OpenBSD-Commit-ID: 73674ee4f8ceb8fc9cb8de71d8ddea0c721eb035 + +commit 4389a792d9078212366eba124a3eed36e009d09e +Author: djm@openbsd.org +Date: Fri Dec 6 15:12:56 2024 +0000 + + upstream: sync -o option lists with ssh.1; requested jmc@ + + OpenBSD-Commit-ID: a7ac295b444da7b2ca7a33a52370594f6897f6bb + +commit 6b9cd095565ddc5402d5096dce248fa0521dbda3 +Author: Fabio Pedretti +Date: Mon Oct 16 17:12:24 2023 +0200 + + Remove ancient RHL 6.x config in RPM spec. + + It looks like build6x options were intended for RHL 6.x + (the Red Hat distro predating Fedora, not RHEL), but were + then applied to RHEL. + + Completely remove support for this ancient configuration. + + Successfully built, installed and run on RHEL 6. This also + remove a build warning about deprecation of PreReq. + +commit 5cacfa798f92b707491375fed748d1d1bcb33ec9 +Author: Darren Tucker +Date: Fri Dec 6 23:54:45 2024 +1100 + + Add new hardware-backed signing key for myself. + + Retire old non-hardware based signing key. + +commit f129b6ee1d4361799e65307216e3a4d5544356b7 +Author: Jonas 'Sortie' Termansen +Date: Sat Nov 2 22:05:45 2024 +0100 + + Fix configure implicit declaration and format warnings. + +commit 11a5e5179077f73c2d45bcdf3f60153ae3f17815 +Author: dtucker@openbsd.org +Date: Fri Dec 6 07:05:54 2024 +0000 + + upstream: Expand $SSH to absolute path if it's not already. + + Prevents problem later in increase_datafile_size if ssh is not in + the path. Patch from quaresmajose via GHPR#510. + + OpenBSD-Regress-ID: 2670a66af8b827410ca7139f0a89f4501cece77b + +commit dc2ef8f0944a4ff7ba19e52fd17b4654e6bd9b93 +Author: dtucker@openbsd.org +Date: Fri Dec 6 06:55:28 2024 +0000 + + upstream: Change "login again" to "log in again" + + in password change message. From ThinLinc-Zeijlon via github PR#532. + + OpenBSD-Commit-ID: fea5e9bc04caf613a118c419f16863733b340cf1 + +commit 8252f346eb21cd6b30816f905b7d94f10962373e +Author: naddy@openbsd.org +Date: Thu Dec 5 22:45:03 2024 +0000 + + upstream: catch up documentation: AES-GCM is preferred to AES-CTR + + OpenBSD-Commit-ID: 63360924b6834507fe70020edb936f5075043a9e + +commit 9a2f4c75081769bd45eba2bf3fab0a32b25f1879 +Author: Darren Tucker +Date: Fri Dec 6 17:56:17 2024 +1100 + + Change text from "login to" to "log in to". + + From ThinLinc-Zeijlon via GHPR#532. + +commit 24dcf368d816b06136a02845ebd0c7846bf18927 +Author: Xavier Hsinyuan +Date: Fri Dec 6 11:56:34 2024 +0800 + + Fix configure message typo in sk-libfido2 standalone. + +commit 1a0cac2f3411a22d69ae6918eff48456b805e73b +Author: Alexander Kanavin +Date: Thu Dec 5 16:26:46 2024 +0100 + + Skip 2038 key expiry test on 64 bit time_t systems. + + This allows testing Y2038 with system time set to after that (i.e. 2040), + so that actual Y2038 issues can be exposed, and not masked by key expiry + errors. + + Signed-off-by: Alexander Kanavin + +commit 6b4611dc1232c5d2c8e43201f580f19aab320c87 +Author: Darren Tucker +Date: Fri Dec 6 01:45:52 2024 +1100 + + Skip 64bit expiry time test on 32bit time_t. + +commit c9b7866a7dc5e6c30f5aa9d22dd0bbafda0d496f +Author: dtucker@openbsd.org +Date: Thu Dec 5 14:28:39 2024 +0000 + + upstream: Add key expiry test in the 64bit time_t range for additional + + coverage. From Alexander Kanavin via bz#3684. + + OpenBSD-Regress-ID: bdf6eb3c2421f2e1e11483d03b34c7931d1bccf7 + +commit 790c913b5fc6ee93ae14793443dc85a0f574b7eb +Author: Damien Miller +Date: Thu Dec 5 19:24:56 2024 +1100 + + typo + +commit d23a23aaeeabc228792e3fd7eb5f2fa6ae13c482 +Author: Damien Miller +Date: Thu Dec 5 08:47:02 2024 +1100 + + add a Makefile target for ssh-verify-attestation + + Not built by default, but easier than doing it by hand + +commit d0ac63d0f8b5f778d5fd326701ef4489bc27635e +Author: dtucker@openbsd.org +Date: Thu Dec 5 06:49:26 2024 +0000 + + upstream: De-magic the x11 base port number into a define. ok djm@ + + OpenBSD-Commit-ID: 23b85ca9d222cb739b9c33ee5e4d6ac9fdeecbfa + +commit 9998c93d57bf0f1df2bc93e0bc2d8112c6f8c720 +Author: dtucker@openbsd.org +Date: Thu Dec 5 06:47:00 2024 +0000 + + upstream: Prevent integer overflow in x11 port handling. These are + + theoretically possible if the admin misconfigures X11DisplayOffset or the + user misconfigures their own $DISPLAY, but don't happen in normal operation. + From Suhov Roman via bz#3730, ok djm@ + + OpenBSD-Commit-ID: e9e3860f1a19b862ccf07dc8ecbe8f1e1034f4ed + +commit 8c9ee046d40e4254c6c1711783ea11027b72c3e9 +Author: djm@openbsd.org +Date: Wed Dec 4 16:42:49 2024 +0000 + + upstream: add a work-in-progress tool to verify FIDO attestation + + blobs that ssh-keygen can write when enrolling FIDO keys. + + OpenBSD-Regress-ID: 6c97bf3f46e48866677ad69f54b77683eb92437f + +commit 50c640d874d0246dd0a0d949398c3d7f757c716a +Author: dtucker@openbsd.org +Date: Wed Dec 4 10:51:13 2024 +0000 + + upstream: Don't assume existence of SK provider in test. Patch from + + balu.gajjala at gmail via bz#3402. + + OpenBSD-Regress-ID: d571932016d07d135b54433d07520b9e1901db43 + +commit 73d782693144262570d3585b62f16b183170c014 +Author: djm@openbsd.org +Date: Wed Dec 4 14:37:55 2024 +0000 + + upstream: sync the list of options accepted by -o with ssh_config.5 + + prompted by bz3455 + + OpenBSD-Commit-ID: 0ecbfa70aea6c769bcc259defe07182edf461f57 + +commit 6993d9f0959534b0b7d52e17b95e9e79fb0b3d0a +Author: djm@openbsd.org +Date: Wed Dec 4 14:24:20 2024 +0000 + + upstream: don't screw up ssh-keygen -l output when the file + + contains CR characters; GHPR236 bz3385, fix from Dmitry Belyavskiy + + OpenBSD-Commit-ID: e458cf6b0adcea5b69ef4c7ba38e590841d02ef4 + +commit c0b03c2534946fc114880092177aa4a3683ced2d +Author: jsg@openbsd.org +Date: Tue Dec 3 22:30:03 2024 +0000 + + upstream: spelling; ok djm@ + + OpenBSD-Commit-ID: c8ff3f70020451eef214e598117b7ce1a29853ef + +commit 97eb247f40167f44324e88a537d5b4fe771a63b2 +Author: dtucker@openbsd.org +Date: Tue Dec 3 16:27:53 2024 +0000 + + upstream: Remove fallback to compiled-in gropup for dhgex when the + + moduli file exists, but does not contain moduli within the client-requested + range. The fallback behaviour remains for the case where the moduli file does + not exist (typically, running tests prior to installing). From bz#2793, based + in part on patch from Joe Testa, ok djm@ + + OpenBSD-Commit-ID: b1a8c5dbbedf249b42474679ebaf14db7332b1ab + +commit 30c746265ebde29806dba77c92fb1fd3803cbf5c +Author: tb@openbsd.org +Date: Tue Dec 3 15:53:51 2024 +0000 + + upstream: Remove redundant field of definition check + + This will allow us to get rid of EC_GROUP_method_of() in the near future. + + ok djm + + OpenBSD-Commit-ID: b4a3d2e00990cf5c2ec6881c21ddca67327c2df8 + +commit eaa1744f34c30740328fd0a0d84b5f2f9e6918c1 +Author: Damien Miller +Date: Thu Dec 5 00:59:19 2024 +1100 + + don't ignore changes in regress Makefiles + + reported by Torben Hansen in bz2880 + +commit 66e986880b2472fefaad781f10113b138b65ff27 +Author: Damien Miller +Date: Thu Dec 5 00:01:33 2024 +1100 + + Support systemd-style socket activation in agent + + Adds support for systemd LISTEN_PID/LISTEN_FDS socket activation to + ssh-agent. Activated when these environment variables are set and + the agent is started with the -d or -D option and no socket path + is set. + + Based on GHPR502 by Daniel Kahn Gillmor, ok dtucker + +commit 9b57c099f57152e6c94f633c114f544087f4bdaa +Author: Darren Tucker +Date: Wed Dec 4 21:36:01 2024 +1100 + + Update readme files to better reflect reality. + + Prompted by bz#3738, ok djm@. + +commit ffa885db1b960451d426455045d2f51288e48ee8 +Author: dtucker@openbsd.org +Date: Tue Dec 3 14:12:47 2024 +0000 + + upstream: Improve description of KbdInteractiveAuthentication. + + Based on bz#3658, fixes jmc@ ok markus@ djm@. + + OpenBSD-Commit-ID: 9fadb56b9afed554d501acbba911c685acd6ffc2 + +commit b460f82a67795bba37c6cc6c78f788e5b435b4cb +Author: Jonas 'Sortie' Termansen +Date: Sat Nov 2 17:53:23 2024 +0100 + + Inherit DESTDIR from the environment. + + autoconf packages conventionally inherit the DESTDIR variable from the + environment. + +commit 9da7fa7c7464df241ae5d17da94e4ebed9013719 +Author: Jonas 'Sortie' Termansen +Date: Sat Nov 2 22:10:39 2024 +0100 + + Define u_short and u_long if needed. + +commit d3a7ff7cecbc23cc37044bdf02e7118d05bf3c35 +Author: djm@openbsd.org +Date: Tue Dec 3 08:31:49 2024 +0000 + + upstream: support FIDO tokens that return no attestation data, e.g. + + recent WinHello. From Michael Braun via GHPR542 + + OpenBSD-Commit-ID: a71b0542f2f7819ba0e33a88908e01b6fc49e4ce + +commit 96b64056c812620014b65371a9e3ac86bfcd08d5 +Author: Thorsten Kukuk +Date: Tue Nov 19 10:53:28 2024 +0100 + + Add wtmpdb support as Y2038 safe wtmp replacement + +commit 1d9563a56f2ad5b0c0aeef20e19c1a03ad54f88a +Author: djm@openbsd.org +Date: Mon Dec 2 14:06:42 2024 +0000 + + upstream: unbreak + + OpenBSD-Commit-ID: 05b6c31f4a6e385338f43cc0e08776cea75802a1 + +commit d75837b9f6d0d6cc18ed5078789ea0f3dad08f00 +Author: djm@openbsd.org +Date: Mon Dec 2 13:37:18 2024 +0000 + + upstream: prefer AES-GCM to AES-CTR; ok deraadt markus + + OpenBSD-Commit-ID: 8366a72e0f300ee31c5dab2c95025387ec15bbc9 + +commit e19cd494b567a73dc390e09b47c1e21545e6116b +Author: Shiva Kaul +Date: Mon Dec 2 02:04:20 2024 -0500 + + Fix compilation with DEBUG_SK enabled + + In `ssh_ecdsa_sk_verify`, the `datalen` variable was renamed to `dlen` -- but not in this debugging block. + +commit 67ace92be0718df7e0f52c0a76684fc2ebae4089 +Author: dtucker@openbsd.org +Date: Fri Nov 29 00:13:36 2024 +0000 + + upstream: Import regenerated moduli. + + OpenBSD-Commit-ID: 311d271bf0fab8a119e84f4f696d8cd40731692f + +commit ca0697a90e5720ba4d76cb0ae9d5572b5260a16c +Author: Jeremy Stott +Date: Sat Oct 19 12:10:52 2024 +1300 + + Add make target for standalone sk-libfido2 + + Add a Makefile target for sk-libfido2, the standalone fido2 security + key shared library, suitable for use with the SecurityKeyProvider + option. + + Add a new configure option `--with-security-key-standalone` that + optionally sets the shared library target sk-libfido2$(SHLIBEXT), and + adds it to $(TARGETS). + + misc.h is required when SK_STANDALONE is defined, because of the use + of `monotime_tv` in `sk_select_by_touch`. + + Sets the shared library extension for sk-libfido2 is by setting + `SHLIBEXT` depending on the platform in configure.ac. + + Add the shared library to the CI builds in the `sk` target config to + make sure it can compile under the same conditions as + `--with-security-key-builtin`. + + Add a libssh-pic.a static library that compiles with `-fPIC` reusing + .c.lo method in sk-dummy.so for use in the shared library sk-libfido2. + + Note, a separate static library libssh-pic.a is needed, since defining + -DSK_STANDALONE excludes some symbols needed in sshkey.lo. + +commit 74d70841efbf41b9fcc8e6f6f4777d2e9d7e2004 +Author: Arnout Engelen +Date: Fri Oct 18 13:42:38 2024 +0200 + + mdoc2man: balance nested square brackets + + I noticed the square brackets in `destination [command [argument...]` + in the synopsis for the `ssh.1` manpage were not balanced, + this balances them. + + Signed-off-by: Arnout Engelen + +commit 8eabd2ae2ca1d7756417a1ee5b41f09c5d997634 +Author: djm@openbsd.org +Date: Wed Nov 27 16:07:08 2024 +0000 + + upstream: fix argument of "Compression" directive in ssh -G config + + dump, which used to work but broke in 9.8 + + OpenBSD-Commit-ID: c79936242d29c70d01941b28d2d07fd0b85fe46f + +commit 53c03961769d8879a81398074ea3cb36253d4f2e +Author: djm@openbsd.org +Date: Wed Nov 27 13:27:34 2024 +0000 + + upstream: new name/link for agent I-D + + OpenBSD-Commit-ID: e3420f3925a297a1b2ab7dfe7c7d274cfc8e1193 + +commit 785e3c9110df8f2d30e42ce8b45969c49700f35b +Author: djm@openbsd.org +Date: Wed Nov 27 13:00:23 2024 +0000 + + upstream: mention that biometrics may be used for FIDO key user + + verification as well as PIN. Prompted by Zack Newman, ok jmc@ + + OpenBSD-Commit-ID: b774a4438c9be70012661ee278450790d21277b8 + +commit fd2e64c9ec9ea3e89e396be0db41aaf982ae1210 +Author: djm@openbsd.org +Date: Tue Nov 26 22:05:51 2024 +0000 + + upstream: g/c outdated XXX comments + + OpenBSD-Commit-ID: 74d0c0b74994d9a4343c4d7ea4948cb34f609a6c + +commit 0ad34a6193357d286042322ea7347262a6fb0778 +Author: djm@openbsd.org +Date: Tue Nov 26 22:02:28 2024 +0000 + + upstream: regression test for UpdateHostkeys with multiple keys backed + + by ssh-agent. Patch from Maxime Rey. + + OpenBSD-Regress-ID: 1777ab6e639e57c0e20cbcb6df60455b49fd8bb3 + +commit 84023656d91b78f1ef86c8321ec563f2e90f7227 +Author: djm@openbsd.org +Date: Tue Nov 26 22:01:37 2024 +0000 + + upstream: Explicitly specify the signature algorithm when signing + + hostkeys-prove requests. + + Fixes a corner-case triggered by UpdateHostKeys with one or more unknown + host keys stored in ssh-agent where sshd refuses to accept the signature + coming back from the agent. + + Report/fix from Maxime Rey + + OpenBSD-Commit-ID: 460c7d527a24f92b7e5f68ca1a2fa242ebf0d086 + +commit d1c1cfc5e4e9b43593d4642810ea8135e4c7db49 +Author: djm@openbsd.org +Date: Tue Nov 26 21:23:35 2024 +0000 + + upstream: when using RSA keys to sign messages, select the + + signature algorithm based on the requested hash algorithm ("-Ohashalg=xxx"). + + This allows using something other than rsa-sha2-512, which may not + be supported on all signing backends, e.g. some smartcards only + support SHA256. + + Patch from Morten Linderud; ok markus@ + + OpenBSD-Commit-ID: 246353fac24e92629263996558c6788348363ad7 + +commit ac7544654441280071b90a4129a47467d40f2389 +Author: djm@openbsd.org +Date: Sun Nov 24 23:47:50 2024 +0000 + + upstream: turn off CDIAGFLAGS and turn back on INSTALL_STRIP + + accidentally changed in last commit + + OpenBSD-Commit-ID: 6d07e4606997e36b860621a14dd41975f2902f8f + +commit 953fa5b59afb04c3c74ed82d7bace65c13cd8baa +Author: Darren Tucker +Date: Sat Nov 9 11:41:44 2024 +1100 + + Disable security key for bigendian interop. + + It doesn't currently work. It's not clear why, but I suspect + sk-dummy.so ends up being built for the wrong architecture. + +commit a80eb71c428c474098087c672398f200be8fabdf +Author: Darren Tucker +Date: Sat Nov 9 05:14:16 2024 +1100 + + Reshuffle OpenWRT test configs. + + Move the the flags used by the OpenWRT distro to mipsel target and + enable OpenSSL on all targets to improve coverage. + + Explicitly disable security key and openssl on mips target so that host + end of the bigendian interop tests don't attempt them and fail (since + they're not enabled on the target side). + +commit d2709c461359e4129311cdff81ee05242d6c53cd +Author: Darren Tucker +Date: Sat Nov 9 03:26:08 2024 +1100 + + Add keytype to bigendian interop test. + +commit 50ac0f0e0627d29fd9becf5e15e8ceca5ad18078 +Author: Darren Tucker +Date: Sat Nov 9 03:24:29 2024 +1100 + + Ignore chown failure, eg due to dangling symlinks. + +commit 9e528e65a03245cf28e814f09b88c701bec935d1 +Author: Darren Tucker +Date: Sat Nov 2 18:05:41 2024 +1100 + + Test bigendian interop. + + Where our test target is a bigendian system, do an additional build on + the runner host (which is little endian) and test interop between the two. + Should hopefully catch obvious endianness bugs. + +commit dd416f5bfa96ac1ff44b27a93f7b55ee627c6baf +Author: Darren Tucker +Date: Fri Nov 1 19:44:29 2024 +1100 + + Allow overridding TEST_SSH_SSHD. + + This will allow tests to specify an alternative sshd, eg on a remote + machine with different endianness. + +commit 82662d562cf54829df8a941cdfb2fd307e1d9a90 +Author: djm@openbsd.org +Date: Wed Nov 6 22:51:26 2024 +0000 + + upstream: ssh-agent implemented an all-or-nothing allow-list of + + FIDO application IDs for security key-backed keys, to prevent web key handles + from being used remotely as this would likely lead to unpleasant surprises. + By default, only application IDs that start with "ssh:*" are allowed. + + This adds a -Owebsafe-allow=... argument that can override the default + list with a more or less restrictive one. The default remains unchanged. + + ok markus@ + + OpenBSD-Commit-ID: 957c1ed92a8d7c87453b9341f70cb3f4e6b23e8d + +commit 593a0b65c55c1e06a8c22b084aefc395aedb0127 +Author: jca@openbsd.org +Date: Mon Nov 4 21:59:15 2024 +0000 + + upstream: Ignore extra groups that don't fit in the buffer passed + + to getgrouplist(3) + + Our kernel supports 16 groups (NGROUPS_MAX), but nothing prevents + an admin from adding a user to more groups. With that tweak we'll keep + on ignoring them instead of potentially reading past the buffer passed to + getgrouplist(3). That behavior is explicitely described in initgroups(3). + + ok millert@ gilles@ + + OpenBSD-Commit-ID: a959fc45ea3431b36f52eda04faefc58bcde00db + +commit e7adebeff3a9d038d0eaeeb0fcefedf29acb7e90 +Author: Damien Miller +Date: Mon Nov 4 14:39:27 2024 +1100 + + Add git signing key for Tim Rice + +commit da4b84845e874f12af7e0686170fa391c919d1df +Author: Darren Tucker +Date: Fri Nov 1 18:51:22 2024 +1100 + + Correct path to c-cpp.yml file in workflow config. + +commit 28740aa2c75392a9c4191eb9523f9b20853e2932 +Author: Darren Tucker +Date: Fri Nov 1 18:44:42 2024 +1100 + + Test new OpenSSL and LibreSSL releases.` + +commit a74809fe06540f16231b354ffe21fcbf39e81f73 +Author: Darren Tucker +Date: Fri Nov 1 18:44:00 2024 +1100 + + Add nbsd10 default test config. + +commit 88b35cbdc1500efece65cd6a9a20a72cf7e46eaa +Author: Damien Miller +Date: Wed Oct 30 14:25:14 2024 +1100 + + fix uint64_t types; reported by Tom G. Christensen + +commit ef7c26cd2f0f9a8222f851d1e551f6dfd3113f8b +Author: Damien Miller +Date: Sun Oct 27 13:28:11 2024 +1100 + + htole64() etc for systems without endian.h + +commit 0c3927c45f8a57b511c874c4d51a8c89414f74ef +Author: djm@openbsd.org +Date: Sun Oct 27 02:06:59 2024 +0000 + + upstream: explicitly include endian.h + + OpenBSD-Commit-ID: 13511fdef7535bdbc35b644c90090013da43a318 + +commit cf3e48ee8ba1beeccddd2f203b558fa102be67a2 +Author: djm@openbsd.org +Date: Sun Oct 27 02:06:01 2024 +0000 + + upstream: fix ML-KEM768x25519 KEX on big-endian systems; spotted by + + jsg@ feedback/ok deraadt@ + + OpenBSD-Commit-ID: 26d81a430811672bc762687166986cad40d28cc0 + +commit ae566d51b64fa3dce7063e7745b9b35f8f47abde +Author: naddy@openbsd.org +Date: Fri Oct 25 21:53:24 2024 +0000 + + upstream: mlkem768x25519-sha256 has been promoted to default key + + exchange + + OpenBSD-Commit-ID: 5a3259a193fd42108a869ebf650b95b5f2d08dcf + +commit 3af1dba1384ca896df6e973c70398c41d36de1ea +Author: Darren Tucker +Date: Fri Oct 25 19:04:30 2024 +1100 + + Retire the minix3 test config. + + It got broken by the sshd-auth change, it's not obvious why, and the + platform lacks the debugging tools (eg gdb, strace) to figure it out. + The upstream project seems effectively dead (6 years since the last + commit, 10 since the last release). It was useful while it lasted + (we found a real bug because of it) but its time seems to have passed. + +commit 3b240cc44b8de9175280ddbe59331317d427b0e3 +Author: Preetish Amballi +Date: Mon Oct 21 14:07:02 2024 +0000 + + Updated gitignore to ignore sshd-session and sshd-auth targets + +commit 326495744f06a0ab18ee0d16f87b3fe91cac92fb +Author: Darren Tucker +Date: Fri Oct 25 19:01:02 2024 +1100 + + Simplify pselect shim and remove side effects. + + Instead of maintaing state (pipe descriptors, signal handlers) across + pselect-on-select invocations, set up and restore them each call. + This prevents outside factors (eg a closefrom or signal handler + installation) from potentially causing problems. This does result in a + drop in throughput of a couple of percent on geriatric platforms without + a native pselect due to the extra overhead. Tweaks & ok djm@ + +commit e53b615f3934ffac1efb3c1e491d126b9b09fd24 +Author: djm@openbsd.org +Date: Fri Oct 25 01:34:18 2024 +0000 + + upstream: promote mlkem768x25519-sha256 to be the default key exchange; + + ok markus@ + + OpenBSD-Commit-ID: fc673065e6505bb06b2e2b9362f78ccb4200a828 + +commit de644b1831b970f6655f871c051774cc871e8e74 +Author: djm@openbsd.org +Date: Thu Oct 24 03:28:34 2024 +0000 + + upstream: test SIGUSR1 dropping all keys from ssh-agent + + OpenBSD-Regress-ID: 8654b9aa8eb695b1499fffc408c25319592bf0e0 + +commit e86d7a077ce9a2b9ee9d4138c358a17cbdb786f9 +Author: djm@openbsd.org +Date: Thu Oct 24 03:15:47 2024 +0000 + + upstream: amake ssh-agent drop all keys when it receives SIGUSR1; + + let's users zap keys without access to $SSH_AUTH_SOCK + + ok deraadt@ + + OpenBSD-Commit-ID: dae9db0516b1011e5ba8c655ac702fce42e6c023 + +commit 94cdfebec852a2429c008cc2a55f8e4183f36972 +Author: djm@openbsd.org +Date: Thu Oct 24 03:14:37 2024 +0000 + + upstream: relax valid_domain() checks to allow an underscore as the + + first character. ok deraadt@ + + OpenBSD-Commit-ID: 3f8be6d32496e5596dd8b14e19cb067ddd7969ef + +commit 1b05d5437bf45bee5e3104772dea06ed51764f1b +Author: dtucker@openbsd.org +Date: Tue Oct 22 07:13:28 2024 +0000 + + upstream: Remove sshd logfile in start_sshd + + ... and ssh and sshd log wrappers before recreating them. Prevents "can't + create" errors during tests when running tests without SUDO after having + run them with SUDO. + + OpenBSD-Regress-ID: 2f0a83532e3dccd673a9bf0291090277268c69a6 + +commit 307ab3c7720f8879b835614b02687358ee4df9b9 +Author: dtucker@openbsd.org +Date: Tue Oct 22 06:16:26 2024 +0000 + + upstream: Add a sshd debug wrapper + + ... to run all of the subprograms from the build directory while + developing and debugging. Should help prevent accidentally testing + against unchanged installed sshd-auth and sshd-session binaries. ok djm@ + + OpenBSD-Commit-ID: 61760cdc98c2bc8f1e9f83a6f97cca0f66b52e69 + +commit 87bd1cb3ccba5e91d2650eb7f753c898ee43858e +Author: dtucker@openbsd.org +Date: Tue Oct 22 06:13:00 2024 +0000 + + upstream: Make debug call printf("%s", NULL) safe. + + Prevents problems on platforms where this isn't safe (which it's not + required to be). ok djm@ + + OpenBSD-Commit-ID: 8fa4ce3ad90915c925b81b99a79ab920b0523387 + +commit c44c349edd157b2c00c42bd5ef5f9dfb37de26f3 +Author: Darren Tucker +Date: Tue Oct 22 17:48:32 2024 +1100 + + Resync cvsid missed in commit 6072e4c9. + +commit fe4305c37ffe53540a67586854e25f05cf615849 +Author: djm@openbsd.org +Date: Fri Oct 18 05:53:26 2024 +0000 + + upstream: mention that LocalForward and RemoteForward can accept Unix + + domain socket paths; GHPR115 + + OpenBSD-Commit-ID: a8a34d0a0c51a9ddab3dfce615f9878fa76ef842 + +commit 9c97b6af8e052ab5ffe0f9096fadc8f9a4d0ed0f +Author: djm@openbsd.org +Date: Fri Oct 18 05:45:40 2024 +0000 + + upstream: remove duplicate check; GHPR392 from Pedro Martelletto + + OpenBSD-Commit-ID: 597ab7dd3f0e78939d2659fc1904d0f39ee95487 + +commit d9cd208e89a471a3ff8adfcec68d6210af9e9fd5 +Author: djm@openbsd.org +Date: Fri Oct 18 05:37:24 2024 +0000 + + upstream: allow "-" as output file for moduli screening + + based on GHPR393 + + OpenBSD-Commit-ID: 1517763764eb55d03a6092dd120d2909c6fef0e1 + +commit 5eb5c4b2820d0636b1eccee646fb32ec946c4a95 +Author: djm@openbsd.org +Date: Fri Oct 18 05:32:51 2024 +0000 + + upstream: ssh-keyscan doesn't need it's own sshfatal() definition, it + + can use the shared one from fatal.c + + based on GHPR401 from lengyijun + + OpenBSD-Commit-ID: 8ea75ea99f27f464c9223cbc89cb046ccf9cd5c4 + +commit 0a1e75499e2c6fc258ee903645c878480949f362 +Author: djm@openbsd.org +Date: Fri Oct 18 05:14:51 2024 +0000 + + upstream: in _ssh_order_hostkeyalgs() consider ECDSA curve type when + + arranging the hostkey algorithms. AFAIK this code is unused in OpenSSH, but I + guess others are using it + + based on GHPR387 from Pawel Jakub Dawidek + + OpenBSD-Commit-ID: 4d462495ac0c40f7b7dd66178e0005b9b2128225 + +commit d01ee7a88c5f4b1aa8c75a7c739f8f3bc1ad8bde +Author: djm@openbsd.org +Date: Fri Oct 18 05:03:34 2024 +0000 + + upstream: require control-escape character sequences passed via the '-e + + ^x' commandline to be exactly two characters long. Avoids one by OOB read if + ssh is invoked as "ssh -e^ ..." + + Spotted by Maciej Domanski in GHPR368 + + OpenBSD-Commit-ID: baa72bc60898fc5639e6c62de7493a202c95823d + +commit 74ff6382f5743e09930e6cbd195dac65cd6062c9 +Author: djm@openbsd.org +Date: Fri Oct 18 04:30:09 2024 +0000 + + upstream: remove addr.[ch] functions that are unused and + + visbility-restrict ones that are unused outside the implementation itself; + based on GHPR#282 by tobias@ + + OpenBSD-Commit-ID: a0140f2418b4d46cfaa7b33febc0a0931f9b2744 + +commit a9d6d7d93c533fa729f08b405e786d912553f33e +Author: djm@openbsd.org +Date: Fri Oct 18 04:14:59 2024 +0000 + + upstream: unreachable POLLERR case; from ya0guang via GHPR485 + + OpenBSD-Commit-ID: b3c82655190532b01eb817e532742cfaa4687eff + +commit d76424bf279ff951383e21213eb3759ea4090674 +Author: djm@openbsd.org +Date: Fri Oct 18 04:11:54 2024 +0000 + + upstream: s/Sx/Cm/ for external references; from Domen Puncer + + Kugler via GHPR501 + + OpenBSD-Commit-ID: f864a34feb5d5ff17160cf7c42ad0f7744fe8a3f + +commit ca204b994e2981e7bf95627b3105408917105649 +Author: naddy@openbsd.org +Date: Mon Oct 14 23:53:34 2024 +0000 + + upstream: mention SshdAuthPath option; ok djm@ + + OpenBSD-Commit-ID: 9a5d3add25e4e77bd3805bc5583a842ecf34d85c + +commit be27770e840c4dd9d9fcad1aa879400c727d7c2f +Author: Darren Tucker +Date: Fri Oct 18 13:37:55 2024 +1100 + + Remove references to systrace and pledge sandboxes. + + ok djm@ + +commit 49e64bf63fbf2f14961062dafe8ef08cb816bb08 +Author: Pavel Miadzvedzeu +Date: Wed Apr 24 10:19:56 2024 +0300 + + Fix "undeclared 'ut'" error by replacing it with 'utx' + +commit 67f684733f60f66479854a2867b953de731e71b2 +Author: Darren Tucker +Date: Thu Oct 17 20:50:29 2024 +1100 + + Seed RNG when starting up sshd-auth. + + Makes builds configured --without-openssl work again since otherwise + the first use of the RNG comes after the sandbox init and it can't + open /dev/random. + +commit c06c681aeebbe8e84e7410095514e7ee91f7e6cb +Author: Darren Tucker +Date: Thu Oct 17 19:18:23 2024 +1100 + + MacOS 12 runners are deprecated, replace with 15. + +commit 39db1f23bafb48a7c0cc9c65c716a0370f4cc677 +Author: Damien Miller +Date: Thu Oct 17 13:28:47 2024 +1100 + + Fix lookup path for sshd-auth; bz3745 + +commit c537eeb1ae5f069450053b0027e64efe5bdb37d2 +Author: Damien Miller +Date: Wed Oct 16 08:28:21 2024 +1100 + + fix breakage; missing saved_argc symbol + +commit 98a0883bdef28a06c7e017f27adf21ba57898bf4 +Author: Damien Miller +Date: Mon Oct 14 17:17:50 2024 +1100 + + fix capsicum sandbox + +commit 164ea4380564a2a83713eacf71908e3946e5e4e4 +Author: Damien Miller +Date: Mon Oct 14 17:16:41 2024 +1100 + + put back some portable bits for sshd-auth.c + +commit f8edf08c258ee2918689872c4702302052729726 +Author: Damien Miller +Date: Mon Oct 14 14:49:25 2024 +1100 + + there's only one sandbox, move to a static global + +commit 4482f0042b41d3d63c3845d7ba9fcf47c9252a84 +Author: Damien Miller +Date: Mon Oct 14 14:49:20 2024 +1100 + + depend + +commit 74856204a353a187dc6e7706c6cf84b7f14d775d +Author: djm@openbsd.org +Date: Mon Oct 14 03:02:08 2024 +0000 + + upstream: regress support for split sshd-auth binary + + OpenBSD-Regress-ID: df7d18a87b475f70004770f0f4e404adba5f6ab7 + +commit 461741083d7254595fecea274e60fe3ebf3ce3f9 +Author: djm@openbsd.org +Date: Fri Sep 27 01:05:54 2024 +0000 + + upstream: test some more Match syntax, including criteria=arg and + + negations + + OpenBSD-Regress-ID: 67476baccc60bf1a255fd4e329ada950047b8b8d + +commit 6072e4c9385713e9c166f32cfca6a7e603d4f0b8 +Author: djm@openbsd.org +Date: Mon Oct 14 01:57:50 2024 +0000 + + upstream: Split per-connection sshd-session binary + + This splits the user authentication code from the sshd-session + binary into a separate sshd-auth binary. This will be executed by + sshd-session to complete the user authentication phase of the + protocol only. + + Splitting this code into a separate binary ensures that the crucial + pre-authentication attack surface has an entirely disjoint address + space from the code used for the rest of the connection. It also + yields a small runtime memory saving as the authentication code will + be unloaded after thhe authentication phase completes. + + Joint work with markus@ feedback deraadt@ + + Tested in snaps since last week + + OpenBSD-Commit-ID: 9c3b2087ae08626ec31b4177b023db600e986d9c + +commit fe6c6330c1a94c7a537efe9069853ce7a275c50a +Author: djm@openbsd.org +Date: Sun Oct 13 22:20:06 2024 +0000 + + upstream: don't start the ObscureKeystrokeTiming mitigations if + + there has been traffic on a X11 forwarding channel recently. + + Should fix X11 forwarding performance problems when this setting is + enabled. Patch from Antonio Larrosa via bz3655 + + OpenBSD-Commit-ID: 820284a92eb4592fcd3d181a62c1b86b08a4a7ab + +commit 538cd28598ae942c94b99855b06fdd937e2e7381 +Author: jsg@openbsd.org +Date: Sat Oct 12 10:50:37 2024 +0000 + + upstream: remove duplicate misc.h include ok dtucker@ + + OpenBSD-Commit-ID: fdd056e7854294834d54632b4282b877cfe4c12e + +commit 0051381a8c33740a77a1eca6859efa1c78887d80 +Author: djm@openbsd.org +Date: Sun Oct 6 23:37:17 2024 +0000 + + upstream: Turn off finite field (a.k.a modp) Diffie-Hellman key + + exchange in sshd by default. Specifically, this removes the + diffie-hellman-group* and diffie-hellman-group-exchange-* methods. The client + is unchanged and continues to support these methods by default. + + Finite field Diffie Hellman is slow and computationally expensive for + the same security level as Elliptic Curve DH or PQ key agreement while + offering no redeeming advantages. + + ECDH has been specified for the SSH protocol for 15 years and some + form of ECDH has been the default key exchange in OpenSSH for the last + 14 years. + + ok markus@ + + OpenBSD-Commit-ID: 4e238ad480a33312667cc10ae0eb6393abaec8da + +commit 67a115e7a56dbdc3f5a58c64b29231151f3670f5 +Author: djm@openbsd.org +Date: Thu Sep 26 23:55:08 2024 +0000 + + upstream: fix previous change to ssh_config Match, which broken on + + negated Matches; spotted by phessler@ ok deraadt@ + + OpenBSD-Commit-ID: b1c6acec66cd5bd1252feff1d02ad7129ced37c7 + +commit 220b6c1290042acd5180d783dea01efe1365c265 +Author: jsg@openbsd.org +Date: Wed Sep 25 23:01:39 2024 +0000 + + upstream: remove some unused defines; ok djm@ + + OpenBSD-Commit-ID: 3a63e4e11d455704f684c28715d61b17f91e0996 + +commit 3ef4f6e8a4d774f73852391fdccbb95f39fc71bf +Author: jmc@openbsd.org +Date: Wed Sep 25 06:13:01 2024 +0000 + + upstream: remove some unneeded Xo/Xc calls; from evan silberman the + + original diff had a couple of errors, which i've fixed + + OpenBSD-Commit-ID: f37ad5888adbc0d4e1cd6b6de237841f4b1e650d + +commit 3f02368e8e9121847727c46b280efc280e5eb615 +Author: djm@openbsd.org +Date: Wed Sep 25 01:24:04 2024 +0000 + + upstream: fix regression introduced when I switched the "Match" + + criteria tokeniser to a more shell-like one. Apparently the old tokeniser + (accidentally?) allowed "Match criteria=argument" as well as the "Match + criteria argument" syntax that we tested for. + + People were using this syntax so this adds back support for + "Match criteria=argument" + + bz3739 ok dtucker + + OpenBSD-Commit-ID: d1eebedb8c902002b75b75debfe1eeea1801f58a + +commit 9517cc58577f85a0ba5f8bb46778dff625f0688f +Author: djm@openbsd.org +Date: Tue Sep 24 02:28:17 2024 +0000 + + upstream: some extra paranoia, reminded by jsg@ + + OpenBSD-Commit-ID: 22072bfa1df1391858ae7768a6c627e08593a91e + +commit 815a94e86a68c1000b8310cb47695cea9329516c +Author: Damien Miller +Date: Wed Sep 25 11:15:45 2024 +1000 + + gss-serv.c needs sys/param.h + + From Void Linux + +commit 76a618d2842c34c16cd21a4efc7230e2f459008d +Author: Damien Miller +Date: Wed Sep 25 11:13:05 2024 +1000 + + build construct_utmp() when USE_BTMP is set + + Fixes compile error on Void Linux/Musl + +commit d3aee17f6d395202eaa42a0c449b6da41f61527c +Author: Darren Tucker +Date: Tue Sep 24 18:41:44 2024 +1000 + + Test the flags from OpenWRT's package. + +commit 0f5d19e6fe4b58a89e6dc8c71a2aae30365d193e +Author: Christoph Ostarek +Date: Wed Jul 3 12:46:59 2024 +0200 + + fix utmpx ifdef + + 02e16ad95fb1f56ab004b01a10aab89f7103c55d did a copy-paste for + utmpx, but forgot to change the ifdef appropriately + +commit e03239f999acf9dc3da0f2f72bde36abbe678911 +Author: jsg@openbsd.org +Date: Sun Sep 22 12:56:21 2024 +0000 + + upstream: remove some unused defines; ok djm@ + + OpenBSD-Commit-ID: 81869ee6356fdbff19dae6ff757095e6b24de712 + +commit a35f543d3a6275fef781e515c262d1c687c3bc28 +Author: jsg@openbsd.org +Date: Fri Sep 20 02:00:46 2024 +0000 + + upstream: remove unneeded semicolons; checked by millert@ + + OpenBSD-Commit-ID: 3fb621a58e04b759a875ad6a33f35bb57ca80231 + +commit 1641f2d4d6e05d2147913442864cae546e64f08b +Author: Darren Tucker +Date: Mon Sep 23 20:52:31 2024 +1000 + + Add 9.9 branch to CI status console. + +commit 46d1fb16b20e971b9ac15e86a3d3e350b49c9ad6 +Author: Damien Miller +Date: Fri Sep 20 08:20:13 2024 +1000 + + update version numbers + +commit 0bdca1f218971b38728a0a129f482476baff0968 +Author: djm@openbsd.org +Date: Thu Sep 19 22:17:44 2024 +0000 + + upstream: openssh-9.9 + + OpenBSD-Commit-ID: 303417285f1a73b9cb7a2ae78d3f493bbbe31f98 + +commit ef2d7f2d3e1b4c9ae71bacf963e76a92ab8be543 +Author: Damien Miller +Date: Wed Sep 18 16:03:23 2024 +1000 + + include openbsd-compat/base64.c license in LICENSE + +commit 7ef362b989c8d1f7596f557f22e5924b9c08f0ea +Author: Damien Miller +Date: Wed Sep 18 09:01:23 2024 +1000 + + conditionally include mman.h in arc4random code + +commit 5fb2b5ad0e748732a27fd8cc16a7ca3c21770806 +Author: Damien Miller +Date: Tue Sep 17 11:53:24 2024 +1000 + + fix bug in recently-added sntrup761 fuzzer + + key values need to be static to persist across invocations; + spotted by the Qualys Security Advisory team. + +commit 0ca128c9ee894f1b0067abd473bfb33171df67f8 +Author: djm@openbsd.org +Date: Mon Sep 16 05:37:05 2024 +0000 + + upstream: use 64 bit math to avoid signed underflow. upstream code + + relies on using -fwrapv to provide defined over/underflow behaviour, but we + use -ftrapv to catch integer errors and abort the program. ok dtucker@ + + OpenBSD-Commit-ID: 8933369b33c17b5f02479503d0a92d87bc3a574b + +commit f82e5e22cad88c81d8a117de74241328c7b101c3 +Author: jmc@openbsd.org +Date: Sun Sep 15 08:27:38 2024 +0000 + + upstream: minor grammar/sort fixes for refuseconnection; ok djm + + OpenBSD-Commit-ID: 1c81f37b138b8b66abba811fec836388a0f3e6da + +commit 0c1165fc78e8fe69b5df71f81a8f944554a68b53 +Author: Damien Miller +Date: Sun Sep 15 13:30:13 2024 +1000 + + avoid gcc warning in fuzz test + +commit ce171d0718104b643854b53443ff72f7283d33f2 +Author: djm@openbsd.org +Date: Sun Sep 15 03:09:44 2024 +0000 + + upstream: bad whitespace in config dump output + + OpenBSD-Commit-ID: d899c13b0e8061d209298eaf58fe53e3643e967c + +commit 671c440786a5a66216922f15d0007b60f1e6733f +Author: Damien Miller +Date: Sun Sep 15 12:53:59 2024 +1000 + + use construct_utmp to construct btmp records + + Simpler and removes some code with the old-style BSD license. + +commit 930cb02b6113df72fbc732b9feb8e4f490952a81 +Author: djm@openbsd.org +Date: Sun Sep 15 02:20:51 2024 +0000 + + upstream: update the Streamlined NTRU Prime code from the "ref" + + implementation in SUPERCOP 20201130 to the "compact" implementation in + SUPERCOP 20240808. The new version is substantially faster. Thanks to Daniel + J Bernstein for pointing out the new implementation (and of course for + writing it). + + tested in snaps/ok deraadt@ + + OpenBSD-Commit-ID: bf1a77924c125ecdbf03e2f3df8ad13bd3dafdcb + +commit 9306d6017e0ce5dea6824c29ca5ba5673c2923ad +Author: djm@openbsd.org +Date: Sun Sep 15 01:19:56 2024 +0000 + + upstream: document Match invalid-user + + OpenBSD-Commit-ID: 2c84a9b517283e9711e2812c1f268081dcb02081 + +commit 0118a4da21147a88a56dc8b90bbc2849fefd5c1e +Author: djm@openbsd.org +Date: Sun Sep 15 01:18:26 2024 +0000 + + upstream: add a "Match invalid-user" predicate to sshd_config Match + + options. + + This allows writing Match conditions that trigger for invalid username. + E.g. + + PerSourcePenalties refuseconnection:90s + Match invalid-user + RefuseConnection yes + + Will effectively penalise bots try to guess passwords for bogus accounts, + at the cost of implicitly revealing which accounts are invalid. + + feedback markus@ + + OpenBSD-Commit-ID: 93d3a46ca04bbd9d84a94d1e1d9d3a21073fbb07 + +commit 7875975136f275619427604900cb0ffd7020e845 +Author: djm@openbsd.org +Date: Sun Sep 15 01:11:26 2024 +0000 + + upstream: Add a "refuseconnection" penalty class to sshd_config + + PerSourcePenalties + + This allows penalising connection sources that have had connections + dropped by the RefuseConnection option. ok markus@ + + OpenBSD-Commit-ID: 3c8443c427470bb3eac1880aa075cb4864463cb6 + +commit 8d21713b669b8516ca6d43424a356fccc37212bb +Author: djm@openbsd.org +Date: Sun Sep 15 01:09:40 2024 +0000 + + upstream: Add a sshd_config "RefuseConnection" option + + If set, this will terminate the connection at the first authentication + request (this is the earliest we can evaluate sshd_config Match blocks) + + ok markus@ + + OpenBSD-Commit-ID: 43cc2533984074c44d0d2f92eb93f661e7a0b09c + +commit acad117e66018fe1fa5caf41b36e6dfbd61f76a1 +Author: djm@openbsd.org +Date: Sun Sep 15 00:58:01 2024 +0000 + + upstream: switch sshd_config Match processing to the argv tokeniser + + too; ok markus@ + + OpenBSD-Commit-ID: b74b5b0385f2e0379670e2b869318a65b0bc3923 + +commit baec3f7f4c60cd5aa1bb9adbeb6dfa4a172502a8 +Author: djm@openbsd.org +Date: Sun Sep 15 00:57:36 2024 +0000 + + upstream: switch "Match" directive processing over to the argv + + string tokeniser, making it possible to use shell-like quoting in Match + directives, particularly "Match exec". ok markus@ + + OpenBSD-Commit-ID: 0877309650b76f624b2194c35dbacaf065e769a5 + +commit dd424d7c382c2074ab70f1b8ad4f169a10f60ee7 +Author: djm@openbsd.org +Date: Sun Sep 15 00:47:01 2024 +0000 + + upstream: include pathname in some of the ssh-keygen passphrase + + prompts. Helps the user know what's going on when ssh-keygen is invoked via + other tools. Requested in GHPR503 + + OpenBSD-Commit-ID: 613b0bb6cf845b7e787d69a5b314057ceda6a8b6 + +commit 62bbf8f825cc390ecb0523752ddac1435006f206 +Author: djm@openbsd.org +Date: Sun Sep 15 00:41:18 2024 +0000 + + upstream: Do not apply authorized_keys options when signature + + verification fails. Prevents restrictive key options being incorrectly + applied to subsequent keys in authorized_keys. bz3733, ok markus@ + + OpenBSD-Commit-ID: ba3776d9da4642443c19dbc015a1333622eb5a4e + +commit 49f325fd47af4e53fcd7aafdbcc280e53f5aa5ce +Author: Wu Weixin +Date: Fri Aug 2 22:16:40 2024 +0800 + + Fix without_openssl always being set to 1 + + In Fedora systems, %{?rhel} is empty. In RHEL systems, %{?fedora} is + empty. Therefore, the original code always sets without_openssl to 1. + +commit c21c3a2419bbc1c59cb1a16ea356e703e99a90d9 +Author: djm@openbsd.org +Date: Thu Sep 12 00:36:27 2024 +0000 + + upstream: Relax absolute path requirement back to what it was prior to + + OpenSSH 9.8, which incorrectly required that sshd was started with an + absolute path in inetd mode. bz3717, patch from Colin Wilson + + OpenBSD-Commit-ID: 25c57f22764897242d942853f8cccc5e991ea058 + +commit 1bc426f51b0a5cfdcfbd205218f0b6839ffe91e9 +Author: naddy@openbsd.org +Date: Mon Sep 9 14:41:21 2024 +0000 + + upstream: document the mlkem768x25519-sha256 key exchange algorithm + + OpenBSD-Commit-ID: fa18dccdd9753dd287e62ecab189b3de45672521 + +commit 0a2db61a5ffc64d2e2961c52964f933879952fc7 +Author: Darren Tucker +Date: Tue Sep 10 21:11:14 2024 +1000 + + Spell omnios test host correctly. + +commit 059ed698a47c9af541a49cf754fd09f984ac5a21 +Author: Darren Tucker +Date: Tue Sep 10 18:52:02 2024 +1000 + + Add omnios test target. + +commit f4ff91575a448b19176ceaa8fd6843a25f39d572 +Author: Darren Tucker +Date: Tue Sep 10 18:45:55 2024 +1000 + + Wrap stdint.h in ifdef. + +commit ff714f001d20a9c843ee1fd9d92a16d40567d264 +Author: Darren Tucker +Date: Mon Sep 9 19:31:54 2024 +1000 + + Also test PAM on dfly64. + +commit 509b757c052ea969b3a41fc36818b44801caf1cf +Author: Damien Miller +Date: Mon Sep 9 21:50:14 2024 +1000 + + stubs for ML-KEM KEX functions + + used for C89 compilers + +commit 273581210c99ce7275b8efdefbb9f89e1c22e341 +Author: Damien Miller +Date: Mon Sep 9 17:30:38 2024 +1000 + + declare defeat trying to detect C89 compilers + + I can't find a reliable way to detect the features the ML-KEM code + requires in configure. Give up for now and use VLA support (that we + can detect) as a proxy for "old compiler" and turn off ML-KEM if + it isn't supported. + +commit e8a0f19b56dfa20f98ea9876d7171ec315fb338a +Author: Damien Miller +Date: Mon Sep 9 16:46:40 2024 +1000 + + fix previous; check for C99 compound literals + + The previous commit was incorrect (or at least insufficient), the + ML-KEM code is actually using compound literals, so test for them. + +commit 7c07bec1446978bebe0780ed822c8fedfb377ae8 +Author: Damien Miller +Date: Mon Sep 9 16:06:21 2024 +1000 + + test for compiler feature needed for ML-KEM + + The ML-KEM implementation we uses need the compiler to support + C99-style named struct initialisers (e.g foo = {.bar = 1}). We + still support (barely) building OpenSSH with older compilers, so + add a configure test for this. + +commit d469d5f348772058789d35332d1ccb0b109c28ef +Author: djm@openbsd.org +Date: Mon Sep 9 03:13:39 2024 +0000 + + upstream: test mlkem768x25519-sha256 + + OpenBSD-Regress-ID: 7baf6bc39ae55648db1a2bfdc55a624954847611 + +commit 62fb2b51bb7f6863c3ab697f397b2068da1c993f +Author: djm@openbsd.org +Date: Mon Sep 9 02:39:57 2024 +0000 + + upstream: pull post-quantum ML-KEM/x25519 key exchange out from + + compile-time flag now than an IANA codepoint has been assigned for the + algorithm. + + Add mlkem768x25519-sha256 in 2nd KexAlgorithms preference slot. + + ok markus@ + + OpenBSD-Commit-ID: 9f50a0fae7d7ae8b27fcca11f8dc6f979207451a + +commit a8ad7a2952111c6ce32949a775df94286550af6b +Author: djm@openbsd.org +Date: Fri Sep 6 02:30:44 2024 +0000 + + upstream: make parsing user@host consistently look for the last '@' in + + the string rather than the first. This makes it possible to use usernames + that contain '@' characters. + MIME-Version: 1.0 + Content-Type: text/plain; charset=UTF-8 + Content-Transfer-Encoding: 8bit + + Prompted by Max Zettlmeißl; feedback/ok millert@ + + OpenBSD-Commit-ID: 0b16eec246cda15469ebdcf3b1e2479810e394c5 + +commit 13cc78d016b67a74a67f1c97c7c348084cd9212c +Author: djm@openbsd.org +Date: Wed Sep 4 05:33:34 2024 +0000 + + upstream: be more strict in parsing key type names. Only allow + + shortnames (e.g "rsa") in user-interface code and require full SSH protocol + names (e.g. "ssh-rsa") everywhere else. + + Prompted by bz3725; ok markus@ + + OpenBSD-Commit-ID: b3d8de9dac37992eab78adbf84fab2fe0d84b187 + +commit ef8472309a68e319018def6f8ea47aeb40d806f5 +Author: djm@openbsd.org +Date: Wed Sep 4 05:11:33 2024 +0000 + + upstream: fix RCSID in output + + OpenBSD-Commit-ID: 889ae07f2d2193ddc4351711919134664951dd76 + +commit ba2ef20c75c5268d4d1257adfc2ac11c930d31e1 +Author: jmc@openbsd.org +Date: Tue Sep 3 06:17:48 2024 +0000 + + upstream: envrionment -> environment; + + OpenBSD-Commit-ID: b719f39c20e8c671ec6135c832d6cc67a595af9c + +commit e66c0c5673a4304a3a9fbf8305c6a19f8653740f +Author: Damien Miller +Date: Wed Sep 4 15:35:29 2024 +1000 + + add basic fuzzers for our import of sntrup761 + +commit d19dea6330ecd4eb403fef2423bd7e127f4c9828 +Author: djm@openbsd.org +Date: Tue Sep 3 05:58:56 2024 +0000 + + upstream: regression test for Include variable expansion + + OpenBSD-Regress-ID: 35477da3ba1abd9ca64bc49080c50a9c1350c6ca + +commit 8c4d6a628051e318bae2f283e8dc38b896400862 +Author: djm@openbsd.org +Date: Tue Sep 3 05:29:55 2024 +0000 + + upstream: allow the "Include" directive to expand the same set of + + %-tokens that "Match Exec" and environment variables. + + ok dtucker@ + + OpenBSD-Commit-ID: 12ef521eaa966a9241e684258564f52f1f3c5d37 + +commit 51b82648b6827675fc0cde21175fd1ed8e89aab2 +Author: djm@openbsd.org +Date: Mon Sep 2 12:18:35 2024 +0000 + + upstream: missing ifdef + + OpenBSD-Commit-ID: 85f09da957dd39fd0abe08fe5ee19393f25c2021 + +commit f68312eb593943127b39ba79a4d7fa438c34c153 +Author: djm@openbsd.org +Date: Mon Sep 2 12:13:56 2024 +0000 + + upstream: Add experimental support for hybrid post-quantum key exchange + + ML-KEM768 with ECDH/X25519 from the Internet-draft: + https://datatracker.ietf.org/doc/html/draft-kampanakis-curdle-ssh-pq-ke-03 + + This is based on previous patches from markus@ but adapted to use the + final FIPS203 standard ML-KEM using a formally-verified implementation + from libcrux. + + Note this key exchange method is still a draft and thus subject to + change. It is therefore disabled by default; set MLKEM=yes to build it. + We're making it available now to make it easy for other SSH + implementations to test against it. + + ok markus@ deraadt@ + + OpenBSD-Commit-ID: 02a8730a570b63fa8acd9913ec66353735dea42c + +commit 05f2b141cfcc60c7cdedf9450d2b9d390c19eaad +Author: Antonio Larrosa +Date: Fri Aug 23 12:21:06 2024 +0200 + + Don't skip audit before exitting cleanup_exit + + This fixes an issue where the SSH_CONNECTION_ABANDON event is not + audited because cleanup_exit overrides the regular _exit too soon and + as a result, failed auth attempts are not logged correctly. + + The problem was introduced in 81c1099d22b81ebfd20a334ce986c4f753b0db29 + where the code from upstream was merged before the audit_event call when + it should have been merged right before the _exit call in order to honor + the comment that just mentions an override of the exit value. + +commit 16eaf9d401e70996f89f3f417738a8db421aa959 +Author: djm@openbsd.org +Date: Wed Aug 28 12:08:26 2024 +0000 + + upstream: fix test: -F is the argument to specify a non-default + + ssh_config, not -f (this is sadly not a new bug) + + OpenBSD-Regress-ID: 45a7bda4cf33f2cea218507d8b6a55cddbcfb322 + +commit 10ccf611ab8ecba9ce6b0548c5ccd8c1220baf92 +Author: deraadt@openbsd.org +Date: Fri Aug 23 04:51:00 2024 +0000 + + upstream: As defined in the RFC, the SSH protocol has negotiable + + compression support (which is requested as the name "zlib"). Compression + starts very early in the session. Relative early in OpenSSH lifetime, privsep + was added to sshd, and this required a shared-memory hack so the two + processes could see what was going on in the dataflow. This shared-memory + hack was soon recognized as a tremendous complexity risk, because it put libz + (which very much trusts it's memory) in a dangerous place, and a new option + ("zlib@openssh.com") was added begins compression after authentication (aka + delayed-compression). That change also permitted removal of the + shared-memory hack. Despite removal from the server, the old "zlib" support + remained in the client, to allow negotiation with non-OpenSSH daemons which + lack the delayed-compression option. This commit deletes support for the + older "zlib" option in the client. It reduces our featureset in a small way, + and encourages other servers to move to a better design. The SSH protocol is + different enough that compressed-key-material attacks like BEAST are + unlikely, but who wants to take the chance? We encourage other ssh servers + who care about optional compression support to add delayed-zlib support. + (Some already do "zlib@openssh.com") ok djm markus + + OpenBSD-Commit-ID: 6df986f38e4ab389f795a6e39e7c6857a763ba72 + +commit aee54878255d71bf93aa6e91bbd4eb1825c0d1b9 +Author: djm@openbsd.org +Date: Thu Aug 22 23:11:30 2024 +0000 + + upstream: sntrup761x25519-sha512 now has an IANA codepoint assigned, so + + we can make the algorithm available without the @openssh.com suffix too. ok + markus@ deraadt@ + + OpenBSD-Commit-ID: eeed8fcde688143a737729d3d56d20ab4353770f + +commit a76a6b85108e3032c8175611ecc5746e7131f876 +Author: Darren Tucker +Date: Thu Aug 22 20:36:12 2024 +1000 + + Move rekey test into valgrind-2. + + Now that the rekey test has been optimized it's fast enough to not be in + its own valgrind test, so move it into valgrind-2, which is currently + the quickest of the others, bringing all of them to roughly the same + runtime of ~1.1 hours. + +commit 7e75e3f57c41b9a6e6401e7674d7c2ff5c33975b +Author: dtucker@openbsd.org +Date: Thu Aug 22 10:21:02 2024 +0000 + + upstream: Use aes128-ctr for MAC tests since default has implicit MAC. + + Also verify that the Cipher or MAC we intended to use is actually the one + selected during the test. + + OpenBSD-Regress-ID: ff43fed30552afe23d1364526fe8cf88cbfafe1d + +commit ebc890b8b4ba08c84cd1066b7b94b2b11f6c4cb4 +Author: Damien Miller +Date: Thu Aug 22 09:45:49 2024 +1000 + + fix incorrect default for PasswordAuthentication + + merge botch spotted by gsgleason + +commit 15ace435ea1c2fab2a1cc7d9c3157fe20c776b80 +Author: dtucker@openbsd.org +Date: Wed Aug 21 10:33:27 2024 +0000 + + upstream: Some awks won't match on the \r so delete it instead. Fixes + + regress in portable on, eg Solaris. + + OpenBSD-Regress-ID: 44a96d6d2f8341d89b7d5fff777502b92ac9e9ba + +commit 51c96b6ed627779a04493a8fe25747996a37f3c2 +Author: dtucker@openbsd.org +Date: Wed Aug 21 07:06:27 2024 +0000 + + upstream: Import regenerated moduli. + + OpenBSD-Commit-ID: 5db7049ad5558dee5b2079d3422e8ddab187c1cc + +commit 25c52f37a82c4da48ec537de37d7c168982b8d6d +Author: dtucker@openbsd.org +Date: Wed Aug 21 06:59:08 2024 +0000 + + upstream: Use curve25519-sha256 kex where possible. + + Except where we're explicitly testing a different kex, use + curve25519-sha256 since it's faster than the default and supported even + when configured without OpenSSL. Add a check to ensure that the kex we + intended to test is the one we actually tested. Speeds test up by ~5%. + + OpenBSD-Regress-ID: 3b27fcc2ae953cb08fd82a0d3155c498b226d6e0 + +commit 3eb62b7ba49483c309b483eb9002a679014f3887 +Author: dtucker@openbsd.org +Date: Tue Aug 20 12:36:59 2024 +0000 + + upstream: Send only as much data as needed to trigger rekeying. Speeds + + up tests by about 10% in the common case, hopefully more when instrumented + with something like valgrind. + + OpenBSD-Regress-ID: 7bf9292b4803357efcf0baf7cfbdc8521f212da1 + +commit cbd3f034bbf7853618fac99d7d868a2250154ea7 +Author: Damien Miller +Date: Wed Aug 21 09:18:29 2024 +1000 + + simplify sshkey_prekey_alloc(); always use mmap + +commit 4442bbc2fc661277a6dabfedb756a7e15ee8b8b8 +Author: dtucker@openbsd.org +Date: Tue Aug 20 09:15:49 2024 +0000 + + upstream: Merge AEAD test into main test loop. + + Removes 3 duplicate tests and speeds overall test up by about 1%. + + OpenBSD-Regress-ID: 5e5c9ff3f7588091ed369e34ac28520490ad2619 + +commit 829976a63fd1efae3a4c3e7c16fded59d92edb67 +Author: dtucker@openbsd.org +Date: Tue Aug 20 09:02:45 2024 +0000 + + upstream: Set a default RekeyLimit of 256k. + + Used unless overridden by a command-line flag, which simplifies some of + the ssh command lines. + + OpenBSD-Regress-ID: e7cffa57027088e10336e412b34113969f88cb87 + +commit 57d02c9ea36aebad4e7146d46e041b6b2e582f7f +Author: dtucker@openbsd.org +Date: Tue Aug 20 07:52:43 2024 +0000 + + upstream: Add Compression=no to default ssh_config. + + All of the rekey tests use it (otherwise the encrypted byte counts would + not match) so this lets us simplify the command lines. + + OpenBSD-Regress-ID: dab7ce10f4cf6c68827eb8658141272aab3ea262 + +commit 7254eb26f7c0772c4b47c3b32f6d1b15855cdd8c +Author: dtucker@openbsd.org +Date: Tue Aug 20 07:41:35 2024 +0000 + + upstream: Remove duplicate curve25519-sha256 kex. + + curve25519-sha256@libssh.org is the pre-standardization name for the same + thing, so remove it as a duplicate. Speeds up test by a tiny amount. + + OpenBSD-Regress-ID: 5a5ee5fa1595a6e140b1cc16040bedf5996a5715 + +commit 749896b874928c2785256cae4d75161dc3bfcc7d +Author: dtucker@openbsd.org +Date: Tue Aug 20 07:27:25 2024 +0000 + + upstream: Unnest rekey param parsing test and use ssh not sshd. + + ssh uses the same parsing code, now has "-G" to dump its config and is + slightly faster to start up. This speeds up the test slightly (~5%) in the + common case but should help more during instrumented tests, eg under + valgrind, where startup costs are magnified. + + OpenBSD-Regress-ID: 07c3acaf4c728e641033071f4441afc88141b0d0 + +commit 2b1762115481ff2b7a60fd4db2ae69b725437462 +Author: djm@openbsd.org +Date: Tue Aug 20 11:10:04 2024 +0000 + + upstream: actually use the length parameter that was passed in rather + + than a constant (this makes no difference in practice because the length is + always the same); reported by martin AT nmkd.net + + OpenBSD-Commit-ID: 4aecce232c2fe9b16e9217ff6bcb3c848d853e7e + +commit d922762ca16a7381131b242f49d7376c41fabcb5 +Author: Damien Miller +Date: Tue Aug 20 13:55:30 2024 +1000 + + private key coredump protection for Linux/FreeBSD + + platforms not supporting coredump exclusion using mmap/madvise flags + fall back to plain old malloc(3). + +commit cc048ca536d6bed6f2285b07040b0d57cd559ba5 +Author: djm@openbsd.org +Date: Tue Aug 20 03:48:30 2024 +0000 + + upstream: place shielded keys (i.e. keys at rest in RAM) into memory + + allocated using mmap(3) with MAP_CONCEAL set. This prevents exposure of the + key material in coredumps, etc (this is in addition to other measures we take + in this area). + + ok deraadt@ + + OpenBSD-Commit-ID: cbbae59f337a00c9858d6358bc65f74e62261369 + +commit a0b35c791cad1f85481b23ba46373060292e1c80 +Author: djm@openbsd.org +Date: Sat Aug 17 08:35:04 2024 +0000 + + upstream: mention that ed25519 is the default key type generated and + + clarify that rsa-sha2-512 is the default signature scheme when RSA is in use. + Based on GHPR505 from SebastianRzk + + OpenBSD-Commit-ID: 1d90df71636a04601685d2a10a8233bcc8d4f4c5 + +commit 127a50f2c80572ed1a021feb11ecf941e92cbbef +Author: djm@openbsd.org +Date: Sat Aug 17 08:23:04 2024 +0000 + + upstream: fix minor memory leak in Subsystem option parsing; from + + Antonio Larrosa via GHPR515 + + OpenBSD-Commit-ID: fff3bbefd1b2c45c98cbe45c6b857b15d8a2d364 + +commit 171427261d2079941eb1041079dbae875da37cbc +Author: djm@openbsd.org +Date: Sat Aug 17 08:09:50 2024 +0000 + + upstream: fix swapping of source and destination addresses in some sshd + + log messages + + OpenBSD-Commit-ID: 24d4cbb86325275df1f037545aa3b91456e52d25 + +commit 2a50a8f1fa57857a5e124a2280bcf61cc63c77f7 +Author: Darren Tucker +Date: Sat Aug 17 11:10:19 2024 +1000 + + Add compat functions for EVP_Digest{Sign,Verify}. + + This should make LibreSSL 3.1.x through 3.3.x work again. Code from + tb@, ok djm@. Restore the test configs covering those. + +commit 1c3a7145260e03037cc18715b883880836fd122d +Author: Philip Hands +Date: Thu Aug 8 13:03:51 2024 +0200 + + make sure that usage & man page match + + SSH-Copy-ID-Upstream: da5b1abe55b72a16e0430e7598e1573da01779c0 + +commit cd0d681645b9adcf2467e7838bfd9d5142de4c4e +Author: Philip Hands +Date: Thu Aug 8 13:01:47 2024 +0200 + + update copyright notices + + Bump the year to 2024, but also reflect the fact that hands.com Ltd. has + been wound up in the UK, and its assets (including this copyright) have + now reverted to its owner, Philip Hands. + + SSH-Copy-ID-Upstream: 0e4c4d072747a6568b11a790c29dd1b4ce663d7f + +commit 7fc9ccdce18841ebd0a97e31e43258512ab32a32 +Author: Philip Hands +Date: Sun Aug 4 20:45:00 2024 +0200 + + restore optionality of -i's argument + + SSH-Copy-ID-Upstream: f70e3abb510e4eeb040b47894e41828246c1b720 + +commit c37aa7012b1a3c2c322fd19e71310aadc90fc674 +Author: Philip Hands +Date: Fri Aug 2 15:52:07 2024 +0200 + + avoid exploring .ssh/id*.pub subdirectories + + SSH-Copy-ID-Upstream: 0b9e08b7707ad16de3c8e6a0410d9f42fbd56997 + +commit 777dce9e2e0d12f7e81e162f77749f30899869fe +Author: Philip Hands +Date: Fri Aug 2 10:07:11 2024 +0200 + + ensure that we're always told the source of keys + + SSH-Copy-ID-Upstream: 1bee96f4793e8ec3fab9f9361204ae58f5cc7cae + +commit fb94fd2339848e40cad6c9bb42b822244cc1a7bc +Author: Philip Hands +Date: Wed Jul 31 23:19:51 2024 +0200 + + add $HOME to ERROR if one cannot write to ~/.ssh + + SSH-Copy-ID-Upstream: ebef3e9c06e0447bff06e9d84b33023cf592e0ba + +commit eb5aafa1ffaeee75799141ec5ded406a65ec7d18 +Author: Philip Hands +Date: Wed Jul 31 23:19:03 2024 +0200 + + assert that SCRATCH_DIR is a writable directory + + SSH-Copy-ID-Upstream: ecb2b9d10883b9a16df56c83896c9bb47a80cde2 + +commit abcc460a2af46f0d812f8433d97a8eae1d80724c +Author: Philip Hands +Date: Wed Jul 31 23:17:54 2024 +0200 + + quote to avoid potential for word splitting + + SSH-Copy-ID-Upstream: f379adbe06ac2ef1daf0f130752234c7f8b97e3c + +commit b3f91411fd1473605f74c40c1a91a024c7171e27 +Author: Philip Hands +Date: Wed Jul 31 23:15:11 2024 +0200 + + ensure ERROR output goes to STDERR + + SSH-Copy-ID-Upstream: ac394b05eead3b91feb7c2ae4129a3e9b892f1e2 + +commit 674b8f30f0dbacd787eb1e4e7e1ece34b5543d8f +Author: Philip Hands +Date: Thu Aug 1 14:03:06 2024 +0200 + + avoid extra space when no arg given to -i option + + SSH-Copy-ID-Upstream: feca9e67e6e37c5653445d1c733569d7abb1770e + +commit 0efa0e1c41427c0c6ba839a18c72c1afcd7b7cc0 +Author: Philip Hands +Date: Wed Jul 31 23:28:36 2024 +0200 + + put the -i before -[pP] (matching man pages) + + The man pages (ssh, sftp & ssh-copy-id) all list -i before the port + setting, so make the output match that order, which also seems more + natural with the port being next to the server. + + SSH-Copy-ID-Upstream: 34d5d614172c78f9a42249466c4b81975b8883a1 + +commit 87831345e9745f2d13bd7a4a7972809f6788f331 +Author: Shreyas Mahangade +Date: Mon Jul 29 15:26:05 2024 +0000 + + Minor space issue fixed + + SSH-Copy-ID-Upstream: 335e44d7be78b03962a54c3a5c99a2ff45294a54 + +commit 2f3010f4736b4b3f5c10a4be97a24e90ff04c5e7 +Author: Shreyas Mahangade +Date: Mon Jul 29 16:55:28 2024 +0530 + + Show identity file in 'ssh' command + + - Previously no identity file is shown in "ssh" command output on the line "Now try logging into the..." + - This commit makes sure whenever "ssh-copy-id" with "-i" is invoked, it also reflects in "ssh" command + + SSH-Copy-ID-Upstream: 58e022ec26cb2315eb3be581d01e0ba787082428 + +commit a13856374b894397a7682b32257ed0bf67cfede9 +Author: Damien Miller +Date: Fri Aug 16 08:30:20 2024 +1000 + + more OPENSSL_HAS_ECC + +commit 4da2a1a7f648979bea6eaf3b17f5f250faed4afc +Author: Damien Miller +Date: Thu Aug 15 23:35:54 2024 +1000 + + fix merge botch that broke !OPENSSL_HAS_ECC + +commit 2c53d2f32b8e3992b61682c909ae5bc5122b6e5d +Author: Damien Miller +Date: Thu Aug 15 15:09:45 2024 +1000 + + missed OPENSSL_HAS_ECC case + +commit 342dd7a219f39119b8b686b5aaa99c8e15ede368 +Author: Damien Miller +Date: Thu Aug 15 15:06:55 2024 +1000 + + retire testing aginst older LibreSSL versions + + libressl prior to 3.4.x lack support for the EVP_DigestSign and + EVP_DigestVerify APIs that we need now that sshkey is converted + to EVP_PKEY. + + If someone makes a good case for why we should support these versions + then we could bring back support with wrappers. + +commit a7c6ea8eebe0f179141ec5dbf0c9e5354417930f +Author: Damien Miller +Date: Thu Aug 15 12:44:17 2024 +1000 + + sync TEST_MALLOC_OPTIONS for OpenBSD + +commit 60c2cf22e8f64f35d8b1175e4671257313f2e4d3 +Author: Damien Miller +Date: Thu Aug 15 12:43:47 2024 +1000 + + remove gratuitious difference from OpenBSD + +commit 339c4fc60a6250429d41fa8713f783d82aad4551 +Author: djm@openbsd.org +Date: Thu Aug 15 00:52:23 2024 +0000 + + upstream: adapt to EVP_PKEY conversion + + OpenBSD-Regress-ID: 0e2d4efb0ed0e392e23cd8fda183fe56531ac446 + +commit 63a94f99b9d7c8a48182a40192e45879d1ba8791 +Author: djm@openbsd.org +Date: Fri Jul 19 04:33:36 2024 +0000 + + upstream: test transfers in mux proxy mode too + + OpenBSD-Regress-ID: 2edfc980628cfef3550649cab8d69fa23b5cd6c4 + +commit 7bdfc20516e288b58c8c847958059c7b141eeff9 +Author: djm@openbsd.org +Date: Thu Aug 15 00:51:51 2024 +0000 + + upstream: Convert RSA and ECDSA key to the libcrypto EVP_PKEY API. + + DSA remains unconverted as it will be removed within six months. + + Based on patches originally from Dmitry Belyavskiy, but significantly + reworked based on feedback from Bob Beck, Joel Sing and especially + Theo Buehler (apologies to anyone I've missed). + + ok tb@ + + OpenBSD-Commit-ID: d098744e89f1dc7e5952a6817bef234eced648b5 + +commit 0af06e2c5b898992a18c74333e75a0136506acc6 +Author: tobias@openbsd.org +Date: Wed Aug 14 15:42:18 2024 +0000 + + upstream: Reorder calloc arguments + + The first argument should be the amount, the second argument should be the + element size. Fixing this also silences some gcc compiler warnings for + portable. + + Spotted with Benny Baumann (BenBE at geshi dot org). + + ok djm@ + + OpenBSD-Commit-ID: 711ad6f7bd7fb48bf52208f2cf9f108cddb6d41a + +commit 56ce0aa3c6cf28d9fcbce3207457abeac91b5050 +Author: tobias@openbsd.org +Date: Wed Aug 14 15:40:30 2024 +0000 + + upstream: Extend sshbuf validation + + Multiple sshbuf structs can be linked through a parent/child relationship. + Make sure that a single sshbuf cannot be its own parent. If this would ever + happen, it would result in reference counting issues. + + This is a cheap way of testing this with very little overhead. It does not + detect A->B->A linkages though for performance reason and the fact that it + takes a programming error for this to occur anyway. + + Authored with Benny Baumann (BenBE at geshi dot org). + + ok djm@ + + OpenBSD-Commit-ID: fb3fa9ee2cad3c7e842ebadfd7f5db220c4aaf16 + +commit fc48ddf6998188517af42dce807e2088b6a0c0be +Author: tobias@openbsd.org +Date: Wed Aug 14 15:37:11 2024 +0000 + + upstream: Use freezero for better readability + + It has the same meaning as the current pair of calling explicit_bzero + and free. Spotted with Benny Baumann (BenBE at geshi dot org). + + ok djm@ + + OpenBSD-Commit-ID: 939fbe9ccf52d0d48c5fa53694d6f3bb9927970c + +commit 1ff6907ec26dac6ac59fe9fe232899a63b4c14d8 +Author: tobias@openbsd.org +Date: Wed Aug 14 15:35:23 2024 +0000 + + upstream: Fix typo in comment + + Spotted with Benny Baumann (BenBE at geshi dot org). + + ok djm@ + + OpenBSD-Commit-ID: 829160ac8ef3ad3409695ce3a3ade835061cae57 + +commit 487faaed8f3bb9ffb19e8f807a3da72895b16421 +Author: dlg@openbsd.org +Date: Wed Jul 31 12:00:18 2024 +0000 + + upstream: add a random amount of time (up to 4 seconds) to the + + grace login time. + + ok deraadt@ djm@ + + OpenBSD-Commit-ID: abd3c57aaa5861517529b322df79b6be35ee67f4 + +commit 2865f5b7520bed3e74fbbb5f8d7a44193d7a4314 +Author: naddy@openbsd.org +Date: Fri Jul 26 15:24:49 2024 +0000 + + upstream: document the reduced logingrace penalty + + OpenBSD-Commit-ID: 9b63e0e3599d524ddc10edc4f978081382c3548b + +commit 1ec0a64c5dc57b8a2053a93b5ef0d02ff8598e5c +Author: Darren Tucker +Date: Sun Jul 28 21:26:51 2024 +1000 + + Explicitly install libssl-devel cygwin. + + Should fix CI tests for cygwin default config. + +commit 0bf6e5bb750b66b25c20a1c5a471f91850de3748 +Author: djm@openbsd.org +Date: Thu Jul 25 23:44:01 2024 +0000 + + upstream: reduce logingrace penalty. + + A single forgotton login that times out should be below the penalty + threshold. + + ok deraadt/claudio + + OpenBSD-Commit-ID: cee1f7d17597c97bff8e5092af5d136fdb08f81d + +commit 29fb6f6d46b67770084b4f12bcf8a01bd535041b +Author: djm@openbsd.org +Date: Thu Jul 25 22:40:08 2024 +0000 + + upstream: Fix proxy multiplexing (-O proxy) bug + + If a mux started with ControlPersist then later has a forwarding added using + mux proxy connection and the forwarding was used, then when the mux proxy + session terminates, the mux master process will send a channel close to the + server with a bad channel ID and crash the connection. + + This was caused by my stupidly reusing c->remote_id for mux channel + associations when I should have just added another member to struct channel. + + ok markus@ + + OpenBSD-Commit-ID: c9f474e0124e3fe456c5e43749b97d75e65b82b2 + +commit 53d1d307438517805989c7d5616d752739a97e03 +Author: djm@openbsd.org +Date: Thu Jul 18 01:47:27 2024 +0000 + + upstream: mention mux proxy mode + + OpenBSD-Commit-ID: fd77a77779f06d316a314e4540dc57c93fc3369a + +commit a9b90859d252c2f5a24142f985d38610ac74685f +Author: jsg@openbsd.org +Date: Sun Jul 14 10:19:23 2024 +0000 + + upstream: fix double word; ok dtucker@ + + OpenBSD-Commit-ID: e6aff005914fa350b896d2be030be3d3b56ec0e8 + +commit b05fda224bbcd2f641254534ed2175c42487f3c8 +Author: Darren Tucker +Date: Thu Jul 25 17:59:35 2024 +1000 + + Check for SA_RESTART before using it. + + ok djm@ + +commit c276672fc0e99f0c4389988d54a84c203ce325b6 +Author: Yuichiro Naito +Date: Wed Sep 1 10:19:32 2021 +0900 + + Class-imposed login restrictions + + If the following functions are available, + add an additional check if users are allowed to login imposed by login class. + + * auth_hostok(3) + * auth_timeok(3) + + These functions are implemented on FreeBSD. + +commit 7717b9e9155209916cc6b4b4b54f4e8fa578e889 +Author: djm@openbsd.org +Date: Wed Jul 10 21:58:34 2024 +0000 + + upstream: correct keyword; from Yatao Su via GHPR509 + + OpenBSD-Commit-ID: 81c778c76dea7ef407603caa157eb0c381c52ad2 + +commit f2b78bb8f149d6b4d1f62c21aa1f06995dccf4ce +Author: djm@openbsd.org +Date: Mon Jul 8 03:04:34 2024 +0000 + + upstream: don't need return at end of void function + + OpenBSD-Commit-ID: 42d322d37f13aa075ae7b1ad9eef591e20b89717 + +commit a395d37a813c0177cb5bfc4bebf5a52badb73cf0 +Author: djm@openbsd.org +Date: Thu Jul 4 22:53:59 2024 +0000 + + upstream: fix grammar: "a pattern lists" -> "one or more pattern + + lists" + + OpenBSD-Commit-ID: f3c844763398faa9800687e8ff6621225498202a + +commit 8b664df75966e5aed8dabea00b8838303d3488b8 +Author: Darren Tucker +Date: Sun Jul 7 18:46:19 2024 +1000 + + Cast to sockaddr * in systemd interface. + + Fixes build with musl libx. bz#3707. + +commit 30c8c81da2169e78357d08dbb0ddd823b60e93bc +Author: Darren Tucker +Date: Thu Jul 4 20:12:26 2024 +1000 + + Add 9.8 branch to ci-status page. + +commit ee6b9e661633fcefd29dba0c811cecbc4d027f6f +Author: Samuel Thibault +Date: Tue Mar 26 22:15:08 2024 +0100 + + Fix detection of setres*id on GNU/Hurd + + Like Linux, proper _SOURCE macros need to be set to get declarations of + various standard functions, notably setres*id. Now that Debian is using + -Werror=implicit-function-declaration this is really required. While at + it, define other _SOURCE macros like on GNU/Linux, since GNU/Hurd uses + the same glibc. + +commit fa41f6592ff1b6ead4a652ac75af31eabb05b912 +Author: Damien Miller +Date: Mon Jul 1 14:33:26 2024 +1000 + + version numbers + +commit bfebb8a5130a792c5356bd06e1ddef72a0a0449f +Author: djm@openbsd.org +Date: Mon Jul 1 04:31:59 2024 +0000 + + upstream: openssh-9.8 + + OpenBSD-Commit-ID: 5f8b89e38a4c5f7c6d52ffa19f796d49f36fab19 + +commit 146c420d29d055cc75c8606327a1cf8439fe3a08 +Author: djm@openbsd.org +Date: Mon Jul 1 04:31:17 2024 +0000 + + upstream: when sending ObscureKeystrokeTiming chaff packets, we + + can't rely on channel_did_enqueue to tell that there is data to send. This + flag indicates that the channels code enqueued a packet on _this_ ppoll() + iteration, not that data was enqueued in _any_ ppoll() iteration in the + timeslice. ok markus@ + + OpenBSD-Commit-ID: 009b74fd2769b36b5284a0188ade182f00564136 + +commit 637e4dfea4ed81264e264b6200172ce319c64ead +Author: djm@openbsd.org +Date: Mon Jul 1 03:10:19 2024 +0000 + + upstream: use "lcd" to change directory before "lls" rather then "cd", + + since the directory we're trying to list is local. Spotted by Corinna + Vinschen + + OpenBSD-Regress-ID: 821feca4a4bebe491944e624c8f7f2990b891415 + +commit c8cfe258cee0b8466ea84597bf15e1fcff3bc328 +Author: djm@openbsd.org +Date: Thu Jun 27 23:01:15 2024 +0000 + + upstream: delete obsolete comment + + OpenBSD-Commit-ID: 5fb04f298ed155053f3fbfdf0c6fe7cdf84bbfa2 + +commit 94b9d37100f6fa536aaa1d1a0e4926fe44fbf04d +Author: djm@openbsd.org +Date: Thu Jun 27 22:36:44 2024 +0000 + + upstream: retire unused API + + OpenBSD-Commit-ID: 3e30d7b0615e2707f6bbe70f61b1c2f72f78161b + +commit 268c3a7f5783e731ed60f4e28da66ee3743581d3 +Author: jmc@openbsd.org +Date: Thu Jun 27 21:02:16 2024 +0000 + + upstream: ssl(8) no longer contains a HISTORY section; + + OpenBSD-Commit-ID: 83b7ff34433d79595e9c2a5d2a561a6660251245 + +commit 12b6cc09ce6c430681f03af2a8069e37a664690b +Author: djm@openbsd.org +Date: Wed Jun 26 23:47:46 2024 +0000 + + upstream: move child process waitpid() loop out of SIGCHLD handler; + + ok deraadt + + OpenBSD-Commit-ID: 65815a39564e431414aed7c5ace8076f4e9ca741 + +commit d6bcd13297c2ab8b528df5a6898f994734849031 +Author: deraadt@openbsd.org +Date: Wed Jun 26 23:16:52 2024 +0000 + + upstream: Instead of using possibly complex ssh_signal(), write all + + the parts of the grace_alarm_handler() using the exact things allowed by the + signal-safe rules. This is a good rule of thumb: Handlers should be written + to either set a global volatile sig_atomic_t inspected from outside, and/or + directly perform only safe operations listed in our sigaction(2) manual page. + ok djm markus + + OpenBSD-Commit-ID: 14168ae8368aab76e4ed79e17a667cb46f404ecd + +commit b8793e2b0851f7d71b97554fa5260b23796d6277 +Author: deraadt@openbsd.org +Date: Wed Jun 26 23:14:14 2024 +0000 + + upstream: save_errno wrappers inside two small signal handlers that + + perform system calls, for systems with libc that do perform libc sigtramps. + ok djm markus + + OpenBSD-Commit-ID: 7749b56419a7c9dcfe4c6c04811e429813346c62 + +commit f23e9332c4c8df37465c4a4f38275ea98980ed7e +Author: jmc@openbsd.org +Date: Mon Jun 24 06:59:39 2024 +0000 + + upstream: - uppercase start of sentence - correct sentence grammar + + ok djm + + OpenBSD-Commit-ID: 1ec4b0fdb633a43667f2c8fff1d600bd647dde25 + +commit 1839e3eb71a759aa795602c1e4196300f4ac2615 +Author: djm@openbsd.org +Date: Mon Jun 24 04:05:11 2024 +0000 + + upstream: mention SshdSessionPath option + + OpenBSD-Commit-ID: c29734d36c21003973b15c1c9965c35f36cef30c + +commit 603193e32aef5db7d60c58066d5de89806e79312 +Author: Darren Tucker +Date: Thu Jun 20 18:45:14 2024 +1000 + + Rerun upstream tests on .sh file changes too. + +commit dbbf9337c19381786a8e5a8a49152fe6b80c780d +Author: dtucker@openbsd.org +Date: Thu Jun 20 08:23:18 2024 +0000 + + upstream: Work around dbclient cipher/mac query bug. + + Unlike earlier versions, recent Dropbear (at least v2024.85) requires + a host arg when querying supported ciphers and macs via "-c/-m + help". Earlier versions accept but do not require it, so always + provide it. If these queries fail, skip the test with a warning. + + OpenBSD-Regress-ID: 98eb863a3f0363416922efb273885e6b3c7f68d4 + +commit 8de2c8cebc46bbdb94b7a2c120fcadfb66a3cccc +Author: dtucker@openbsd.org +Date: Thu Jun 20 08:18:34 2024 +0000 + + upstream: Remove dropbear key types not supported + + by current OpenSSH. Allows subsequent test runs to work if OpenSSH is + rebuilt w/out OpenSSL. + + OpenBSD-Regress-ID: e0129eb2b1d31771105903a8055216fbba20a770 + +commit e9b6471c59b21e5d9ef1b3832d4bf727338add85 +Author: djm@openbsd.org +Date: Thu Jun 20 00:18:05 2024 +0000 + + upstream: stricter check for overfull tables in penalty record path + + OpenBSD-Commit-ID: 7df01e648a0723418c554e64a9f2b6d38db060a6 + +commit d9336d344eb2a1e898c5e66147b3f108c7214694 +Author: djm@openbsd.org +Date: Wed Jun 19 23:24:47 2024 +0000 + + upstream: put back reaping of preauth child process when writes + + from the monitor fail. Not sure how this got lost in the avalanche of + patches. + + OpenBSD-Commit-ID: eb7eb36371e1ac01050b32b70fb2b3e5d98e72f5 + +commit 579d9adb70ec0206a788eb5c63804c31a67e9310 +Author: naddy@openbsd.org +Date: Mon Jun 17 13:50:18 2024 +0000 + + upstream: remove one more mention of DSA + + OpenBSD-Commit-ID: 8515f55a15f02836ba657df341415f63c60526ca + +commit 7089b5f8436ef0b8d3d3ad9ce01045fb9e7aab15 +Author: Darren Tucker +Date: Wed Jun 19 23:09:05 2024 +1000 + + Move -f to the place needed to restart sshd. + +commit d5f83cfd852b14a25f347f082ab539a9454702ad +Author: Darren Tucker +Date: Wed Jun 19 21:04:01 2024 +1000 + + Need to supply "-f" to restart sshd. + +commit fad34b4ca25c0ef31e5aa841d461b6f21da5b8c1 +Author: dtucker@openbsd.org +Date: Wed Jun 19 10:15:51 2024 +0000 + + upstream: Provide defaults for ciphers and macs + + if querying for them fails since on some versions of Dropbear (at least + v2024.85) "-m help" doesn't seem to work. Enable all supported pubkey + algorithms in the server. + + OpenBSD-Regress-ID: 4f95556a49ee9f621789f25217c367a33d2745ca + +commit 5521060e35ada9f957cecdddc06d0524e75409ef +Author: dtucker@openbsd.org +Date: Wed Jun 19 10:10:46 2024 +0000 + + upstream: Use ed25519 keys for kex tests + + since that's supported by OpenSSH even when built without OpenSSL. + Only test diffie-hellman kex if OpenSSH is compiled with support for it. + + OpenBSD-Regress-ID: a5d09ef9bbd171f9e4ec73ed0d9eeb49a8878e97 + +commit dbd3b833f6e3815e58f2dc6e14f61a51bcd4d6bd +Author: dtucker@openbsd.org +Date: Wed Jun 19 10:08:34 2024 +0000 + + upstream: Rework dropbear key setup + + to always generate ed25519 keys, other types only if OpenSSH has support + for the corresponding key type. + + OpenBSD-Regress-ID: 8f91f12604cddb9f8d93aa34f3f93a3f6074395d + +commit d6218504e11ae9148adf410fc69b0710a052be36 +Author: Darren Tucker +Date: Wed Jun 19 20:20:24 2024 +1000 + + Restart sshd after installing it for testing. + + When installing an sshd built without OpenSSL the mismatch between + the running sshd and newly installed sshd-session will cause the + remainder of the test to fail. + +commit 786a4465b6bb702daf4fb17b7c3bcb42b52f0b46 +Author: Darren Tucker +Date: Tue Jun 18 19:59:59 2024 +1000 + + Remove macos-11 runner. + + Github is retiring them soon. + +commit df1c72a55edbebac14363b57de66ac6a147ecc67 +Author: Damien Miller +Date: Wed Jun 19 09:34:34 2024 +1000 + + PAMServiceName may appear in a Match block + +commit de1c2e70e5a5dc3c8d2fe04b24cc93d8ef6930e7 +Author: dtucker@openbsd.org +Date: Tue Jun 18 08:11:48 2024 +0000 + + upstream: Re-enable ssh-dss tests + + ... if ssh is compiled with DSA support + + OpenBSD-Regress-ID: bbfaf8c17f2b50a2d46ac35cb97af99b990c990d + +commit dabc2c7cf3c141e8e5d5a1a60d6c1d2d2422cf43 +Author: anton@openbsd.org +Date: Tue Jun 18 06:14:27 2024 +0000 + + upstream: Stop using DSA in dropbear interop tests. + + OpenBSD-Regress-ID: abfd4457d99d8cc1417fd22ca2c570270f74c1cf + +commit 761438012710169445acc179e3870c53c862bda0 +Author: Damien Miller +Date: Tue Jun 18 12:29:45 2024 +1000 + + missed a bit of DSA in the fuzzer + +commit 3f9cc47da588e8de520720e59f98438043fdaf93 +Author: Damien Miller +Date: Tue Jun 18 09:35:53 2024 +1000 + + DSA support is disabled, so remove from fuzzers + +commit 00eb95957dea5484b2c7c043f7d2bbc87301bef2 +Author: djm@openbsd.org +Date: Mon Jun 17 08:30:29 2024 +0000 + + upstream: disable the DSA signature algorithm by default; ok + + markus@ + + (yes, I know this expands to "the Digitial Signature Algorithm + signature algorithm) + + OpenBSD-Commit-ID: 961ef594e46dd2dcade8dd5721fa565cee79ffed + +commit 5603befe11c9464ea26fe77cbacc95a7cc0b1ea7 +Author: djm@openbsd.org +Date: Mon Jun 17 08:28:31 2024 +0000 + + upstream: promote connection-closed messages from verbose to info + + log level; they could be the only record of the connection terminating if the + client doesn't send a SSH2_MSG_DISCONNECT message. ok dtucker@ + + OpenBSD-Commit-ID: 0c8bfaf5e9fdff945cee09ac21e641f6c5d65d3c + +commit b00331402fe5c60d577f3ffcc35e49286cdc6b47 +Author: Damien Miller +Date: Mon Jun 17 17:02:18 2024 +1000 + + propagate PAM crashes to PerSourcePenalties + + If the PAM subprocess crashes, exit with a crash status that will be + picked up by the sshd(8) listener process where it can be used by + PerSourcePenalties to block the client. This is similar handling to + the privsep preauth process. + +commit 1c207f456ace38987deda047758d13fbf857f948 +Author: Damien Miller +Date: Mon Jun 17 15:06:01 2024 +1000 + + minix doesn't have loopback, so skip penalty tests + + pointed out by dtucker@ + +commit 48443d202eaec52d4d39defdd709a4499a7140c6 +Author: djm@openbsd.org +Date: Sun Jun 16 11:54:49 2024 +0000 + + upstream: same treatment for this test + + OpenBSD-Regress-ID: d0cc9efca7833e673ea7b0cb3a679a3acee8d4c7 + +commit 45562a95ea11d328c22d97bf39401cd29684fb1f +Author: djm@openbsd.org +Date: Sun Jun 16 08:18:06 2024 +0000 + + upstream: penalty test is still a bit racy + + OpenBSD-Regress-ID: 90c9ac224db454637baf1ebee5857e007321e824 + +commit 8d0f7eb147ef72d18acb16c0b18672d44941a8ca +Author: djm@openbsd.org +Date: Sat Jun 15 03:59:10 2024 +0000 + + upstream: crank up penalty timeouts so this should work on even the + + slowest of test builders + + OpenBSD-Regress-ID: 70bda39c83e3fc9d0f3c1fad4542ed33e173d468 + +commit 93c75471a1202ab3e29db6938648d4e2602c0475 +Author: jmc@openbsd.org +Date: Fri Jun 14 05:20:34 2024 +0000 + + upstream: sort -q in the options list; + + OpenBSD-Commit-ID: 6839b38378f38f754de638a5e988c13b4164cc7c + +commit dd7807bbe80a93ffb4616f2bd5cf83ad5a5595fb +Author: djm@openbsd.org +Date: Fri Jun 14 05:01:22 2024 +0000 + + upstream: clarify KEXAlgorithms supported vs available. Inspired by + + bz3701 from Colin Watson. + + OpenBSD-Commit-ID: e698e69bea19bd52971d253f2b1094490c4701f7 + +commit d172ad56df85b68316dbadbedad16761a1265874 +Author: djm@openbsd.org +Date: Fri Jun 14 05:00:42 2024 +0000 + + upstream: ssh-keyscan -q man bits + + OpenBSD-Commit-ID: ba28d0e1ac609a4c99c453e57e86560c79079db1 + +commit 092e4ff9ccaacbe035f286feb1b56ed499604743 +Author: Damien Miller +Date: Fri Jun 14 14:46:35 2024 +1000 + + skip penalty-expire test in valgrind test env + +commit 2866ad08a9c50d7b67ce9424ca990532b806a21a +Author: djm@openbsd.org +Date: Fri Jun 14 04:43:11 2024 +0000 + + upstream: split the PerSourcePenalties test in two: one tests penalty + + enforcement but not penalty expiry, the other tests penalty expiry. + + This lets us disable the expiry testing in certain CI test environments. + + OpenBSD-Regress-ID: f56811064f3e3cb52ee73a206b8c2a06af1c8791 + +commit b2c64bc170d75823622a37cab3ca1804ca87ad16 +Author: Damien Miller +Date: Fri Jun 14 14:19:23 2024 +1000 + + add a sshd_config PamServiceName option + + Allows selecting which PAM service name to use when UsePAM is + enabled. Defaults to "sshd" unless overridden at compile time + by defining SSHD_PAM_SERVICE. + + bz2102, ok dtucker@ + +commit 9f032a4dd17bf0ae6066223d82aa5e784285d987 +Author: djm@openbsd.org +Date: Fri Jun 14 00:26:12 2024 +0000 + + upstream: don't redirect stderr for ssh-keyscan we expect to succeed + + OpenBSD-Regress-ID: 8878b8eb4e070ed2e343166d3eb86db4a08a216c + +commit 1e84d0cf40e94ae3a77d6a7ca8c036d8e3d55a40 +Author: djm@openbsd.org +Date: Fri Jun 14 00:25:25 2024 +0000 + + upstream: make host/banner comments go to stderr instead of stdout, + + so they are useful as comments without extra shell redirection and so they + don't clutter actual errors on stderr. + + Add a -q flag to shut them up. + + ok dtucker@ + + OpenBSD-Commit-ID: bec813de56a71adb5c1a76adcf49621130d24264 + +commit 3e806d011855d6bd648ec95b9df630ebbd11c3bf +Author: naddy@openbsd.org +Date: Thu Jun 13 15:06:33 2024 +0000 + + upstream: separate keywords with comma + + OpenBSD-Commit-ID: d65a99666202a8188c4991c18d14374a229f7be5 + +commit abfd1f7a3cbd0a92581a0febba254b2f6649c0d9 +Author: djm@openbsd.org +Date: Fri Jun 14 00:23:55 2024 +0000 + + upstream: specify an algorithm for ssh-keyscan, otherwise it will make + + multiple attempts simultaneously and confuse the test + + OpenBSD-Regress-ID: 6e910f3315c4345053db1bf5cbf61826b194d0b9 + +commit a8fbe2f7d0d96d299ee8e69769e3b51067978748 +Author: Damien Miller +Date: Thu Jun 13 16:41:29 2024 +1000 + + sshd: don't use argv[0] as PAM service name + + sshd would implicitly use argv[0] as the PAM service name to + allow people to select different PAM service names by making + differently-named copies/links to the sshd binary. + + Splitting sshd into sshd/sshd-session broke this, as the process + that starts PAM is always sshd-session and the user has no control + over this. + + Hardcode "sshd" as the default PAM service name unless/until we + figure out a better way. Should unbreak OSX integration tests. + +commit bf204bd05c3ae650f87e2b96527688579f59774c +Author: Damien Miller +Date: Thu Jun 13 15:00:28 2024 +1000 + + prepare for checking in autogenerated files + + We plan to check in automatically generated files (config.h.in, etc) on + release branches. These files are normally ignored by .gitignore, but + this shuffles the contents of this file to make it easy to un-ignore + them. + +commit 425f79a837489904c343b349ef00e09aeaa4e752 +Author: Damien Miller +Date: Thu Jun 13 14:41:33 2024 +1000 + + typo in comment + +commit afe10313c1fa8d478af399ee7d54c8f85503013b +Author: Damien Miller +Date: Thu Jun 13 14:35:25 2024 +1000 + + fix PTY allocation on Cygwin, broken by sshd split + + Cygwin doesn't support FD passing and so used to disable post-auth + privilege separation entirely because privsep requires PTY allocation + to happen in the privileged monitor process with the PTY file + descriptors being passed back to the unprivileged process. + + This brings back a minimal version of the previous special treatment + for Cygwin (and any other platform that sets DISABLE_FD_PASSING): + privilege separation remains enabled, but PTY allocation happens in + the post-auth user process rather than the monitor. + + This either requires PTY allocation to not need privilege to begin + with (this appears to be the case on Cygwin), or the post-auth + privsep process retain privilege (other platforms that set the + DISABLE_FD_PASSING option). + + Keeping privileges here is bad, but the non-Cygwin systems that set + DISABLE_FD_PASSING are so deeply legacy that this is likely to be the + least of their problems. + +commit f66d4df5749551380a8c4ae642347675a0b6a2e9 +Author: Damien Miller +Date: Thu Jun 13 11:33:09 2024 +1000 + + delay lookup of privsep user until config loaded + + sshd-session attempting to use options.kerberos_authentication to + decide whether it needed to lookup the privsep user before the + configuration was loaded. This caused it to get a placeholder value + that caused it always to try to lookup the privsep user, breaking at + least one test environment. + +commit f1c42858b94f5d9b58867b34dce3afb39c6b56a8 +Author: Damien Miller +Date: Thu Jun 13 11:16:57 2024 +1000 + + missing file for PerSourcePenalties regress test + +commit 4de80ff4e6fab5a6bb0028e7d57c6c23d1485adb +Author: djm@openbsd.org +Date: Wed Jun 12 22:36:00 2024 +0000 + + upstream: split PerSourcePenalties address tracking. Previously it + + used one shared table and overflow policy for IPv4 and IPv6 addresses, now it + will use separate tables and optionally different overflow policies. + + This prevents misbehaviour from IPv6 addresses (which are vastly easier + to obtain many of) from affecting IPv4 connections and may allow for + stricter overflow policies. + + ok deraadt@ + + OpenBSD-Commit-ID: 12637ed0aa4d5f1f3e702da42ea967cbd8bfdfd9 + +commit 06ab4c6931b0aaa4334db2faaa7e1069e76d0df6 +Author: jmc@openbsd.org +Date: Tue Jun 11 05:24:39 2024 +0000 + + upstream: do not mark up "(default: 20ms)"; + + OpenBSD-Commit-ID: 54151ecdecfa1b67dcdda4fd24826ef6e2148ad4 + +commit cfe243cd9fde148ed060637876e27bb55ac78be9 +Author: djm@openbsd.org +Date: Tue Jun 11 02:54:51 2024 +0000 + + upstream: reap preauth net child if it hangs up during privsep message + + send, not just message receive + + OpenBSD-Commit-ID: 02a093f4ab4f8f83f0cd1ea2bb35b9ca420448f0 + +commit b0a711c00b9c64afd1c9d6fb538275c6604a2676 +Author: djm@openbsd.org +Date: Tue Jun 11 01:58:27 2024 +0000 + + upstream: fix PIDFILE handling, broken for SUDO=doas in last commit + + here + + OpenBSD-Regress-ID: 96fec579af228f87a036e94801eb294af9074625 + +commit 90fb801e2d9241be50a2a7ff79428386442a041f +Author: djm@openbsd.org +Date: Tue Jun 11 02:00:30 2024 +0000 + + upstream: reap the pre-auth [net] child if it hangs up during privsep + + message sending, not just receiving + + OpenBSD-Commit-ID: f7341605bf08c4c15830910446e6775323f2f8cb + +commit ef878d58798f6688c7f4d4e417dc0c29023ea831 +Author: djm@openbsd.org +Date: Tue Jun 11 01:23:25 2024 +0000 + + upstream: a little more RB_TREE paranoia + + OpenBSD-Commit-ID: 8dc2fd21eebd8830c4a4d25461ac4fe228e11156 + +commit fc4e96b2174d6a894d2033421699d091679baced +Author: djm@openbsd.org +Date: Tue Jun 11 01:22:25 2024 +0000 + + upstream: fix off-by-one comparison for PerSourcePenalty + + OpenBSD-Commit-ID: af4f5d01c41ef870b23e55655bfbf73474a6c02b + +commit 82c836df4ff41145553cd7adb11c5b985aeaa06f +Author: djm@openbsd.org +Date: Tue Jun 11 01:21:41 2024 +0000 + + upstream: move tree init before possible early return + + OpenBSD-Commit-ID: 72e2c5b69f151c08a7c5bf5ad929b97a92c273df + +commit a2300f015cc4939c4d9c564b58b74e71202dc978 +Author: djm@openbsd.org +Date: Tue Jun 11 01:07:35 2024 +0000 + + upstream: update to mention that PerSourcePenalties default to + + being enabled and document the default values for each parameter. + + OpenBSD-Commit-ID: b981288bddfb097aad269f62df4081c688ce0034 + +commit 41987efd356d3fc30139aeab4b09374acf8f91a0 +Author: djm@openbsd.org +Date: Tue Jun 11 00:44:52 2024 +0000 + + upstream: reap the [net] child if it hangs up while writing privsep + + message payloads, not just the message header + + OpenBSD-Commit-ID: 24dbd400aa381ac96be7ed2dd49018487dfef6ce + +commit 6211aa085fa91155a24922e5329576ac9a8f3175 +Author: djm@openbsd.org +Date: Tue Jun 11 00:40:21 2024 +0000 + + upstream: log waitpid() status for abnormal exits + + OpenBSD-Commit-ID: b317930e06b51819c1a2bc6a4359764fecfb1c2d + +commit a59634c7adb9ae988748d99963dfafb3070d8d41 +Author: djm@openbsd.org +Date: Tue Jun 11 00:36:20 2024 +0000 + + upstream: correct error message + + OpenBSD-Commit-ID: 581f60f73099083392887206860229ab104620ed + +commit fa7d7a667f2ee031e72873e36de2d2a36bca973b +Author: deraadt@openbsd.org +Date: Fri Jun 7 13:23:30 2024 +0000 + + upstream: avoid shadowing issues which some compilers won't accept + + ok djm + + OpenBSD-Commit-ID: 1e89572397dda83433d58c4fa6333a08f51170d4 + +commit 3ad4cd9eeca5c9bc6706db44b6de88e2e4513fd6 +Author: jmc@openbsd.org +Date: Thu Jun 6 21:14:49 2024 +0000 + + upstream: escape the final dot at eol in "e.g." to avoid double + + spacing; + + OpenBSD-Commit-ID: 0a9fb10bc9f7d577afe2da3f498a08bc431115b9 + +commit 0e0c69761a4c33ccd4a256560f522784a753d1a8 +Author: djm@openbsd.org +Date: Thu Jun 6 20:25:48 2024 +0000 + + upstream: enable PerSourcePenalties by default. + + ok markus + + NB. if you run a sshd that accepts connections from behind large NAT + blocks, proxies or anything else that aggregates many possible users + behind few IP addresses, then this change may cause legitimate traffic + to be denied. + + Please read the PerSourcePenalties, PerSourcePenaltyExemptList and + PerSourceNetBlockSize options in sshd_config(5) for how to tune your + sshd(8) for your specific circumstances. + + OpenBSD-Commit-ID: 24a0e5c23d37e5a63e16d2c6da3920a51078f6ce + +commit bd1f74741daabeaf20939a85cd8cec08c76d0bec +Author: djm@openbsd.org +Date: Thu Jun 6 20:20:42 2024 +0000 + + upstream: mention that PerSourcePenalties don't affect concurrent + + in-progress connections. + + OpenBSD-Commit-ID: 20389da6264f2c97ac3463edfaa1182c212d420c + +commit 9774b938578327d88a651f4c63c504809717590a +Author: djm@openbsd.org +Date: Thu Jun 6 19:49:25 2024 +0000 + + upstream: regress test for PerSourcePenalties + + OpenBSD-Regress-ID: a1af13d411b25a727742644459d26480b9a1b0f1 + +commit b8ebd86cefe9812204a10c028dc90de29918667d +Author: djm@openbsd.org +Date: Thu Jun 6 19:48:40 2024 +0000 + + upstream: make sure logs are saved from sshd run via start_sshd + + OpenBSD-Regress-ID: de4ef0e32e3ab85ff3a6c36eb08d1909c0dd1b4a + +commit d7b2070bdaa4ebbfafb9975c1d5a62b73289d31f +Author: djm@openbsd.org +Date: Thu Jun 6 19:47:48 2024 +0000 + + upstream: simplify + + OpenBSD-Regress-ID: 50316e0d1ae0c0a057a45af042253e54ce23d11c + +commit e6ea3d224513b6bfb93818809d4c7397f5995ba2 +Author: djm@openbsd.org +Date: Thu Jun 6 18:48:13 2024 +0000 + + upstream: prepare for PerSourcePenalties being enabled by default + + in future + + OpenBSD-Regress-ID: 5236c6d1c823997aac5a35e2915da30f1903bec7 + +commit c0cb3b8c837761816a60a3cdb54062668df09652 +Author: djm@openbsd.org +Date: Thu Jun 6 19:50:01 2024 +0000 + + upstream: disable stderr redirection before closing fds + + OpenBSD-Commit-ID: d42cb895ee4542098050367fc35321c9303f003a + +commit 81c1099d22b81ebfd20a334ce986c4f753b0db29 +Author: djm@openbsd.org +Date: Thu Jun 6 17:15:25 2024 +0000 + + upstream: Add a facility to sshd(8) to penalise particular + + problematic client behaviours, controlled by two new sshd_config(5) options: + PerSourcePenalties and PerSourcePenaltyExemptList. + + When PerSourcePenalties are enabled, sshd(8) will monitor the exit + status of its child pre-auth session processes. Through the exit + status, it can observe situations where the session did not + authenticate as expected. These conditions include when the client + repeatedly attempted authentication unsucessfully (possibly indicating + an attack against one or more accounts, e.g. password guessing), or + when client behaviour caused sshd to crash (possibly indicating + attempts to exploit sshd). + + When such a condition is observed, sshd will record a penalty of some + duration (e.g. 30 seconds) against the client's address. If this time + is above a minimum threshold specified by the PerSourcePenalties, then + connections from the client address will be refused (along with any + others in the same PerSourceNetBlockSize CIDR range). + + Repeated offenses by the same client address will accrue greater + penalties, up to a configurable maximum. A PerSourcePenaltyExemptList + option allows certain address ranges to be exempt from all penalties. + + We hope these options will make it significantly more difficult for + attackers to find accounts with weak/guessable passwords or exploit + bugs in sshd(8) itself. + + PerSourcePenalties is off by default, but we expect to enable it + automatically in the near future. + + much feedback markus@ and others, ok markus@ + + OpenBSD-Commit-ID: 89ded70eccb2b4926ef0366a4d58a693de366cca + +commit 916b0b6174e203cf2c5ec9bcf409472eb7ffbf43 +Author: Damien Miller +Date: Fri Jun 7 03:31:02 2024 +1000 + + whitespace + +commit 49b55e44182b8294419aa580cbf043d5b9e3d953 +Author: deraadt@openbsd.org +Date: Tue Jun 4 15:14:45 2024 +0000 + + upstream: enable -fret-clean on amd64, for libc libcrypto ld.so + + kernel, and all the ssh tools. The dynamic objects are entirely ret-clean, + static binaries will contain a blend of cleaning and non-cleaning callers. + + OpenBSD-Commit-ID: 112aacedd3b61cc5c34b1fa6d9fb759214179172 + +commit cc80d51d034bcb24fd0f2564a4bdf1612000a2a2 +Author: Damien Miller +Date: Wed Jun 5 02:21:30 2024 +1000 + + remove PRIVSEP macros for osx + +commit 8785491123d4d722b310c20f383570be758f8263 +Author: djm@openbsd.org +Date: Sat Jun 1 07:03:37 2024 +0000 + + upstream: be really strict with fds reserved for communication with the + + separate sshd-session process - reserve them early and fatal if we can't + dup2(2) them later. The pre-split fallback to re-reading the configuration + files is not possible, so sshd-session absolutely requires the fd the + configuration is passed over to be in order. + + ok deraadt@ + + OpenBSD-Commit-ID: 308a98ef3c8a6665ebf92c7c9a0fc9600ccd7065 + +commit f1c8918cb98459910fb159373baea053ba4108c0 +Author: Damien Miller +Date: Fri May 31 19:12:26 2024 +1000 + + depend + +commit 94b4866cb1f4b0ed29a9f367047b30f81002316f +Author: Damien Miller +Date: Fri May 31 19:11:14 2024 +1000 + + rename need_privsep to need_chroot + + privsep is mandatory, chroot is optional (disabled when running + sshd as non-root) + +commit e68a95142e5024b144f8eeccd5ffdee42c34f44c +Author: Damien Miller +Date: Fri May 31 19:05:34 2024 +1000 + + remove remaining use_privsep mention + +commit b21d271f651d2536dca819cc6d74032fe98634db +Author: djm@openbsd.org +Date: Fri May 31 09:01:08 2024 +0000 + + upstream: warn when -r (deprecated option to disable re-exec) is + + passed + + OpenBSD-Commit-ID: 73145ef5150edbe3ce7889f0844ed8fa6155f551 + +commit a4b5bc246cbca476deeeb4462aa31746a56e3021 +Author: djm@openbsd.org +Date: Fri May 31 08:49:35 2024 +0000 + + upstream: typos + + OpenBSD-Commit-ID: edfa72eb06bfa65da30fabf7d2fe76d2d33f77bf + +commit 8054b906983ceaed01fabd8188d3dac24c05ba39 +Author: djm@openbsd.org +Date: Mon May 27 01:52:26 2024 +0000 + + upstream: don't need sys/queue.h here + + OpenBSD-Commit-ID: dd137396828171eb19e4911581812ca58de6c578 + +commit 210d4239733da6180ce853538aeb9413d5c62ad5 +Author: naddy@openbsd.org +Date: Sun May 26 20:35:12 2024 +0000 + + upstream: remove references to SSH1 and DSA server keys + + OpenBSD-Commit-ID: 57cc1c98d4f998981473734f144b904af7d178a2 + +commit f0b9261d7fdd0ef86806b49fe76344bd16770cd0 +Author: jsg@openbsd.org +Date: Thu May 23 23:47:16 2024 +0000 + + upstream: remove unused struct fwd_perm_list, no decl with complete + + type ok djm@ + + OpenBSD-Commit-ID: 416fb3970b7e73c76d2963c4f00cf96f2b2ee2fb + +commit 2477a98c3ef78e63b11a1393656e00288f52ae97 +Author: naddy@openbsd.org +Date: Wed May 22 15:24:55 2024 +0000 + + upstream: Do not pass -Werror twice when building with clang. + + OpenBSD-Commit-ID: 5f378c38ad8976d507786dc4db9283a879ec8cd0 + +commit 435844f5675245b4271f8581f15e6d1f34fde3bc +Author: miod@openbsd.org +Date: Wed May 22 11:49:36 2024 +0000 + + upstream: Do not pass -Werror if building with gcc 3, for asn1.h + + and bio.h cause (admittedly bogus) warnings with gcc 3. + + OpenBSD-Commit-ID: fb39324748824cb0387e9d67c41d1bef945c54ea + +commit fc5dc092830de23767c6ef67baa18310a64ee533 +Author: djm@openbsd.org +Date: Wed May 22 04:20:00 2024 +0000 + + upstream: this test has been broken since 2014, and has been + + testing the same key exchange algorithm repeatedly instead of testing all of + them. Spotted by nreilly AT blackberry.com in bz3692 + + Who broke the test? me. + + OpenBSD-Regress-ID: 48f4f5946276f975667141957d25441b3c9a50e2 + +commit fd4816791beaed2fdae7eea3e1494d1972b2a39d +Author: anton@openbsd.org +Date: Sun May 19 19:10:01 2024 +0000 + + upstream: Add missing kex-names.c source file required since the + + ssh split. + + OpenBSD-Regress-ID: ca666223f828fc4b069cb9016bff1eb50faf9fbb + +commit beccb7319c5449f6454889013403c336446d622e +Author: naddy@openbsd.org +Date: Fri May 17 14:42:00 2024 +0000 + + upstream: remove duplicate copy of relink kit for sshd-session + + OpenBSD-Commit-ID: 6d2ded4cd91d4d727c2b26e099b91ea935bed504 + +commit dcd79fa141311c287e0595ede684b7116122fae0 +Author: jsg@openbsd.org +Date: Fri May 17 06:42:04 2024 +0000 + + upstream: remove prototypes with no matching function; ok djm@ + + OpenBSD-Commit-ID: 6d9065dadea5f14a01bece0dbfe2fba1be31c693 + +commit 6454a05e7c6574d70adf17efe505a8581a86ca4f +Author: jsg@openbsd.org +Date: Fri May 17 06:38:00 2024 +0000 + + upstream: remove externs for removed vars; ok djm@ + + OpenBSD-Commit-ID: f51ea791d45c15d4927eb4ae7d877ccc1e5a2aab + +commit f3e4db4601ef7d2feb1d6f7447e432aaf353a616 +Author: deraadt@openbsd.org +Date: Fri May 17 06:11:17 2024 +0000 + + upstream: -Werror was turned on (probably just for development), + + and this is a simple way to satisfy older gcc. + + OpenBSD-Commit-ID: 7f698df54384b437ce33ab7405f0b86c87019e86 + +commit 24a1f3e5ad6f4a49377d4c74c36637e9a239efd0 +Author: Damien Miller +Date: Fri May 17 14:50:43 2024 +1000 + + attempt at updating RPM specs for sshd-session + +commit 17b566eeb7a0c6acc9c48b35c08885901186f861 +Author: djm@openbsd.org +Date: Fri May 17 04:42:13 2024 +0000 + + upstream: g/c unused variable + + OpenBSD-Commit-ID: aa6ef0778a1f1bde0d73efba72a777c48d2bd010 + +commit 01fb82eb2aa0a4eaf5c394ea8bb37ea4c26f8a3f +Author: jsg@openbsd.org +Date: Fri May 17 02:39:11 2024 +0000 + + upstream: spelling; ok djm@ + + OpenBSD-Commit-ID: bdea29bb3ed2a5a7782999c4c663b219d2270483 + +commit b88b690e99145a021fc1a1a116a11e0bce0594e7 +Author: djm@openbsd.org +Date: Fri May 17 01:45:22 2024 +0000 + + upstream: allow overriding the sshd-session binary path + + OpenBSD-Regress-ID: 5058cd1c4b6ca1a15474e33546142931d9f964da + +commit a68f80f2511f0e0c5cef737a8284cc2dfabad818 +Author: anton@openbsd.org +Date: Wed Apr 3 06:01:11 2024 +0000 + + upstream: Since ssh-agent(1) is only readable by root by now, use + + ssh(1) while generating data in tests. + + OpenBSD-Regress-ID: 24eb40de2e6b0ace185caaba35e2d470331ffe68 + +commit 92e55890314ce2b0be21a43ebcbc043b4abc232f +Author: djm@openbsd.org +Date: Fri May 17 01:17:40 2024 +0000 + + upstream: fix incorrect debug option name introduce in previous + + commit + + OpenBSD-Commit-ID: 66d69e22b1c072c694a7267c847f212284614ed3 + +commit 4ad72878af7b6ec28da6e230e36a91650ebe84c1 +Author: deraadt@openbsd.org +Date: Fri May 17 00:33:25 2024 +0000 + + upstream: construct and install a relink-kit for sshd-session ok + + djm + + OpenBSD-Commit-ID: 8b3820adb4da4e139c4b3cffbcc0bde9f08bf0c6 + +commit 02e679a2cb3f6df8e9dbb1519ed578226485157f +Author: Damien Miller +Date: Fri May 17 12:21:27 2024 +1000 + + Makefile support for sshd-session + +commit c0416035c5eaf70a8450d11c8833c5f7068ee7ad +Author: djm@openbsd.org +Date: Fri May 17 00:32:32 2024 +0000 + + upstream: missing files from previous + + OpenBSD-Commit-ID: 4b7be4434d8799f02365552b641a7a70a7ebeb2f + +commit 03e3de416ed7c34faeb692967737be4a7bbe2eb5 +Author: djm@openbsd.org +Date: Fri May 17 00:30:23 2024 +0000 + + upstream: Start the process of splitting sshd into separate + + binaries. This step splits sshd into a listener and a session binary. More + splits are planned. + + After this changes, the listener binary will validate the configuration, + load the hostkeys, listen on port 22 and manage MaxStartups only. All + session handling will be performed by a new sshd-session binary that the + listener fork+execs. + + This reduces the listener process to the minimum necessary and sets us + up for future work on the sshd-session binary. + + feedback/ok markus@ deraadt@ + + NB. if you're updating via source, please restart sshd after installing, + otherwise you run the risk of locking yourself out. + + OpenBSD-Commit-ID: 43c04a1ab96cdbdeb53d2df0125a6d42c5f19934 + +commit 1c0d81357921f8d3bab06841df649edac515ae5b +Author: djm@openbsd.org +Date: Thu May 9 09:46:47 2024 +0000 + + upstream: simplify exit message handling, which was more complicated + + than it needed to be because of unexpunged ssh1 remnants. ok markus@ + + OpenBSD-Commit-ID: 8b0cd2c0dee75fb053718f442aa89510b684610b + +commit cbbbf76aa6cd54fce32eacce1300e7abcf9461d4 +Author: tobias@openbsd.org +Date: Mon May 6 19:26:17 2024 +0000 + + upstream: remove SSH1 leftovers + + Authored with Space Meyer + + ok djm + + OpenBSD-Commit-ID: 81db602e4cb407baae472689db1c222ed7b2afa3 + +commit bc5dcb8ab9a4e8af54a724883732af378f42ea78 +Author: tobias@openbsd.org +Date: Tue Apr 30 15:40:43 2024 +0000 + + upstream: never close stdin + + The sanitise_stdfd call makes sure that standard file descriptors are + open (if they were closed, they are connected with /dev/null). + + Do not close stdin in any case to prevent error messages when stdin is + read multiple times and to prevent later usage of fd 0 for connections, + e.g. + + echo localhost | ssh-keyscan -f - -f - + + While at it, make stdin-related error messages nicer. + + Authored with Max Kunzelmann + + ok djm + + OpenBSD-Commit-ID: 48e9b7938e2fa2f9bd47e6de6df66a31e0b375d3 + +commit 6a42b70e56bef1aacdcdf06352396e837883e84f +Author: Damien Miller +Date: Wed May 8 09:43:59 2024 +1000 + + sync getrrsetbyname.c with recent upstream changes + +commit 385ecb31e147dfea59c1c488a1d2011d3867e60e +Author: djm@openbsd.org +Date: Tue Apr 30 06:23:51 2024 +0000 + + upstream: fix home-directory extension implementation, it always + + returned the current user's home directory contrary to the spec. + + Patch from Jakub Jelen via GHPR477 + + OpenBSD-Commit-ID: 5afd775eab7f9cbe222d7fbae4c793de6c3b3d28 + +commit 14e2b16bc67ffcc188906f65008667e22f73d103 +Author: djm@openbsd.org +Date: Tue Apr 30 06:16:55 2024 +0000 + + upstream: flush stdout after writing "sftp>" prompt when not using + + editline. + + From Alpine Linux via GHPR480 + + OpenBSD-Commit-ID: 80bdc7ffe0358dc090eb9b93e6dedb2b087b24cd + +commit 2e69a724051488e3fb3cd11531c4b5bc1764945b +Author: djm@openbsd.org +Date: Tue Apr 30 05:53:03 2024 +0000 + + upstream: stricter validation of messaging socket fd number; disallow + + usage of stderr. Based on GHPR492 by RealHurrison + + OpenBSD-Commit-ID: 73dbbe82ea16f73ce1d044d3232bc869ae2f2ce8 + +commit da757b022bf18c6f7d04e685a10cd96ed00f83da +Author: djm@openbsd.org +Date: Tue Apr 30 05:45:56 2024 +0000 + + upstream: add missing reserved fields to key constraint protocol + + documentation. + + from Wiktor Kwapisiewicz via GHPR487 + + OpenBSD-Commit-ID: 0dfb69998cfdb3fa00cbb0e7809e7d2f6126e3df + +commit 16d0b82fa08038f35f1b3630c70116979f49784f +Author: Damien Miller +Date: Tue Apr 30 12:39:34 2024 +1000 + + depend + +commit 66aaa678dbe59aa21d0d9d89a3596ecedde0254b +Author: djm@openbsd.org +Date: Tue Apr 30 02:14:10 2024 +0000 + + upstream: correctly restore sigprocmask around ppoll() reported + + by Tõivo Leedjärv; ok deraadt@ + + OpenBSD-Commit-ID: c0c0f89de5294a166578f071eade2501929c4686 + +commit 80fb0eb21551aed3aebb009ab20aeffeb01e44e0 +Author: djm@openbsd.org +Date: Tue Apr 30 02:10:49 2024 +0000 + + upstream: add explict check for server hostkey type against + + HostkeyAlgorithms. Allows HostkeyAlgorithms to disable implicit fallback from + certificate keys to plain keys. ok markus@ + + OpenBSD-Commit-ID: 364087e4a395ff9b2f42bf3aefdb2090bb23643a + +commit 5b28096d31ff7d80748fc845553a4aef5bb05d86 +Author: jsg@openbsd.org +Date: Tue Apr 23 13:34:50 2024 +0000 + + upstream: correct indentation; no functional change ok tb@ + + OpenBSD-Commit-ID: dd9702fd43de546bc6a3f4f025c74d6f3692a0d4 + +commit fd3cb8a82784e05f621dea5b56ac6f89bc53c067 +Author: semarie@openbsd.org +Date: Thu Apr 4 16:00:51 2024 +0000 + + upstream: set right mode on ssh-agent at boot-time + + which sthen@ + ok deraadt@ + + OpenBSD-Commit-ID: 662b5056a2c6171563e1626f9c69f27862b5e7af + +commit 54343a260e3aa4bceca1852dde31cd08e2abd82b +Author: deraadt@openbsd.org +Date: Tue Apr 2 12:22:38 2024 +0000 + + upstream: Oops, incorrect hex conversion spotted by claudio. + + While here try to improve how it reads a bit better. Surprising the + regression tests didn't spot this error, maybe it fails to roundtrip the + values. + + OpenBSD-Commit-ID: 866cfcc1955aef8f3fc32da0b70c353a1b859f2e + +commit ec78c31409590ad74efc194f886273ed080a545a +Author: deraadt@openbsd.org +Date: Tue Apr 2 10:02:08 2024 +0000 + + upstream: for parse_ipqos(), use strtonum() instead of mostly + + idiomatic strtoul(), but wow it's so gross. ok djm + + OpenBSD-Commit-ID: cec14a76af2eb7b225300c80fc0e21052be67b05 + +commit 8176e1a6c2e6da9361a7abb6fbf6c23c299f495b +Author: deraadt@openbsd.org +Date: Tue Apr 2 09:56:58 2024 +0000 + + upstream: can shortcut by returning strtonum() value directly; ok + + djm + + OpenBSD-Commit-ID: 7bb2dd3d6d1f288dac14247d1de446e3d7ba8b8e + +commit 9f543d7022a781f80bb696f9d73f1d1c6f9e31d6 +Author: deraadt@openbsd.org +Date: Tue Apr 2 09:52:14 2024 +0000 + + upstream: rewrite convtime() to use a isdigit-scanner and + + strtonum() instead of strange strtoul can might be fooled by garage + characters. passes regress/usr.bin/ssh/unittests/misc ok djm + + OpenBSD-Commit-ID: 4b1ef826bb16047aea3f3bdcb385b72ffd450abc + +commit 8673137f780d8d9e4cda3c4605cb5d88d5cea271 +Author: claudio@openbsd.org +Date: Tue Apr 2 09:48:24 2024 +0000 + + upstream: Remove unused ptr[3] char array in pkcs11_decode_hex. + + OK deraadt@ + + OpenBSD-Commit-ID: 3d14433e39fd558f662d3b0431c4c555ef920481 + +commit c7fec708f331f108343d69e4d74c9a5d86d6cfe7 +Author: deraadt@openbsd.org +Date: Tue Apr 2 09:32:28 2024 +0000 + + upstream: Replace non-idiomatic strtoul(, 16) to parse a region + + of 2-character hex sequences with a low-level replacement designed just for + the task. ok djm + + OpenBSD-Commit-ID: 67bab8b8a4329a19a0add5085eacd6f4cc215e85 + +commit 019a5f483b0f588da6270ec401d0b4bb35032f3f +Author: deraadt@openbsd.org +Date: Tue Apr 2 09:29:31 2024 +0000 + + upstream: Use strtonum() instead of severely non-idomatic + + strtoul() In particular this will now reject trailing garbage, ie. + '12garbage'. ok djm + + OpenBSD-Commit-ID: c82d95e3ccbfedfc91a8041c2f8bf0cf987d1501 + +commit 8231ca046fa39ea4eb99b79e0a6e09dec50ac952 +Author: deraadt@openbsd.org +Date: Mon Apr 1 15:50:17 2024 +0000 + + upstream: also create a relink kit for ssh-agent, since it is a + + long-running setgid program carrying keys with some (not very powerful) + communication channels. solution for testing the binary from dtucker. + agreement from djm. Will add it into /etc/rc in a few days. + + OpenBSD-Commit-ID: 2fe8d707ae35ba23c7916adcb818bb5b66837ba0 + +commit bf7bf50bd6a14e49c9c243cb8f4de31e555a5a2e +Author: deraadt@openbsd.org +Date: Mon Apr 1 15:48:16 2024 +0000 + + upstream: new-style relink kit for sshd. The old scheme created + + a Makefile by concatenating two Makefiles and was incredibly fragile. In the + new way a narrow-purposed install.sh script is created and shipped with the + objects. A recently commited /etc/rc script understands these files. + + OpenBSD-Commit-ID: ef9341d5a50f0d33e3a6fbe995e92964bc7ef2d3 + +commit 00e63688920905e326d8667cb47f17a156b6dc8f +Author: renmingshuai +Date: Fri Apr 12 10:20:49 2024 +0800 + + Shell syntax fix (leftover from a sync). + + Signed-off-by: renmingshuai + +commit 2eded551ba96e66bc3afbbcc883812c2eac02bd7 +Author: Darren Tucker +Date: Thu Apr 25 13:20:19 2024 +1000 + + Merge flags for OpenSSL 3.x versions. + + OpenSSL has moved to 3.4 which we don't currently accept. Based on + the OpenSSL versioning policy[0] it looks like all of the 3.x versions + should work with OpenSSH, so remove the distinction in configure and + accept all of them. + + [0] https://openssl.org/policies/general/versioning-policy.html + +commit 8673245918081c6d1dc7fb3733c8eb2c5a902c5e +Author: Darren Tucker +Date: Thu Apr 25 13:19:03 2024 +1000 + + Remove 9.6 branch from status page. + +commit 70d43049747fa3c66cf876d52271859407cec2fa +Author: Darren Tucker +Date: Thu Apr 25 13:16:58 2024 +1000 + + Update LibreSSL and OpenSSL versions tested. + + Update LibreSSL versions to current releases (3.8.4 & 3.9.1). + Add newly-released OpenSSL 3.3.0, and add tests against the 3.1 and + 3.3 branches. + +commit 88351eca17dcc55189991ba60e50819b6d4193c1 +Author: 90 +Date: Fri Apr 5 19:36:06 2024 +0100 + + Fix missing header for systemd notification + +commit 08f579231cd38a1c657aaa6ddeb8ab57a1fd4f5c +Author: Damien Miller +Date: Wed Apr 3 14:40:32 2024 +1100 + + notify systemd on listen and reload + + Standalone implementation that does not depend on libsystemd. + With assistance from Luca Boccassi, and feedback/testing from Colin + Watson. bz2641 + +commit 43e7c1c07cf6aae7f4394ca8ae91a3efc46514e2 +Author: Darren Tucker +Date: Sun Mar 31 21:51:57 2024 +1100 + + Port changes from selfhosted to upstream tests. + + Should get them working again. + +commit 281ea25a44bff53eefb4af7bab7aa670b1f8b6b2 +Author: Darren Tucker +Date: Sat Mar 30 18:20:16 2024 +1100 + + Check if OpenSSL implementation supports DSA. + + If --enable/disable-dsa-keys is not specified, set based on what OpenSSL + supports. If specified as enabled, but not supported by OpenSSL error + out. ok djm@ + +commit 2d2c068de8d696fe3246f390b146197f51ea1e83 +Author: djm@openbsd.org +Date: Sat Mar 30 05:56:22 2024 +0000 + + upstream: in OpenSSH private key format, correct type for subsequent + + private keys in blob. From Jakub Jelen via GHPR430 + + OpenBSD-Commit-ID: d17dbf47554de2d752061592f95b5d772baab50b + +commit c2c0bdd3e96b3ef66d77fccb85ff4962dc76caf0 +Author: Eero Häkkinen +Date: Sat Sep 16 00:55:08 2023 +0300 + + Expose SSH_AUTH_INFO_0 always to PAM auth modules. + + This changes SSH_AUTH_INFO_0 to be exposed to PAM auth modules also + when a password authentication method is in use and not only + when a keyboard-interactive authentication method is in use. + +commit 02c5ad23124ae801cf248d99ea5068fc4331ca01 +Author: Darren Tucker +Date: Wed Mar 27 17:42:58 2024 +1100 + + Rearrange selfhosted VM scheduling. + + Instead of trying to infer the type of the self hosted tests in each of + the driver scripts (inconsistently...), set one of the following + variables to "true" in the workflow: + + VM: tests run in a virtual machine. + EPHEMERAL: tests run on an ephemeral virtual machine. + PERSISTENT: tests run on a persistent virtual machine + REMOTE: tests run on a physical remote host. + + EPHEMERAL VMs can have multiple instances of any given VM can exist + simultaneously and are run by a runner pool. The other types have a + dedicated runner instance and can only run a single test at a time. + + Other settings: + SSHFS: We need to sshfs mount over the repo so the workflow can collect + build artifacts. This also implies the tests must be run over ssh. + DEBUG_ACTIONS: enable "set -x" in scripts for debugging. + +commit cd8a72707c02615365d0851ac51063ab6bfe258f +Author: Damien Miller +Date: Sat Mar 30 16:05:59 2024 +1100 + + add new token-based signing key for dtucker@ + + Verified in person and via signature with old key. + Will remove old key in a bit. + +commit 8d0e46c1ddb5b7f0992591b0dc5d8aaa77cc9dba +Author: Alkaid +Date: Tue Mar 12 03:59:12 2024 -0700 + + Fix OpenSSL ED25519 support detection + + Wrong function signature in configure.ac prevents openssh from enabling + the recently new support for ED25519 priv keys in PEM PKCS8 format. + +commit 697359be9c23ee43618243cdbcc9c7981e766752 +Author: djm@openbsd.org +Date: Sat Mar 30 04:27:44 2024 +0000 + + upstream: allow WAYLAND_DISPLAY to enable SSH_ASKPASS + + From dkg via GHPR479; ok dtucker@ + + OpenBSD-Commit-ID: 1ac1f9c45da44eabbae89375393c662349239257 + +commit 7844705b0364574cc70b941be72036c2c2966363 +Author: dtucker@openbsd.org +Date: Fri Mar 29 10:40:07 2024 +0000 + + upstream: Use egrep instead of grep -E. + + Some plaforms don't have the latter so this makes things easier + in -portable. + + OpenBSD-Regress-ID: ff82260eb0db1f11130200b25d820cf73753bbe3 + +commit 22b2b6c555334bffdf357a2e4aa74308b03b83c3 +Author: dtucker@openbsd.org +Date: Tue Mar 26 08:09:16 2024 +0000 + + upstream: test -h is the POSIXly way of testing for a symlink. Reduces + + diff vs Portable. + + OpenBSD-Regress-ID: 6f31cd6e231e3b8c5c2ca0307573ccb7484bff7d + +commit edcff77f82c2bb2b5653b36f1e47274c5ef3e8be +Author: Darren Tucker +Date: Tue Mar 26 18:58:58 2024 +1100 + + Fix name of OpenBSD upstream CI jobs. + +commit 861b084429940e024f1b6e9c2779eac95d7a45db +Author: Darren Tucker +Date: Tue Mar 26 18:55:33 2024 +1100 + + Resync with upstream: ${} around DATAFILE. + +commit 63f248c7693e7f0a3b9a13d2980ac9a7e37f2aea +Author: djm@openbsd.org +Date: Mon Mar 25 19:28:09 2024 +0000 + + upstream: optional debugging + + OpenBSD-Regress-ID: b4852bf97ac8fb2e3530f2d5f999edd66058d7bc + +commit 16e2ebe06a62f09d4877b769876d92d6008a896f +Author: dtucker@openbsd.org +Date: Mon Mar 25 06:05:42 2024 +0000 + + upstream: Verify string returned from local shell command. + + OpenBSD-Regress-ID: 5039bde24d33d809aebfa8d3ad7fe9053224e6f8 + +commit b326f7a1f39ff31324cc3fe2735178fb474c04a4 +Author: dtucker@openbsd.org +Date: Mon Mar 25 03:30:31 2024 +0000 + + upstream: Improve shell portability: grep -q is not portable so + + redirect stdout, and use printf instead of relying on echo to do \n + substitution. Reduces diff vs Portable. + + Also resync somewhat with upstream. + + OpenBSD-Regress-ID: 9ae876a8ec4c4725f1e9820a0667360ee2398337 + +commit dbf2e319f0c582613fa45a735ea3c242ce56946b +Author: dtucker@openbsd.org +Date: Mon Mar 25 02:07:08 2024 +0000 + + upstream: Save error code from SSH for use inside case statement, + + from portable. In some shells, "case" will reset the value of $?, so save it + first. + + OpenBSD-Regress-ID: da32e5be19299cb4f0f7de7f29c11257a62d6949 + +commit d2c8c4fa7def4fb057ed05b3db57b62c810a26f6 +Author: dtucker@openbsd.org +Date: Mon Mar 25 01:40:47 2024 +0000 + + upstream: Increase timeout. Resyncs with portable where some of + + the test VMs are slow enough for this to matter. + + OpenBSD-Regress-ID: 6a83a693602eb0312f06a4ad2cd6f40d99d24b26 + +commit 83621b63514a84791623db3efb59d38bc4bf9563 +Author: dtucker@openbsd.org +Date: Mon Mar 25 01:28:29 2024 +0000 + + upstream: In PuTTY interop test, don't assume the PuTTY major + + version is 0. Patch from cjwatson at debian.org via bz#3671. + + OpenBSD-Regress-ID: 835ed03c1b04ad46be82e674495521f11b840191 + +commit 8a421b927700f3834b4d985778e252b8e3299f83 +Author: Darren Tucker +Date: Tue Mar 26 18:38:14 2024 +1100 + + Really mkdir /usr/local/etc in CI tests. + +commit 2946ed522c47ce045314533d426b4e379f745e59 +Author: Darren Tucker +Date: Tue Mar 26 17:19:09 2024 +1100 + + Better short name for OpenBSD upstream CI jobs too. + +commit 18dbe8eff647aacb82d7e86b4ce63d5beee11f25 +Author: Darren Tucker +Date: Tue Mar 26 17:13:52 2024 +1100 + + Ensure /usr/local/etc exists before using in tests. + +commit 5fc1085128e3348bb1b5ee4d955cc767b019b3ad +Author: Darren Tucker +Date: Tue Mar 26 16:50:46 2024 +1100 + + Be more specific about when to rerun workflows. + +commit 5516923e8ae3da0823fea0d7d28aa813627142c0 +Author: Darren Tucker +Date: Tue Mar 26 16:35:27 2024 +1100 + + Add short names for test jobs on github CI. + +commit dc37d2d2470b4a9cedcee9ac926b7362214e3305 +Author: Darren Tucker +Date: Tue Mar 26 16:26:14 2024 +1100 + + If we're using xpg4's id, remember to pass args. + +commit fe169487937780392b23d3ff3c00e5898c10f784 +Author: dtucker@openbsd.org +Date: Tue Mar 26 01:23:11 2024 +0000 + + upstream: Import regenerated moduli. + + OpenBSD-Commit-ID: ad3d1486d105b008c93e952d158e5af4d9d4c531 + +commit 151146f03b490d19145cd421763aa7d42f5c50e2 +Author: job@openbsd.org +Date: Thu Mar 14 06:23:14 2024 +0000 + + upstream: Clarify how literal IPv6 addresses can be used in -J mode + + OK djm@ + + OpenBSD-Commit-ID: 524ddae97746b3563ad4a887dfd0a6e6ba114c50 + +commit 0d5bdc87a675271862b67eb6a9fb13a202fb4894 +Author: Darren Tucker +Date: Mon Mar 25 16:14:21 2024 +1100 + + Add Mac OS X 14 test targets. + +commit 2d7964a03e1f50a48040ec6912c0a956df909d21 +Author: Darren Tucker +Date: Mon Mar 25 14:05:40 2024 +1100 + + Move xpg4 'id' handling into test-exec.sh. + + Handle replacement of 'id' the same way as we do other Portable specific + replacements in test-exec.sh. This brings percent.sh back into sync + with upstream. + +commit 75d1d49ed10d978171cdafad28bdbffdbd48f41e +Author: Darren Tucker +Date: Mon Mar 25 10:38:03 2024 +1100 + + Update branches shown on ci-status to 9.7 and 9.6. + +commit f9193f03db0029fc9c31fbdb5c66a2737446bd8f +Author: Darren Tucker +Date: Mon Mar 25 09:28:02 2024 +1100 + + Improve detection of -fzero-call-used-regs=used. + + Should better detect problems with gcc 13 on m68k. bz#3673 from Colin + Watson via bz#3673 and https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110934 + + Signed-off-by: Darren Tucker + +commit 86bdd3853f4d32c85e295e6216a2fe0953ad93f0 +Author: Damien Miller +Date: Mon Mar 11 16:20:49 2024 +1100 + + version number in README + +commit 282721418e6465bc39ccfd39bb0133e670ee4423 +Author: Damien Miller +Date: Mon Mar 11 16:20:08 2024 +1100 + + crank RPM spec versions + +commit 3876a3bbd2ca84d23ba20f8b69ba83270c04ce3a +Author: djm@openbsd.org +Date: Mon Mar 11 04:59:47 2024 +0000 + + upstream: openssh-9.7 + + OpenBSD-Commit-ID: 618ececf58b8cdae016b149787af06240f7b0cbc + +commit 8fc109cc614954a8eb2738c48c0db36a62af9a06 +Author: Darren Tucker +Date: Mon Mar 11 12:59:26 2024 +1100 + + Test against current OpenSSL and LibreSSL releases. + + Add LibreSSL 3.9.0, bump older branches to their respective current + releases. + +commit 26b09b45fec7b88ba09042c09be4157e58e231e2 +Author: Damien Miller +Date: Sun Mar 10 16:24:57 2024 +1100 + + quote regexes used to test for algorithm support + + Fixes test failures on Solaris 8 reported by Tom G. Christensen + +commit a6a740a4948d10a622b505135bb485c10f21db5e +Author: djm@openbsd.org +Date: Sat Mar 9 05:12:13 2024 +0000 + + upstream: avoid logging in signal handler by converting mainloop to + + ppoll() bz3670, reported by Ben Hamilton; ok dtucker@ + + OpenBSD-Commit-ID: e58f18042b86425405ca09e6e9d7dfa1df9f5f7f + +commit cd82f7526e0481720567ae41db7849ab1c27e27b +Author: djm@openbsd.org +Date: Fri Mar 8 22:16:32 2024 +0000 + + upstream: skip more whitespace, fixes find-principals on + + allowed_signers files with blank lines; reported by Wiktor Kwapisiewicz + + OpenBSD-Commit-ID: b3a22a2afd753d70766f34bc7f309c03706b5298 + +commit 2f9d2af5cb19905d87f37d1e11c9f035ac5daf3b +Author: dtucker@openbsd.org +Date: Fri Mar 8 11:34:10 2024 +0000 + + upstream: Invoke ProxyCommand that uses stderr redirection via + + $TEST_SHELL. Fixes test when run by a user whose login shell is tcsh. + Found by vinschen at redhat.com. + + OpenBSD-Regress-ID: f68d79e7f00caa8d216ebe00ee5f0adbb944062a + +commit 9b3f0beb4007a7e01dfedabb429097fb593deae6 +Author: Darren Tucker +Date: Thu Mar 7 17:18:14 2024 +1100 + + Prefer openssl binary from --with-ssl-dir directory. + + Use openssl in the directory specified by --with-ssl-dir as long + as it's functional. Reported by The Doctor. + +commit c47e1c9c7911f38b2fc2fb01b1f6ae3a3121a838 +Author: djm@openbsd.org +Date: Wed Mar 6 02:59:59 2024 +0000 + + upstream: fix memory leak in mux proxy mode when requesting forwarding. + + found by RASU JSC, reported by Maks Mishin in GHPR#467 + + OpenBSD-Commit-ID: 97d96a166b1ad4b8d229864a553e3e56d3116860 + +commit 242742827fea4508e68097c128e802edc79addb5 +Author: djm@openbsd.org +Date: Wed Mar 6 00:31:04 2024 +0000 + + upstream: wrap a few PKCS#11-specific bits in ENABLE_PKCS11 + + OpenBSD-Commit-ID: 463e4a69eef3426a43a2b922c4e7b2011885d923 + +commit d52b6509210e2043f33e5a1de58dd4a0d5d48c2a +Author: Damien Miller +Date: Wed Mar 6 11:31:36 2024 +1100 + + disable RSA tests when algorithm is not supported + + Unbreaks "make test" when compiled --without-openssl. + + Similar treatment to how we do DSA and ECDSA. + +commit 668d270a6c77e8b5a1da26ecad2e6de9f62c8fe4 +Author: Damien Miller +Date: Wed Mar 6 10:33:20 2024 +1100 + + add a --without-retpoline configure option + + discussed with deraadt and dtucker a while ago + +commit 3deb501f86fc47e175ef6a3eaba9b9846a80d444 +Author: djm@openbsd.org +Date: Mon Mar 4 04:13:18 2024 +0000 + + upstream: fix leak of CanonicalizePermittedCNAMEs on error path; + + spotted by Coverity (CID 438039) + + OpenBSD-Commit-ID: 208839699939721f452a4418afc028a9f9d3d8af + +commit 65a44a8a4f7d902a64d4e60eda84384b2e2a24a2 +Author: djm@openbsd.org +Date: Mon Mar 4 02:16:11 2024 +0000 + + upstream: Separate parsing of string array options from applying them + + to the active configuration. This fixes the config parser from erroneously + rejecting cases like: + + AuthenticationMethods password + Match User ivy + AuthenticationMethods any + + bz3657 ok markus@ + + OpenBSD-Commit-ID: 7f196cba634c2a3dba115f3fac3c4635a2199491 + +commit 6886e1b1f55c90942e4e6deed930f8ac32e0f938 +Author: Darren Tucker +Date: Thu Feb 22 17:59:35 2024 +1100 + + Add nbsd10 test target. + +commit d86bf8a3f6ea4fa7887406c2aa9959db71fa41be +Author: Damien Miller +Date: Thu Feb 22 12:06:10 2024 +1100 + + more descriptive configure test name + +commit 9ee335aacc9f5bdc4cc2c19fafb45e27be7d234e +Author: djm@openbsd.org +Date: Wed Feb 21 06:17:29 2024 +0000 + + upstream: explain arguments of internal-sftp GHPR#454 from Niklas + + Hambüchen + MIME-Version: 1.0 + Content-Type: text/plain; charset=UTF-8 + Content-Transfer-Encoding: 8bit + + OpenBSD-Commit-ID: 0335d641ae6b5b6201b9ffd5dd06345ebbd0a3f3 + +commit d1164cb1001dd208fee88aaa9b43d5e6fd917274 +Author: djm@openbsd.org +Date: Wed Feb 21 06:06:43 2024 +0000 + + upstream: clarify permissions requirements for ChrootDirectory Part + + of GHPR#454 from Niklas Hambüchen + MIME-Version: 1.0 + Content-Type: text/plain; charset=UTF-8 + Content-Transfer-Encoding: 8bit + + OpenBSD-Commit-ID: d37bc8786317a11649c62ff5e2936441186ef7a0 + +commit d410e17d186552d0717f18217d0d049486754365 +Author: djm@openbsd.org +Date: Wed Feb 21 06:05:06 2024 +0000 + + upstream: .Cm for a keyword. Part of GHPR#454 from Niklas Hambüchen + + OpenBSD-Commit-ID: d59c52559f926fa82859035d79749fbb4a3ce18a + +commit ab73f9678ebf06b32d6361b88b50b42775e0565b +Author: djm@openbsd.org +Date: Wed Feb 21 06:01:13 2024 +0000 + + upstream: fix typo in match directive predicate (s/tagged/tag) GHPR#462 + + from Tobias Manske + + OpenBSD-Commit-ID: 05b23b772677d48aa82eefd7ebebd369ae758908 + +commit 9844aa2521ccfb1a2d73745680327b79e0574445 +Author: djm@openbsd.org +Date: Wed Feb 21 05:57:34 2024 +0000 + + upstream: fix proxy multiplexing mode, broken when keystroke timing + + obfuscation was added. GHPR#463 from montag451 + + OpenBSD-Commit-ID: 4e412d59b3f557d431f1d81c715a3bc0491cc677 + +commit ee6d932acb532f80b11bb7cf161668c70ec8a117 +Author: djm@openbsd.org +Date: Tue Feb 20 04:10:03 2024 +0000 + + upstream: don't append a gratuitous space to the end of subsystem + + arguments; bz3667 + + OpenBSD-Commit-ID: e11023aeb3f30b77a674e37b8292c862926d5dc6 + +commit e27f032aa8fcbae9b2e7c451baaf4b8ac6fa3d45 +Author: dtucker@openbsd.org +Date: Mon Feb 19 09:25:52 2024 +0000 + + upstream: Always define puttysetup function. + + OpenBSD-Regress-ID: b4c0ccfa4006a1bc5dfd99ccf21c854d3ce2aee0 + +commit 84046f9991abef5f46b040b10cf3d494f933a17b +Author: dtucker@openbsd.org +Date: Fri Feb 9 08:56:59 2024 +0000 + + upstream: Exapnd PuTTY test coverage. + + Expand the set of ciphers, MACs and KEX methods in the PuTTY interop + tests. + + OpenBSD-Regress-ID: dd28d97d48efe7329a396d0d505ee2907bf7fc57 + +commit bbf541ee2afe07b08a8b56fa0dc6f38fcfceef2a +Author: dtucker@openbsd.org +Date: Fri Feb 9 08:47:42 2024 +0000 + + upstream: Factor out PuTTY setup. + + Factor out PuTTY and call only when needed. + + This allows us to avoid PuTTY key setup when it's not needed, which + speeds up the overall test run by a couple of percent. + + OpenBSD-Regress-ID: c25eaccc3c91bc874400f7c85ce40e9032358c1c + +commit d31c21c57fb4245271680a1e5043cf6470a96766 +Author: naddy@openbsd.org +Date: Sat Feb 10 11:28:52 2024 +0000 + + upstream: clean sshd random relinking kit; ok miod@ + + OpenBSD-Commit-ID: 509bb19bb9762a4b3b589af98bac2e730541b6d4 + +commit 4dbc5a363ff53a2fcecf6bc3bcc038badc12f118 +Author: djm@openbsd.org +Date: Fri Feb 2 00:13:34 2024 +0000 + + upstream: whitespace + + OpenBSD-Commit-ID: b24680bc755b621ea801ff8edf6f0f02b68edae1 + +commit efde85dda2130272af24cc346f6c3cd326182ff1 +Author: Darren Tucker +Date: Mon Feb 19 17:29:31 2024 +1100 + + Improve error message for OpenSSL header check. + + bz#3668, ok djm@ + +commit cbbdf868bce431a59e2fa36ca244d5739429408d +Author: Darren Tucker +Date: Wed Feb 7 13:45:02 2024 +1100 + + Interop test against PuTTY snapshot and releases. + +commit 91898bf786b0f149f962c4c96c08a46f29888c10 +Author: Darren Tucker +Date: Tue Feb 6 16:21:05 2024 +1100 + + Put privsep dir on OS X on /usr/local. + + On some runners we can't create /var/empty, so put it some place we can + write. Should fix test breakage on Max OS X 11. + +commit be5ed8ebed8388c5056bfde4688308cc873c18b9 +Author: Darren Tucker +Date: Tue Feb 6 11:19:42 2024 +1100 + + Add --disable-fd-passing option. + + .. and enable for the minix3 test VM. This will cause it to more reliably + skip tests that need FD passing and should fix the current test breakage. + +commit 0f6a8a0d0a518fd78c4cbebfdac990a57a1c4e41 +Author: Darren Tucker +Date: Tue Feb 6 11:18:44 2024 +1100 + + Use "skip" function instead doing it ourselves. + +commit 3ad669f81aabbd2ba9fbd472903f680f598e1e99 +Author: Damien Miller +Date: Thu Feb 1 14:01:18 2024 +1100 + + ignore some vim droppings + +commit c283f29d23611a06bbee06bcf458f2fffad721d9 +Author: djm@openbsd.org +Date: Thu Feb 1 02:37:33 2024 +0000 + + upstream: whitespace + + OpenBSD-Commit-ID: bf9e4a1049562ee4322684fbdce07142f04fdbb7 + +commit 0d96b1506b2f4757fefa5d1f884d49e96a6fd4c3 +Author: Damien Miller +Date: Tue Jan 16 14:40:18 2024 +1100 + + skip tests that use multiplexing on Windows + + Some tests here use multiplexing, skip these if DISABLE_FD_PASSING + is set. Should unbreak tests on Windows. + +commit 50080fa42f5f744b798ee29400c0710f1b59f50e +Author: djm@openbsd.org +Date: Thu Jan 11 04:50:28 2024 +0000 + + upstream: don't disable RSA test when DSA is disabled; bug introduced + + in last commit + + OpenBSD-Regress-ID: 8780a7250bf742b33010e9336359a1c516f2d7b5 + +commit 415c94ce17288e0cdcb9e58cc91fba78d33c8457 +Author: djm@openbsd.org +Date: Thu Jan 11 01:45:58 2024 +0000 + + upstream: make DSA testing optional, defaulting to on + + ok markus + + OpenBSD-Regress-ID: dfc27b5574e3f19dc4043395594cea5f90b8572a + +commit f9311e8921d92c5efca767227a497ab63280ac39 +Author: djm@openbsd.org +Date: Thu Jan 11 01:51:16 2024 +0000 + + upstream: ensure key_fd is filled when DSA is disabled; spotted by + + tb@ + + OpenBSD-Commit-ID: 9dd417b6eec3cf67e870f147464a8d93f076dce7 + +commit 4e838120a759d187b036036610402cbda33f3203 +Author: djm@openbsd.org +Date: Thu Jan 11 01:45:36 2024 +0000 + + upstream: make DSA key support compile-time optional, defaulting to + + on + + ok markus@ + + OpenBSD-Commit-ID: 4f8e98fc1fd6de399d0921d5b31b3127a03f581d + +commit afcc9028bfc411bc26d20bba803b83f90cb84e26 +Author: jmc@openbsd.org +Date: Wed Jan 10 06:33:13 2024 +0000 + + upstream: fix incorrect capitalisation; + + OpenBSD-Commit-ID: cb07eb06e15fa2334660ac73e98f29b6a1931984 + +commit 9707c8170c0c1baeb1e06e5a53f604498193885f +Author: djm@openbsd.org +Date: Tue Jan 9 22:19:36 2024 +0000 + + upstream: extend ChannelTimeout regression test to exercise multiplexed + + connections and the new "global" timeout type. ok dtucker@ + + OpenBSD-Regress-ID: f10d19f697024e9941acad7c2057f73d6eacb8a2 + +commit b31b12d28de96e1d43581d32f34da8db27e11c03 +Author: djm@openbsd.org +Date: Tue Jan 9 22:19:00 2024 +0000 + + upstream: add a "global" ChannelTimeout type to ssh(1) and sshd(8) + + that watches all open channels and will close all open channels if there is + no traffic on any of them for the specified interval. This is in addition to + the existing per-channel timeouts added a few releases ago. + + This supports use-cases like having a session + x11 forwarding channel + open where one may be idle for an extended period but the other is + actively used. The global timeout would allow closing both channels when + both have been idle for too long. + + ok dtucker@ + + OpenBSD-Commit-ID: 0054157d24d2eaa5dc1a9a9859afefc13d1d7eb3 + +commit 602f4beeeda5bb0eca181f8753d923a2997d0a51 +Author: djm@openbsd.org +Date: Tue Jan 9 21:39:14 2024 +0000 + + upstream: adapt ssh_api.c code for kex-strict + + from markus@ ok me + + OpenBSD-Commit-ID: 4d9f256852af2a5b882b12cae9447f8f00f933ac + +commit 42ba34aba8708cf96583ff52975d95a8b47d990d +Author: Damien Miller +Date: Mon Jan 8 16:26:37 2024 +1100 + + nite that recent OSX tun/tap is unsupported + +commit 690bc125f9a3b20e47745fa8f5b5e1fd5820247f +Author: Sevan Janiyan +Date: Wed Dec 27 04:57:49 2023 +0000 + + README.platform: update tuntap url + +commit 6b8be2ccd7dd091808f86af52066b0c2ec30483a +Author: Rose <83477269+AtariDreams@users.noreply.github.com> +Date: Tue Dec 19 11:48:20 2023 -0500 + + Fix compilation error in ssh-pcks11-client.c + + Compilation fails becaus of an undefined reference to helper_by_ec, + because we forgot the preprocessor conditional that excludes that function + from being called in unsupported configurations. + +commit 219c8134157744886ee6ac5b8c1650abcd981f4c +Author: djm@openbsd.org +Date: Mon Jan 8 05:11:18 2024 +0000 + + upstream: Remove outdated note from PROTOCOL.mux + + Port forward close by control master is already implemented + by `mux_master_process_close_fwd` in `mux.c` + + GHPR442 from bigb4ng + + OpenBSD-Commit-ID: ad0734fe5916d2dc7dd02b588906cea4df0482fb + +commit 4c3cf362631ccc4ffd422e572f075d5d594feace +Author: djm@openbsd.org +Date: Mon Jan 8 05:05:15 2024 +0000 + + upstream: fix missing field in users-groups-by-id@openssh.com reply + + documentation + + GHPR441 from TJ Saunders + + OpenBSD-Commit-ID: ff5733ff6ef4cd24e0758ebeed557aa91184c674 + +commit f64cede2a3c298b50a2659a8b53eb3ab2c0b8d23 +Author: djm@openbsd.org +Date: Mon Jan 8 04:10:03 2024 +0000 + + upstream: make kex-strict section more explicit about its intent: + + banning all messages not strictly required in KEX + + OpenBSD-Commit-ID: fc33a2d7f3b7013a7fb7500bdbaa8254ebc88116 + +commit 698fe6fd61cbcb8e3e0e874a561d4335a49fbde5 +Author: Damien Miller +Date: Mon Jan 8 14:46:19 2024 +1100 + + update fuzzer example makefile to clang16 + +commit fc332cb2d602c60983a8ec9f89412754ace06425 +Author: Damien Miller +Date: Mon Jan 8 14:45:49 2024 +1100 + + unbreak fuzzers - missing pkcs11_make_cert() + + provide stub for use in fuzzer harness + +commit 9ea0a4524ae3276546248a926b6641b2fbc8421b +Author: Damien Miller +Date: Mon Jan 8 14:45:14 2024 +1100 + + unbreak fuzzers for clang16 + + getopt() needs a throw() attribute to compile, so supply one when compiling + things with C++ + +commit a72833d00788ef91100c643536ac08ada46440e1 +Author: djm@openbsd.org +Date: Mon Jan 8 00:34:33 2024 +0000 + + upstream: remove ext-info-* in the kex.c code, not in callers; + + with/ok markus@ + + OpenBSD-Commit-ID: c06fe2d3a0605c517ff7d65e38ec7b2d1b0b2799 + +commit 86f9e96d9bcfd1f5cd4bf8fb57a9b4c242df67df +Author: djm@openbsd.org +Date: Mon Jan 8 00:30:39 2024 +0000 + + upstream: fix typo; spotted by Albert Chin + + OpenBSD-Commit-ID: 77140b520a43375b886e535eb8bd842a268f9368 + +commit f0cbd26ec91bd49719fb3eea7ca44d2380318b9a +Author: dtucker@openbsd.org +Date: Thu Jan 4 09:51:49 2024 +0000 + + upstream: Import regenerated moduli. + + OpenBSD-Commit-ID: 5a636f6ca7f25bfe775df4952f7aac90a7fcbbee + +commit 64ddf776531ca4933832beecc8b7ebe1b937e081 +Author: jsg@openbsd.org +Date: Wed Dec 20 00:06:25 2023 +0000 + + upstream: spelling; ok markus@ + + OpenBSD-Commit-ID: 9d01f2e9d59a999d5d42fc3b3efcf8dfb892e31b + +commit 503fbe9ea238a4637e8778208bde8c09bcf78475 +Author: jmc@openbsd.org +Date: Tue Dec 19 06:57:34 2023 +0000 + + upstream: sort -C, and add to usage(); ok djm + + OpenBSD-Commit-ID: 80141b2a5d60c8593e3c65ca3c53c431262c812f + +commit 5413b1c7ff5a19c6a7d44bd98c5a83eb47819ba6 +Author: djm@openbsd.org +Date: Tue Dec 19 06:41:14 2023 +0000 + + upstream: correct section numbers; from Ed Maste + + OpenBSD-Commit-ID: e289576ee5651528404cb2fb68945556052cf83f + +commit 430ef864645cff83a4022f5b050174c840e275da +Author: djm@openbsd.org +Date: Mon Dec 18 15:58:56 2023 +0000 + + upstream: match flag type (s/int/u_int) + + OpenBSD-Commit-ID: 9422289747c35ccb7b31d0e1888ccd5e74ad566a + +commit 1036d77b34a5fa15e56f516b81b9928006848cbd +Author: Damien Miller +Date: Fri Dec 22 17:56:26 2023 +1100 + + better detection of broken -fzero-call-used-regs + + gcc 13.2.0 on ppc64le refuses to compile some function, including + cipher.c:compression_alg_list() with an error: + + > sorry, unimplemented: argument ‘used’ is not supportedcw + > for ‘-fzero-call-used-regs’ on this target + + This extends the autoconf will-it-work test with a similarly- + structured function that seems to catch this. + + Spotted/tested by Colin Watson; bz3645 + +commit 8241b9c0529228b4b86d88b1a6076fb9f97e4a99 +Author: Damien Miller +Date: Tue Dec 19 01:59:50 2023 +1100 + + crank versions + +commit 2f2c65cb5f1518a9c556d3e8efa27ea0ca305c6b +Author: Damien Miller +Date: Tue Dec 19 01:59:06 2023 +1100 + + depend + +commit e48cdee8e19059203b1aeeabec2350b8375fa61f +Author: djm@openbsd.org +Date: Mon Dec 18 14:50:08 2023 +0000 + + upstream: regress test for agent PKCS#11-backed certificates + + OpenBSD-Regress-ID: 38f681777cb944a8cc3bf9d0ad62959a16764df9 + +commit 2f512f862df1d5f456f82a0334c9e8cc7208a2a1 +Author: djm@openbsd.org +Date: Mon Dec 18 14:49:39 2023 +0000 + + upstream: regress test for constrained PKCS#11 keys + + OpenBSD-Regress-ID: b2f26ae95d609d12257b43aef7cd7714c82618ff + +commit cdddd66412ca5920ed4d3ebbfa6ace12dbd9b82f +Author: djm@openbsd.org +Date: Mon Dec 18 14:48:44 2023 +0000 + + upstream: openssh-9.6 + + OpenBSD-Commit-ID: 21759837cf0e0092d9a2079f8fb562071c11016b + +commit 6d51feab157cedf1e7ef5b3f8781ca8ff9c4ab1b +Author: djm@openbsd.org +Date: Mon Dec 18 14:48:08 2023 +0000 + + upstream: ssh-agent: record failed session-bind attempts + + Record failed attempts to session-bind a connection and refuse signing + operations on that connection henceforth. + + Prevents a future situation where we add a new hostkey type that is not + recognised by an older ssh-agent, that consequently causes session-bind + to fail (this situation is only likely to arise when people mix ssh(1) + and ssh-agent(1) of different versions on the same host). Previously, + after such a failure the agent socket would be considered unbound and + not subject to restriction. + + Spotted by Jann Horn + + OpenBSD-Commit-ID: b0fdd023e920aa4831413f640de4c5307b53552e + +commit 7ef3787c84b6b524501211b11a26c742f829af1a +Author: djm@openbsd.org +Date: Mon Dec 18 14:47:44 2023 +0000 + + upstream: ban user/hostnames with most shell metacharacters + + This makes ssh(1) refuse user or host names provided on the + commandline that contain most shell metacharacters. + + Some programs that invoke ssh(1) using untrusted data do not filter + metacharacters in arguments they supply. This could create + interactions with user-specified ProxyCommand and other directives + that allow shell injection attacks to occur. + + It's a mistake to invoke ssh(1) with arbitrary untrusted arguments, + but getting this stuff right can be tricky, so this should prevent + most obvious ways of creating risky situations. It however is not + and cannot be perfect: ssh(1) has no practical way of interpreting + what shell quoting rules are in use and how they interact with the + user's specified ProxyCommand. + + To allow configurations that use strange user or hostnames to + continue to work, this strictness is applied only to names coming + from the commandline. Names specified using User or Hostname + directives in ssh_config(5) are not affected. + + feedback/ok millert@ markus@ dtucker@ deraadt@ + + OpenBSD-Commit-ID: 3b487348b5964f3e77b6b4d3da4c3b439e94b2d9 + +commit 0cb50eefdd29f0fec31d0e71cc4b004a5f704e67 +Author: djm@openbsd.org +Date: Mon Dec 18 14:47:20 2023 +0000 + + upstream: stricter handling of channel window limits + + This makes ssh/sshd more strict in handling non-compliant peers that + send more data than the advertised channel window allows. Previously + the additional data would be silently discarded. This change will + cause ssh/sshd to terminate the connection if the channel window is + exceeded by more than a small grace allowance. + + ok markus@ + + OpenBSD-Commit-ID: 811e21b41831eba3dd7f67b3d409a438f20d3037 + +commit 4448a2938abc76e6bd33ba09b2ec17a216dfb491 +Author: djm@openbsd.org +Date: Mon Dec 18 14:46:56 2023 +0000 + + upstream: Make it possible to load certs from PKCS#11 tokens + + Adds a protocol extension to allow grafting certificates supplied by + ssh-add to keys loaded from PKCS#11 tokens in the agent. + + feedback/ok markus@ + + OpenBSD-Commit-ID: bb5433cd28ede2bc910996eb3c0b53e20f86037f + +commit 881d9c6af9da4257c69c327c4e2f1508b2fa754b +Author: djm@openbsd.org +Date: Mon Dec 18 14:46:12 2023 +0000 + + upstream: apply destination constraints to all p11 keys + + Previously applied only to the first key returned from each token. + + ok markus@ + + OpenBSD-Commit-ID: 36df3afb8eb94eec6b2541f063d0d164ef8b488d + +commit a7ed931caeb68947d30af8a795f4108b6efad761 +Author: djm@openbsd.org +Date: Mon Dec 18 14:45:49 2023 +0000 + + upstream: add "ext-info-in-auth@openssh.com" extension + + This adds another transport protocol extension to allow a sshd to send + SSH2_MSG_EXT_INFO during user authentication, after the server has + learned the username that is being logged in to. + + This lets sshd to update the acceptable signature algoritms for public + key authentication, and allows these to be varied via sshd_config(5) + "Match" directives, which are evaluated after the server learns the + username being authenticated. + + Full details in the PROTOCOL file + + OpenBSD-Commit-ID: 1de7da7f2b6c32a46043d75fcd49b0cbb7db7779 + +commit 1edb00c58f8a6875fad6a497aa2bacf37f9e6cd5 +Author: djm@openbsd.org +Date: Mon Dec 18 14:45:17 2023 +0000 + + upstream: implement "strict key exchange" in ssh and sshd + + This adds a protocol extension to improve the integrity of the SSH + transport protocol, particular in and around the initial key exchange + (KEX) phase. + + Full details of the extension are in the PROTOCOL file. + + with markus@ + + OpenBSD-Commit-ID: 2a66ac962f0a630d7945fee54004ed9e9c439f14 + +commit 59d691b886c79e70b1d1c4ab744e81fd176222fd +Author: Damien Miller +Date: Mon Dec 18 14:49:11 2023 +1100 + + better detection of broken -fzero-call-used-regs + + Use OSSH_CHECK_CFLAG_LINK() for detection of these flags and extend + test program to exercise varargs, which seems to catch more stuff. + + ok dtucker@ + +commit aa7b21708511a6d4aed3839fc9f6e82e849dd4a1 +Author: djm@openbsd.org +Date: Wed Dec 13 03:28:19 2023 +0000 + + upstream: when invoking KnownHostsCommand to determine the order of + + host key algorithms to request, ensure that the hostname passed to the + command is decorated with the port number for ports other than 22. + + This matches the behaviour of KnownHostsCommand when invoked to look + up the actual host key. + + bz3643, ok dtucker@ + + OpenBSD-Commit-ID: 5cfabc0b7c6c7ab473666df314f377b1f15420b1 + +commit 4086bd6652c0badccc020218a62190a7798fb72c +Author: markus@openbsd.org +Date: Fri Dec 8 09:18:39 2023 +0000 + + upstream: prevent leak in sshsig_match_principals; ok djm@ + + OpenBSD-Commit-ID: 594f61ad4819ff5c72dfe99ba666a17f0e1030ae + +commit 19d3ee2f3adf7d9a606ff015c1e153744702c4c9 +Author: djm@openbsd.org +Date: Wed Dec 6 21:06:48 2023 +0000 + + upstream: short circuit debug log processing early if we're not going + + to log anything. From Kobe Housen + + OpenBSD-Commit-ID: 2bcddd695872a1bef137cfff7823044dcded90ea + +commit 947affad4831df015c498c00c6351ea6f13895d5 +Author: Darren Tucker +Date: Mon Nov 27 09:37:28 2023 +1100 + + Add tests for OpenSSL 3.2.0 and 3.2 stable branch. + +commit 747dce36206675ca6b885010a835733df469351b +Author: Darren Tucker +Date: Sat Nov 25 09:03:38 2023 +1100 + + Use non-zero arg in compiler test program. + + Now that we're running the test program, passing zero to the test function + can cause divide-by-zero exceptions which might show up in logs. + +commit 3d44a5c56585d1c351dbc006240a591b6da502b1 +Author: dtucker@openbsd.org +Date: Fri Nov 24 00:31:30 2023 +0000 + + upstream: Plug mem leak of msg when processing a quit message. + + Coverity CID#427852, ok djm@ + + OpenBSD-Commit-ID: bf85362addbe2134c3d8c4b80f16601fbff823b7 + +commit 1d7f9b6e297877bd00973e6dc5c0642dbefc3b5f +Author: dtucker@openbsd.org +Date: Thu Nov 23 03:37:05 2023 +0000 + + upstream: Include existing mux path in debug message. + + OpenBSD-Commit-ID: 1c3641be10c2f4fbad2a1b088a441d072e18bf16 + +commit f29934066bd0e561a2e516b7e584fb92d2eedee0 +Author: Darren Tucker +Date: Thu Nov 23 19:41:27 2023 +1100 + + Add an Ubuntu 22.04 test VM. + + This is the same version as Github's runners so most of the testing on + it is over there, but having a local VM makes debugging much easier. + +commit a93284a780cd3972afe5f89086b75d564ba157f3 +Author: Darren Tucker +Date: Thu Nov 23 19:36:22 2023 +1100 + + Add gcc-12 -Werror test on Ubuntu 22.04. + + Explictly specify gcc-11 on Ubuntu 22.04 (it's the system compiler). + +commit 670f5a647e98b6fd95ad64f789f87ee3274b481b +Author: Darren Tucker +Date: Thu Nov 23 19:34:57 2023 +1100 + + Check return value from write to prevent warning. + + ... and since we're testing for flags with -Werror, this caused + configure to mis-detect compiler flags. + +commit cea007d691cfedfa07a5b8599f97ce0511f53fc9 +Author: Darren Tucker +Date: Wed Nov 22 21:18:55 2023 +1100 + + Run compiler test program when compiling natively. + + ok djm@ + +commit ee0d305828f13536c0a416bbf9c3e81039d9ea55 +Author: Darren Tucker +Date: Wed Nov 22 21:18:07 2023 +1100 + + Factor out compiler test program into a macro. + + ok djm@ + +commit de304c76316b029df460673725a9104224b9959b +Author: Darren Tucker +Date: Wed Nov 22 08:55:36 2023 +1100 + + Add fbsd14 VM to test pool. + +commit 99a2df5e1994cdcb44ba2187b5f34d0e9190be91 +Author: Darren Tucker +Date: Tue Nov 21 16:19:29 2023 +1100 + + Expand -fzero-call-used-regs test to cover gcc 11. + + It turns out that gcc also has some problems with -fzero-call-used-regs, + at least v11 on mips. Previously the test in OSSH_CHECK_CFLAG_COMPILE + was sufficient to catch it with "=all", but not sufficient for "=used". + Expand the testcase and include it in the other tests for good measure. + See bz#3629. ok djm@. + +commit ff220d4010717f7bfbbc02a2400666fb9d24f250 +Author: Darren Tucker +Date: Tue Nov 21 14:04:34 2023 +1100 + + Stop using -fzero-call-used-regs=all + + ... since it seems to be problematic with several different versions of + clang. Only use -fzero-call-used-regs=used which is less + problematic, except with Apple's clang where we don't use it at all. + bz#3629, ok djm@ + +commit 2a19e02f36b16f0f6cc915f7d1e60ead5e36303b +Author: Darren Tucker +Date: Tue Nov 21 14:02:18 2023 +1100 + + Allow for vendor prefix on clang version numbers. + + Correctly detects the version of OpenBSD's native clang, as well as + Apple's. Spotted tb@, ok djm@. + +commit c52db0114826d73eff6cdbf205e9c1fa4f7ca6c6 +Author: djm@openbsd.org +Date: Mon Nov 20 02:50:00 2023 +0000 + + upstream: set errno=EAFNOSUPPORT when filtering addresses that don't + + match AddressFamily; yields slightly better error message if no address + matches. bz#3526 + + OpenBSD-Commit-ID: 29cea900ddd8b04a4d1968da5c4a893be2ebd9e6 + +commit 26f3f3bbc69196d908cad6558c8c7dc5beb8d74a +Author: djm@openbsd.org +Date: Wed Nov 15 23:03:38 2023 +0000 + + upstream: when connecting via socket (the default case), filter + + addresses by AddressFamily if one was specified. Fixes the case where, if + CanonicalizeHostname is enabled, ssh may ignore AddressFamily. bz5326; ok + dtucker + + OpenBSD-Commit-ID: 6c7d7751f6cd055126b2b268a7b64dcafa447439 + +commit 050c335c8da43741ed0df2570ebfbd5d1dfd0a31 +Author: djm@openbsd.org +Date: Wed Nov 15 22:51:49 2023 +0000 + + upstream: when deciding whether to enable keystroke timing + + obfuscation, only consider enabling it when a channel with a tty is open. + + Avoids turning on the obfucation when X11 forwarding only is in use, + which slows it right down. Reported by Roger Marsh + + OpenBSD-Commit-ID: c292f738db410f729190f92de100c39ec931a4f1 + +commit 676377ce67807a24e08a54cd60ec832946cc6cae +Author: tobhe@openbsd.org +Date: Mon Nov 13 09:18:19 2023 +0000 + + upstream: Make sure sftp_get_limits() only returns 0 if 'limits' + + was initialized. This fixes a potential uninitialized use of 'limits' in + sftp_init() if sftp_get_limits() returned early because of an unexpected + message type. + + ok djm@ + + OpenBSD-Commit-ID: 1c177d7c3becc1d71bc8763eecf61873a1d3884c + +commit 64e0600f23c6dec36c3875392ac95b8a9100c2d6 +Author: Darren Tucker +Date: Mon Nov 13 20:03:31 2023 +1100 + + Test current releases of LibreSSL and OpenSSL. + + Retire some of the older releases. + +commit c8ed7cc545879ac15f6ce428be4b29c35598bb2a +Author: dtucker@openbsd.org +Date: Wed Nov 1 02:08:38 2023 +0000 + + upstream: Specify ssh binary to use + + ... instead of relying on installed one. Fixes test failures in -portable + when running tests prior to installation. + + OpenBSD-Regress-ID: b6d6ba71c23209c616efc805a60d9a445d53a685 + +commit e9fc2c48121cada1b4dcc5dadea5d447fe0093c3 +Author: Darren Tucker +Date: Wed Nov 1 13:11:31 2023 +1100 + + Put long-running test targets on hipri runners. + + Some of the selfhosted test targets take a long time to run for various + reasons, so label them for "libvirt-hipri" runners so that they can + start immediately. This should reduce the time to complete all tests. + +commit 7ddf27668f0e21233f08c0ab2fe9ee3fdd6ab1e2 +Author: djm@openbsd.org +Date: Wed Nov 1 00:29:46 2023 +0000 + + upstream: add some tests of forced commands overriding Subsystem + + directives + + OpenBSD-Regress-ID: eb48610282f6371672bdf2a8b5d2aa33cfbd322b + +commit fb06f9b5a065dfbbef5916fc4accc03c0bf026dd +Author: dtucker@openbsd.org +Date: Tue Oct 31 04:15:40 2023 +0000 + + upstream: Don't try to use sudo inside sshd log wrapper. + + We still need to check if we're using sudo since we don't want to chown + unecessarily, as on some platforms this causes an error which pollutes + stderr. We also don't want to unnecessarily invoke sudo, since it's + running in the context of the proxycommand, on *other* platforms it + may not be able to authenticate, and if we're using SUDO then it should + already be privileged. + + OpenBSD-Regress-ID: 70d58df7503db699de579a9479300e5f3735f4ee + +commit fc3cc33e88c242c704781c6c48087838f1dcfa2a +Author: dtucker@openbsd.org +Date: Tue Oct 31 02:58:45 2023 +0000 + + upstream: Only try to chmod logfile if we have sudo. If we don't have + + sudo then we won't need to chmod. + + OpenBSD-Regress-ID: dbad2f5ece839658ef8af3376cb1fb1cabe2e324 + +commit 3a506598fddd3f18f9095af3fe917f24cbdd32e0 +Author: djm@openbsd.org +Date: Mon Oct 30 23:00:25 2023 +0000 + + upstream: move PKCS#11 setup code to test-exec.sh so it can be reused + + elsewhere + + OpenBSD-Regress-ID: 1d29e6be40f994419795d9e660a8d07f538f0acb + +commit f82fa227a52661c37404a6d33bbabf14fed05db0 +Author: djm@openbsd.org +Date: Mon Oct 30 17:32:00 2023 +0000 + + upstream: tidy and refactor PKCS#11 setup code + + Replace the use of a perl script to delete the controlling TTY with a + SSH_ASKPASS script to directly load the PIN. + + Move PKCS#11 setup code to functions in anticipation of it being used + elsewhere in additional tests. + + Reduce stdout spam + + OpenBSD-Regress-ID: 07705c31de30bab9601a95daf1ee6bef821dd262 + +commit 3cf698c6d4ffa9be1da55672a3519e2135a6366a +Author: Darren Tucker +Date: Mon Oct 30 21:35:03 2023 +1100 + + Add obsd74 test VM and retire obsd69 and obsd70. + +commit 3e21d58a09894acb38dc69ed615d101131f473d0 +Author: Darren Tucker +Date: Mon Oct 30 18:34:12 2023 +1100 + + Add OpenSSL 3.3.0 as a known dev version. + +commit 917ba181c2cbdb250a443589ec732aa36fd51ffa +Author: Darren Tucker +Date: Mon Oct 30 13:32:03 2023 +1100 + + Restore nopasswd sudo rule on Mac OS X. + + This seems to be missing from some (but not all) github runners, so + restore it if it seems to be missing. + +commit c5698abad6d4ec98ca20bcaaabaeacd5e1ec3f4f +Author: Darren Tucker +Date: Mon Oct 30 13:26:52 2023 +1100 + + Don't exit early when setting up on Mac OS X. + + We probably need some of the other bits in there (specifically, setting + the perms on the home directory) so make it less of a special snowflake. + +commit 1d6a878ceba60b9dc14037dddc8f036070c0065f +Author: dtucker@openbsd.org +Date: Sun Oct 29 06:22:07 2023 +0000 + + upstream: Only try to chown logfiles that exist to prevent spurious + + errors. + + OpenBSD-Regress-ID: f1b20a476734e885078c481f1324c9ea03af991e + +commit e612376427a66f835e284f6b426d16d7c85301bc +Author: anton@openbsd.org +Date: Thu Oct 26 18:52:45 2023 +0000 + + upstream: make use of bsd.regress.mk in extra and interop targets; ok + + dtucker@ + + OpenBSD-Regress-ID: 7ea21b5f6fc4506165093b2123d88d20ff13a4f0 + +commit ea0039173957d0edcd6469b9614dcedb44dcb4f9 +Author: dtucker@openbsd.org +Date: Thu Oct 26 12:44:07 2023 +0000 + + upstream: Skip conch interop tests when not enabled instead of fatal. + + OpenBSD-Regress-ID: b0abf81c24ac6c21f367233663228ba16fa96a46 + +commit d220b9ed5494252b26b95f05be118472bc3ab5c0 +Author: dtucker@openbsd.org +Date: Wed Oct 25 05:38:08 2023 +0000 + + upstream: Import regenerated moduli. + + OpenBSD-Commit-ID: 95f5dd6107e8902b87dc5b005ef2b53f1ff378b8 + +commit a611e4db4009447a0151f31a44e235ca32ed4429 +Author: anton@openbsd.org +Date: Wed Oct 25 08:01:59 2023 +0000 + + upstream: ssh conch interop tests requires a controlling terminal; + + ok dtucker@ + + OpenBSD-Regress-ID: cbf2701bc347c2f19d907f113779c666f1ecae4a + +commit da951b5e08c167acb5d6e2eec6f146502f5d6ed8 +Author: anton@openbsd.org +Date: Mon Oct 23 11:30:49 2023 +0000 + + upstream: Use private key that is allowed by sshd defaults in conch + + interop tests. + + ok dtucker@ + + OpenBSD-Regress-ID: 3b7f65c8f409c328bcd4b704f60cb3d31746f045 + +commit 1ca166dbb3c0ce632b98869cd955f69320aa6fe8 +Author: Darren Tucker +Date: Fri Oct 20 20:43:00 2023 +1100 + + Install Dropbear for interop testing. + +commit f993bb58351c5cb71e61aede63805a34a6d4daea +Author: Darren Tucker +Date: Fri Oct 20 20:39:03 2023 +1100 + + Resync PuTTY and Conch path handling with upstream. + + Now that configure finds these for us we can remove these -portable + specific changes. + +commit ff85becd5f5f06a76efa45d30fb204a3c5e5215c +Author: Darren Tucker +Date: Fri Oct 20 20:35:46 2023 +1100 + + Have configure find PuTTY and Conch binaries. + + This will let us remove some -portable specific changes from + test-exec.sh. + +commit c54a50359b9cecddbf3ffcdc26efcb3cd6071ec1 +Author: dtucker@openbsd.org +Date: Fri Oct 20 07:37:07 2023 +0000 + + upstream: Allow overriding the locations of the Dropbear binaries + + similar to what we do for the PuTTY ones. + + OpenBSD-Regress-ID: 7de0e00518fb0c8fdc5f243b7f82f523c936049c + +commit fbaa707d455a61d0aef8ae65e02a25bac5351e5c +Author: dtucker@openbsd.org +Date: Fri Oct 20 06:56:45 2023 +0000 + + upstream: Add interop test with Dropbear. + + Right now this is only dbclient not the Dropbear server since it won't + currently run as a ProxyCommand. + + OpenBSD-Regress-ID: 8cb898c414fcdb252ca6328896b0687acdaee496 + +commit c2003d0dbdcdb61ca336c3f90c5c2b4a09c8e73f +Author: Fabio Pedretti +Date: Mon Oct 16 11:59:53 2023 +0200 + + Update openssl-devel dependency in RPM spec. + + Since openssh 9.4p1, openssl >= 1.1.1 is required, so + build with --without-openssl elsewhere. + According to https://repology.org/project/openssl/versions + openssl 1.1.1 is available on fedora >= 29 and rhel >= 8. + Successfully build tested, installed and run on rhel 6 + +commit 064e09cd632721c7e6889904e07767443ee23821 +Author: Fabio Pedretti +Date: Mon Oct 16 10:13:06 2023 +0200 + + Remove reference of dropped sshd.pam.old file + + The file was removed in openssh 8.8 + +commit 62db354b696b378a164b6e478cb6b0171dcb0c3d +Author: dtucker@openbsd.org +Date: Mon Oct 16 08:40:00 2023 +0000 + + upstream: Move declaration of "len" into the block where it's used. + + This lets us compile Portable with -Werror with when OpenSSL doesn't have + Ed25519 support. + + OpenBSD-Commit-ID: e02e4b4af351946562a7caee905da60eff16ba29 + +commit 6eee8c972d5901d10e80634a006b4e346b2c8c19 +Author: Damien Miller +Date: Fri Oct 13 15:15:05 2023 +1100 + + run t-extra regress tests + + This exposes the t-extra regress tests (including agent-pkcs11.sh) as + a new extra-tests target in the top level Makefile and runs them by + default. ok dtucker@ + +commit 637624dbbac13f2bc3c8ec5b15c9d627d07f2935 +Author: Darren Tucker +Date: Thu Oct 12 22:01:23 2023 +1100 + + Don't use make -j2. + + While we have 2 cores available on github runners, not using it means + that the most recent log message is the actual failure, rather than + having to search back through the log for it. + +commit 971e0cfcfd52ef1d73cf5244074c306a60006e89 +Author: Darren Tucker +Date: Thu Oct 12 16:23:05 2023 +1100 + + Correct arg order for ED255519 AC_LINK_IFELSE test. + +commit c616e64688b2a0c1b4daad69b056099be998d121 +Author: djm@openbsd.org +Date: Thu Oct 12 03:51:08 2023 +0000 + + upstream: typos and extra debug trace calls + + OpenBSD-Regress-ID: 98a2a6b9333743274359e3c0f0e65cf919a591d1 + +commit c49a3fbf10162128c67c59562348de2041188974 +Author: djm@openbsd.org +Date: Thu Oct 12 03:48:53 2023 +0000 + + upstream: ensure logs are owned by correct user; feedback/ok + + dtucker@ + + OpenBSD-Regress-ID: c3297af8f07717f1d400a5d34529962f1a76b5a3 + +commit 5ec0ed79ac074c3437b25f6cba8b8cf21c8d4587 +Author: djm@openbsd.org +Date: Thu Oct 12 03:36:32 2023 +0000 + + upstream: 64 %-expansion keys ought to be enough for anybody; ok + + dtucker (we just hit the previous limit in some cases) + + OpenBSD-Commit-ID: 84070f8001ec22ff5d669f836b62f206e08c5787 + +commit f59a94e22e46db2c23eddeb871aa9e8d93ab0016 +Author: djm@openbsd.org +Date: Thu Oct 12 02:48:43 2023 +0000 + + upstream: don't dereference NULL pointer when hashing jumphost + + OpenBSD-Commit-ID: 251c0263e1759a921341c7efe7f1d4c73e1c70f4 + +commit 281c79168edcc303abfd5bca983616eaa24c5f32 +Author: Damien Miller +Date: Thu Oct 12 13:20:01 2023 +1100 + + Solaris: prefer PRIV_XPOLICY to PRIV_LIMIT + + If the system support PRIV_XPOLICY and one is set, then don't + modify PRIV_LIMIT. bz2833, patch from Ron Jordan, ok dtucker@ + +commit 98fc34df837f3a3b79d2a111b96fe8a39adcab55 +Author: djm@openbsd.org +Date: Thu Oct 12 02:18:18 2023 +0000 + + upstream: add %j token that expands to the configured ProxyJump + + hostname (or the empty string if this option is not being used). bz3610, ok + dtucker + + OpenBSD-Commit-ID: ce9983f7efe6a178db90dc5c1698df025df5e339 + +commit 7f3180be8a85320b5d3221714b40c16e66881249 +Author: djm@openbsd.org +Date: Thu Oct 12 02:15:53 2023 +0000 + + upstream: release GSS OIDs only at end of authentication; bz2982, + + ok dtucker@ + + OpenBSD-Commit-ID: 0daa41e0525ae63cae4483519ecaa37ac485d94c + +commit a612b93de5d86e955bfb6e24278f621118eea500 +Author: djm@openbsd.org +Date: Thu Oct 12 02:12:53 2023 +0000 + + upstream: mask SIGINT/TERM/QUIT/HUP before checking quit_pending + + and use ppoll() to unmask them in the mainloop. Avoids race condition between + signaling ssh to exit and polling. bz3531; ok dtucker + + OpenBSD-Commit-ID: 5c14e1aabcddedb95cdf972283d9c0d5083229e7 + +commit 531b27a006116fe7aff325510aaa576f24844452 +Author: djm@openbsd.org +Date: Wed Oct 11 23:23:58 2023 +0000 + + upstream: sync usage() with ssh.1; spotted by kn@ + + OpenBSD-Commit-ID: 191a85639477dcb5fa1616d270d93b7c8d5c1dfd + +commit 64f7ca881b19be754425dca60d1590d306c9d1d0 +Author: djm@openbsd.org +Date: Wed Oct 11 23:14:33 2023 +0000 + + upstream: ssh -Q does not make sense with other command-line options, + + so give it its own line in the manpage + + OpenBSD-Commit-ID: 00a747f0655c12122bbb77c2796be0013c105361 + +commit a752a6c0e1001f93696d7025f0c867f0376e2ecf +Author: djm@openbsd.org +Date: Wed Oct 11 22:42:26 2023 +0000 + + upstream: add ChannelTimeout support to the client, mirroring the + + same option in the server. ok markus@ + + OpenBSD-Commit-ID: 55630b26f390ac063980cfe7ad8c54b03284ef02 + +commit 76e91e7238cdc5662bc818e2a48d466283840d23 +Author: djm@openbsd.org +Date: Wed Oct 11 22:41:05 2023 +0000 + + upstream: add support for reading ED25519 private keys in PEM PKCS8 + + format; ok markus@ tb@ + + OpenBSD-Commit-ID: 01b85c91757e6b057e9b23b8a23f96415c3c7174 + +commit fc77c8e352c0f44125425c05265e3a00c183d78a +Author: djm@openbsd.org +Date: Wed Oct 11 06:40:54 2023 +0000 + + upstream: mention "none" is a valid argument to IdentityFile; bz3080 + + OpenBSD-Commit-ID: 1b4fb590ef731099349a7d468b77f02b240ac926 + +commit c97520d23d1fe53d30725a2af25d2dddd6f2faff +Author: djm@openbsd.org +Date: Wed Oct 11 05:42:08 2023 +0000 + + upstream: in olde rcp/scp protocol mode, when rejecting a path from the + + server as not matching the glob that the client sent, log (at debug level) + the received pathname as well as the list of possible expected paths expanded + from the glob. bz2966 + + OpenBSD-Commit-ID: 0bd8db8a595334ca86bca8f36e23fc0395315765 + +commit 208c2b719879805983398160791d6a1ef9c2c3fc +Author: djm@openbsd.org +Date: Wed Oct 11 04:46:29 2023 +0000 + + upstream: s/%.100s/%s/ in SSH- banner construction as there's no + + reason to limit its size: the version string bring included is a compile time + constant going into an allocated banner string. + + OpenBSD-Commit-ID: 0ef73304b9bf3e534c60900cd84ab699f859ebcd + +commit 0354790826b97c41bbd171a965574e159b58d83e +Author: tb@openbsd.org +Date: Tue Oct 10 06:49:54 2023 +0000 + + upstream: Garbage collect cipher_get_keyiv_len() + + This is a compat20 leftover, unused since 2017. + + ok djm + + OpenBSD-Commit-ID: 91fa5497c9dc6883064624ac27813a567883fdce + +commit 8d29ee4115001a02641386ae394992c65ed279e0 +Author: djm@openbsd.org +Date: Tue Oct 10 03:57:45 2023 +0000 + + upstream: Reserve a range of "local extension" message numbers that + + OpenSSH promises not to use (comment change only) + + OpenBSD-Commit-ID: e61795b453d4892d2c99ce1039112c4a00250e03 +commit 8725dbc5b5fcc3e326fc71189ef8dba4333362cc +Author: Damien Miller +Date: Wed Apr 9 17:02:17 2025 +1000 + + update version numbers + +commit cc7feb9458ad3b893b53dc9c7500d1affd208bde +Author: djm@openbsd.org +Date: Wed Apr 9 07:00:21 2025 +0000 + + upstream: openssh-10.0 + + OpenBSD-Commit-ID: db5b4a1f1c9e988f8f166b56dc5643606294b403 + +commit fc86875e6acb36401dfc1dfb6b628a9d1460f367 +Author: djm@openbsd.org +Date: Wed Apr 9 07:00:03 2025 +0000 + + upstream: Fix logic error in DisableForwarding option. This option + + was documented as disabling X11 and agent forwarding but it failed to do so. + Spotted by Tim Rice. + + OpenBSD-Commit-ID: fffc89195968f7eedd2fc57f0b1f1ef3193f5ed1 + +commit dd73459e351b0a2908aed90910c8ff9b0b381c6d +Author: djm@openbsd.org +Date: Wed Apr 9 01:24:40 2025 +0000 + + upstream: oops, I accidentally backed out the typo fix + + OpenBSD-Commit-ID: f485f79bf3e9ebbe1de13ac96150cf458956cfd8 + +commit 0cb945891944bada5850e85d60afa3c807cf1af6 +Author: djm@openbsd.org +Date: Wed Apr 9 01:23:47 2025 +0000 + + upstream: typo + + OpenBSD-Commit-ID: f912725c7d303720706b3ccfb2cb846d46296d13 + +commit cd4a6bd50b658d707867caa1f5aa40b35c2b6c19 +Author: Damien Miller +Date: Wed Apr 9 09:49:55 2025 +1000 + + initialise websafe_allowlist in agent fuzzer + +commit 55b7cb48af96c1102ef8ab5a73bb329cbed30945 +Author: djm@openbsd.org +Date: Tue Apr 8 23:10:46 2025 +0000 + + upstream: typo + + OpenBSD-Regress-ID: 08477b936d1d0c1e8a98aa1c0e1bdde8871894c9 + +commit 985d8cbcd3438cc36b4e709476f1783e358ddfb1 +Author: djm@openbsd.org +Date: Tue Apr 8 23:10:08 2025 +0000 + + upstream: typo + + OpenBSD-Commit-ID: 6e683e13e72bf1e43bbd3bbc6a8332d5a98bdc99 + +commit 000c3d14e94d8f7597087c457260ea9417045b65 +Author: dtucker@openbsd.org +Date: Mon Apr 7 08:12:22 2025 +0000 + + upstream: Include time.h for time(). + + Fixes warning on some platforms when building without openssl. + + OpenBSD-Commit-ID: 04ca29b8eaae1860c7adde3e770baa1866e30a54 + +commit 49b8b9bf829e08af22366530614a5e59ac341ca9 +Author: tb@openbsd.org +Date: Wed Apr 2 04:28:03 2025 +0000 + + upstream: Wrap #include in #ifdef WITH_DSA + + ok djm + + OpenBSD-Commit-ID: ed01a7c102243f84e4a317aefb431916d98aab15 + +commit f80fb819e5521e13f167edbcc3eed66e22ad0c2a +Author: Damien Miller +Date: Thu Apr 3 09:10:19 2025 +1100 + + remove all instances of -pie from LDFLAGS + + Previously only the first instance of this flag was removed. + Unbreaks build on OpenSUSE Tumbleweed. Patch from Antonio Larrosa + +commit 6c9872faa1c297a84c6d3e3b95a927be99eadbf6 +Author: djm@openbsd.org +Date: Tue Apr 1 23:23:20 2025 +0000 + + upstream: remove ability to enable DSA support. Actual code will be + + g/c'd separately. ok deraadt@ + + OpenBSD-Commit-ID: 2a032b75156c4d922e8343fa97ff6bc227f09819 + +commit 8460aaa4e1f8680f03cc5334556b9440b401f010 +Author: dtucker@openbsd.org +Date: Fri Mar 28 21:45:55 2025 +0000 + + upstream: Add TEST_SSH_SSHD_ENV to sshd lines here too. + + OpenBSD-Regress-ID: 045f2c88b42d694b404db51c5de5eca20d748ff1 + +commit 5e60f5937b9c33190b9d7614f72d85d4a9b38d3d +Author: dtucker@openbsd.org +Date: Fri Mar 28 06:04:07 2025 +0000 + + upstream: Pass "ControlMaster no" to ssh when invoked by scp & sftp. + + If you have ControlMaster auto (or yes) in your config, and the + first connection you make is via scp or sftp, then you may get a + few unexpected options applied to it (eg ForwardX11 no), since sftp + and sftp explicitly disable those for reasons. These effects will + persist beyond the initial scp or sftp command. + + This explicitly disables persistent session *creation* by scp and sftp. + It will not prevent them from using an existing session if one has + already been created. + + From Github PR#557, ok djm@ kn@ + + OpenBSD-Commit-ID: 9dad7c737466837e0150c4318920f46d844770c4 + +commit bbd36869dfb4b770cc9e6a345c04a585a0955aec +Author: dtucker@openbsd.org +Date: Fri Mar 28 05:41:15 2025 +0000 + + upstream: Set sshd environment variables during sshd test run too. + + OpenBSD-Regress-ID: 50cb325d92c390a2909662c901f6ac5d80b6f74d + +commit 98f05b1484daddef2f56b79e24540523b5016143 +Author: dtucker@openbsd.org +Date: Fri Mar 28 05:36:24 2025 +0000 + + upstream: Add TEST_SSH_SSHD_ENV variable which is added to sshd's + + environment. Will be used in Portable to tweak behaviour of tcmalloc's + debugging. + + OpenBSD-Regress-ID: 67e38c3c4517ddb72c8a3549a3325a166d7bb6d6 + +commit 8cd9ed4df0eccc825eca0c45354a37332e125e38 +Author: dtucker@openbsd.org +Date: Fri Mar 28 05:33:30 2025 +0000 + + upstream: chown log directory in addition to log files. + + OpenBSD-Regress-ID: b520d54a0bbf2c6554413c798218bda26b385ad9 + +commit e32de6bf4f3229d4838beb127de45eed1377ccc5 +Author: Darren Tucker +Date: Fri Mar 28 16:47:58 2025 +1100 + + Be explicit about environment variables for tests. + + This will make it easier to reproduce a test failure by cut-and-paste of + the corresponding line from the github log. + +commit 77a3e6ba47381547b3fe4b29223256f276fbd07e +Author: Darren Tucker +Date: Fri Mar 28 16:46:40 2025 +1100 + + Add tcmalloc flags to TEST_SSH_SSHD_ENV. + + This will get passed to sshd via test-exec.sh. + +commit a73890e340fbd6121251854b658a72d738b86c84 +Author: Darren Tucker +Date: Thu Mar 27 23:04:44 2025 +1100 + + Add PuTTY 0.81, 0.82 and 0.83 to tests. + +commit 90a28de0d49570324d1695c0b4686354ef3bcae0 +Author: Darren Tucker +Date: Thu Mar 27 22:30:40 2025 +1100 + + Include TCMALLOC_STACKTRACE_METHOD in output. + + If TCMALLOC_STACKTRACE_METHOD happens to be set, include it in the debug + output to make reproducing test cases easier. + +commit fd5a6bb6dd7657c4bd8cd0ee11d5c8ddf0d927b2 +Author: Darren Tucker +Date: Thu Mar 27 20:15:11 2025 +1100 + + Test with-linux-memlock-onfault in kitchensink. + +commit 22330711e2459c23d9736ee16e0e2ee0fcc30b9a +Author: Collin Funk +Date: Wed Mar 26 18:24:59 2025 -0700 + + Include fcntl.h so AT_FDCWD does not get redefined. + +commit 6c49e5f7dcaf886b4a702a6c003cae9dca04d3ea +Author: Daniil Tatianin +Date: Thu Feb 27 11:37:13 2025 +0300 + + Add support for locking memory on Linux + + Linux wakes up kcompactd threads in order to make more contiguous memory + available on the system, it does this by migrating live movable pages + (actively modifying live processes' page tables and constantly flooding + them with page invalidation IPIs, which can be up to millions per + second), which causes the process to become unresponsive for up to + seconds or even minutes in some severe cases. In case of sshd, we want + to always be able to connect to the system, even if it's under heavy + kcompactd load. + + Introduce an option to protect sshd and its children sessions from being + compacted by kcompactd (this works in cojunction with + compact_unevictable_allowed = 0). Note that we depend on MCL_ONFAULT + being available, which was introduced in linux 4.4. MCL_ONFAULT allows + the system to lock pages lazily, thus drastically reducing memory usage + of a locked process (without MCL_ONFAULT, every existing mapping in the + process is instantly write-faulted). + +commit fdc4853c5b1567934d43ab13282f03033cc21325 +Author: Daniil Tatianin +Date: Thu Feb 27 11:46:25 2025 +0300 + + platform: introduce a way to hook new session start + + Previously this was possible via post_fork_child, but ever since sshd + was split into multiple binaries, this is now no longer possible becase + of execv. + +commit 1b311b6b17be81577514c38e8be4f5740d7df496 +Author: dtucker@openbsd.org +Date: Wed Mar 19 06:11:15 2025 +0000 + + upstream: Prevent theoretical NULL deref in throughlocal_sftp. + + Coverity CID 405019, although at the moment it's not reachable. ok djm@ + + OpenBSD-Commit-ID: 630d46c1021b69fbb470e349976c70e9a48b7644 + +commit 96493ebd6ff48bbb802576e208794a26928569b0 +Author: Darren Tucker +Date: Wed Mar 19 17:35:10 2025 +1100 + + Fix workflow syntax again. + +commit 575c43fd4c44d376b1771c0fdaf4941021ba88c9 +Author: Darren Tucker +Date: Tue Mar 18 20:54:48 2025 +1100 + + Differentiate logfiles better. + +commit 8a1294638f3a47d46263ea574fa85c8e115ea893 +Author: Darren Tucker +Date: Tue Mar 18 20:27:46 2025 +1100 + + Fix another typo in workflow. + +commit bd9e6bbcc864b3e10c4e11f5aec1b3a5e3a89b55 +Author: Darren Tucker +Date: Tue Mar 18 18:16:12 2025 +1100 + + Fix syntax error in workflow. + +commit ce88a1bb4a2e6425752094f7a2eb4adfb0ca7971 +Author: Darren Tucker +Date: Tue Mar 18 18:13:14 2025 +1100 + + Identify each logfile while printing them. + +commit b58e429960c4791fc4e30bb7c70d1f77d538b546 +Author: djm@openbsd.org +Date: Tue Mar 18 04:53:14 2025 +0000 + + upstream: fix NULL dereference for Match conditions missing + + arguments, e.g. "Match user". Spotted by Coverity (CID 477813) + + OpenBSD-Commit-ID: 13584281cfa23b8ebc41f9d128a6b9464ae960d4 + +commit 0ce5281f017c3ad7bdcc2bbd9745119a73e0cbb8 +Author: tb@openbsd.org +Date: Fri Mar 14 09:49:49 2025 +0000 + + upstream: Fix EVP_CIPHER_CTX_ctrl() return checks + + While this API tries to translate negative return values (i.e. -1) to 0 + in BoringSSL and LibreSSL, it is still possible for it to return negative + values in prinicple. We even incorrectly document that -1 can be returned + while Boring and OpenSSL plead the Fifth. + + In OpenSSL 3 there are now code paths that explicitly return -1 and they + started shifting their return checks to <= 0 - of course they do this in + inconsistent and sometimes incorrect manner. While these paths aren't + reachable from ssh right now, who can really tell what happens in the two + hundred lines of inscrutable bloated mess this has become. + + So error check with <= 0 to ensure that we don't accidentally translate an + error to success. + + ok markus schwarze + + OpenBSD-Commit-ID: a855c833cf4ecfce43bedc761f26ad924f70483c + +commit 2e81100763d5885e500f065b04c16ed87ce74318 +Author: Darren Tucker +Date: Mon Mar 17 21:35:55 2025 +1100 + + Fix debug log path. + +commit 442a44970179d70ebb62bba792699eaec978a1db +Author: Darren Tucker +Date: Fri Mar 14 16:24:06 2025 +1100 + + Also lazily unmount workspace in case of straggers. + +commit 20427f6735fe5ddab31911ce5315adc71acf47d8 +Author: Darren Tucker +Date: Fri Mar 14 16:17:39 2025 +1100 + + Make sure upstream tests run on correct hardware. + +commit 91a2f70a56827ae31649baf17227b0914ac5aa36 +Author: Darren Tucker +Date: Fri Mar 14 13:47:27 2025 +1100 + + Add OpenBSD upstream test on obsdsnap-arm64. + +commit c20f7413525602b0ea786d8974d03a81f7ca2a92 +Author: Damien Miller +Date: Thu Mar 13 10:45:53 2025 +1100 + + rebuild .depend + +commit d47ef958b89c6fa809302d654009d3dfabe11b75 +Author: djm@openbsd.org +Date: Wed Mar 12 22:43:44 2025 +0000 + + upstream: remove assumption that the sshd_config and any configs + + included from it can fit in a (possibly enlarged) socket buffer, by having + the sshd listener mainloop actively manage sending the configuration to the + sshd-session subprocess. + + work by markus@ w/ a little feedback from me; + ok me and committing on his behalf + + OpenBSD-Commit-ID: 8f54451483f64951853074adb76bc4f838eaf3ae + +commit 9c90b563943c16418d737433ac478974b8761ee5 +Author: dtucker@openbsd.org +Date: Tue Mar 11 11:46:44 2025 +0000 + + upstream: Prime caches for DNS names needed for tests. + + When running the SSHFP tests, particularly on an ephemeral VM, the first + query or two can fail for some reason, presumably because something isn't + fully initialized or something. To work around this, issue queries for the + names we'll need before we need them. + + OpenBSD-Regress-ID: 900841133540e7dead253407db5a874a6ed09eca + +commit 10124eefe875a3e4e1cfb84ebe6a613ed3213b78 +Author: dtucker@openbsd.org +Date: Tue Mar 11 09:06:50 2025 +0000 + + upstream: Some dd's don't understand "1m", so handle seperately. + + OpenBSD-Regress-ID: 1d983b27c96f28f69d3a288c19e8d8c58e1b2ee3 + +commit c21c8fc319376c2f5e0da166e9e89a97a245ae72 +Author: Darren Tucker +Date: Tue Mar 11 19:17:46 2025 +1100 + + Lazily unmount github workspace at end of workflow. + + Sometimes when a test times out the workspace is still busy when we try + to unmount it, which leaves the runner unusable until it's cleaned up + manually. We try to unmount this in the first step, but that usually + doesn't work since it fails during setup before it starts our workflow. + Move it to the end and make it a lazy unmount so it hopefully works + eventually. + +commit 4bcbac742968f5086cfd4c570a51de25ef77931f +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:50:20 2025 +0000 + + upstream: Add regress test for sftp resume. + + OpenBSD-Regress-ID: 37f629b3014338fa23a85df1e1bb320ea12282e1 + +commit e2c4f070b43a4fd7d59a9350e2fe78df605830b5 +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:46:02 2025 +0000 + + upstream: Use ssh binary instead of the (smaller) script when + + preparing test data files since it's faster. + + OpenBSD-Regress-ID: 4215e42682fdb73e131e10645d4a1a23a91d64f5 + +commit 62f02e95ba5cda4649c482d30f4370e2360eb94d +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:43:45 2025 +0000 + + upstream: Set up dbclient's known_hosts as it expects. + + OpenBSD-Regress-ID: 9e0898e8423237ce5023be53787bb4062e0d0418 + +commit 395284bd52887dbaf7e78200c857d7f2d9ce398e +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:43:03 2025 +0000 + + upstream: Use $DBCLIENT to access dbclient for consistency. + + OpenBSD-Regress-ID: 81e1b41e1ffc49aba1e6fcaeb6242f3b7875ea3c + +commit 97e10c0005a784622c61cb4e8bb7858b410bbcc6 +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:42:08 2025 +0000 + + upstream: Check if dbclient supports SHA1 before trying SHA1-based + + KEX. + + Dropbear 2025.87 removed SHA1 support by default, which means + diffie-hellman-group14-sha1 is not available. Unfortunately there isn't a + flag to query supported KEX, so instead check MACs and if it doesn't have + SHA1 methods, assuming SHA1 based KEXes are likewise not available. Spotted + by anton@. + + OpenBSD-Regress-ID: acfa8e26c001cb18b9fb81a27271c3b51288d304 + +commit 29a5127f808d00aa539fd27d83a65c2c56179b0e +Author: dtucker@openbsd.org +Date: Tue Mar 11 07:48:51 2025 +0000 + + upstream: Set highwater when resuming a "put". Prevents bogus "server + + reordered acks" debug message. ok djm@ + + OpenBSD-Commit-ID: aa7f6d0fc2e893c8c278ea3e6e0974c2eca83f5d + +commit 6575859d7acb110acf408707f98ed9744ca7d692 +Author: dtucker@openbsd.org +Date: Mon Mar 3 06:54:37 2025 +0000 + + upstream: Test for %-token and env var expansion in SetEnv. + + OpenBSD-Regress-ID: bd6139a6177ac4afb29a0ce4afc23567b22ef9f9 + +commit fd7ad8d7bf7dbdeb8f11a8b51aa9d31df1a17e52 +Author: dtucker@openbsd.org +Date: Sun Mar 2 07:41:06 2025 +0000 + + upstream: Also test User expansions when supplied via -l option and + + user@host. + + OpenBSD-Regress-ID: 56415859260b53ef0dd20f71225ba5fdf6320f50 + +commit e6cfd783f1491b502db9322aa970822c63f1667d +Author: dtucker@openbsd.org +Date: Sat Mar 1 06:12:47 2025 +0000 + + upstream: Tests for User expansion of %-tokens and environment + + variables. + + OpenBSD-Regress-ID: 7ed21dd0e09fb1f3537b8b177f171018aa501628 + +commit 197e503b8e4b642ce0f405a5d65da4256fa96431 +Author: djm@openbsd.org +Date: Fri Dec 6 16:25:58 2024 +0000 + + upstream: use glob(3) wildcards in AuthorizedKeys/PrincipalsFile + + tests to exercise this feature; ok dtucker + + OpenBSD-Regress-ID: 7f7b19c0b05b1862cc6521ce61b2b301a3f9cc3b + +commit 396202180180a4ac16788d469508a348789dafa1 +Author: djm@openbsd.org +Date: Fri Dec 6 10:37:42 2024 +0000 + + upstream: implement attestation verification for ED25519 keys + + OpenBSD-Regress-ID: c44fa5cdb434375a8b5545fdb4fc651061afca1f + +commit b49875428cda9c16c5bd52552100da2b419cda5f +Author: dtucker@openbsd.org +Date: Mon Mar 3 06:53:09 2025 +0000 + + upstream: Add %-token and environment variable expansion to SetEnv. + + feedback deraadt@ jmc@, nits and ok djm@ + + OpenBSD-Commit-ID: 2f6e5070481cb73e6f35fd1c6608c1eeff88a5c1 + +commit b6bba67e6c31d268480773e4fed16d0a32b4218e +Author: djm@openbsd.org +Date: Sun Mar 2 22:44:00 2025 +0000 + + upstream: fix PerSourcePenalty incorrectly using "crash" penalty when + + LoginGraceTime was exceeded. Reported by irwin AT princeton.edu via bz3797 + + OpenBSD-Commit-ID: 1ba3e490a5a9451359618c550d995380af454d25 + +commit 38d69fee1b06948f160d94abd07b6b297630d30a +Author: Damien Miller +Date: Sun Mar 2 22:06:53 2025 +1100 + + include __builtin_popcount replacement function + + Some systems/compilers lack __builtin_popcount(), so replace it as + necessary. Reported by Dennis Clarke; ok dtucker@ + +commit c94138d02a45dda5015f38f5a60b0bdde29019c1 +Author: djm@openbsd.org +Date: Sun Mar 2 11:03:13 2025 +0000 + + upstream: whitespace + + OpenBSD-Commit-ID: 1bd8953a37451ef7e0991f9fceec5e8005fe986a + +commit 65d2c59628e68e166046efa69e76c1d395a8df6e +Author: dtucker@openbsd.org +Date: Sun Mar 2 07:02:49 2025 +0000 + + upstream: Make a copy of the user when handling ssh -l, so that + + later during User token expansion we don't end up freeing a member of argv. + Spotted by anton@'s regress tests. + + OpenBSD-Commit-ID: 2f671a4f5726b66d123b88b1fdd1a90581339955 + +commit bd30cf784d6e825ef71592fb723c41d4f2fd407b +Author: dtucker@openbsd.org +Date: Sat Mar 1 06:11:26 2025 +0000 + + upstream: Allow %-token and environment variable expansion in User, + + with the exception of %r and %C which are self-referential. Requested in + bz#3477, ok djm@, man page improvements jmc@ + + OpenBSD-Commit-ID: caeb46251ee073662f6f5864c6f7b92d8ac80fa8 + +commit 94f59dcfc57f95ae044f75c3ce544329c8956c35 +Author: Darren Tucker +Date: Sat Mar 1 10:28:59 2025 +1100 + + Rebuild config files if Makefile changes. + + This ensures paths are updated if they are changed by re-running configure. + Patch from rapier at psc.edu. + +commit dfd9880585db1570656022f9fe1519df673f7b8a +Author: Darren Tucker +Date: Wed Feb 26 18:16:03 2025 +1100 + + Check for le32toh, le64toh, htole64 individually. + + It appears that at least some versions of endian.h in glibc do not have + the latter two, so check for and replace each one individually. + bz#3794, ok djm@ + +commit cb99e8eb228df366af33f4fe88d7a9dd0dbf0756 +Author: djm@openbsd.org +Date: Tue Feb 25 06:25:30 2025 +0000 + + upstream: ressurect fix for "match invalid-user" that got clobbered + + by 1.423 + + OpenBSD-Commit-ID: d18bf0945976e0f3467d710d4bc8bdbe181c0567 + +commit 487cf4c18c123b66c1f3f733398cd37e6b2ab6ab +Author: deraadt@openbsd.org +Date: Fri Feb 21 18:22:41 2025 +0000 + + upstream: Also prohibit , (comma) in hostnames, proposed by David + + Leadbeater ok djm millert + + OpenBSD-Commit-ID: 2837fa31dc6e81976f510f0a259edaa559b20b07 + +commit 3bc6de98c830bd5207f6c371ba69c5874f06305b +Author: Damien Miller +Date: Mon Feb 24 17:27:50 2025 +1100 + + Try to fix github tcmalloc target failure + + tcmalloc may, depending on the stacktrace generator it uses, create + pipe(2) fds during shared library initialisation. These will later + get clobbered by ssh/sshd calling closefrom() and chaos will ensue. + Tell tcmalloc to use an unwinder that doesn't pull this stuff. + +commit 922e54bbfe8c8479453693ef52350338f0c19124 +Author: Damien Miller +Date: Fri Feb 21 13:44:35 2025 +1100 + + cleanup last mention of ubuntu-20.04 + +commit bc4b3f6dc1738d389e5c9dcca8c56d7e153fee49 +Author: Damien Miller +Date: Fri Feb 21 13:44:13 2025 +1100 + + prune gcc/clang versions to be tested + + Test only the oldest and latest versions of each + +commit 94b73755f931d592a612ef5cb998694643eab5ff +Author: Damien Miller +Date: Fri Feb 21 11:30:22 2025 +1100 + + Update AWS-LC version number + + Patch from Shubham Mittal bz bz3792 + +commit 6887099fae6d9f3482e1075d034e9343dc413200 +Author: Damien Miller +Date: Fri Feb 21 11:22:34 2025 +1100 + + adjust workflows for ubuntu version transition + + remove workflows for unsupported compilers, add a few for additional + supported compilers, move some workflows to run on ubuntu-latest + +commit 33bb47e6f74f2ca8093946e6f462d655a9ae46d3 +Author: Damien Miller +Date: Thu Feb 20 17:10:32 2025 +1100 + + Add ubuntu-*-arm test runners + +commit a0c95fbb215b2168fa51b15906e2d6990d7fef6b +Author: Damien Miller +Date: Thu Feb 20 17:03:28 2025 +1100 + + remove ubuntu-20.04 Github action runners + + ubuntu-20.04 is deprecated now, so migrate all its unique runners + to ubuntu-22.04. + + ok dtucker@ + +commit 0cbeedba81b57c56379e1d202b9ccd3b72af7ddc +Author: Damien Miller +Date: Tue Feb 18 19:03:42 2025 +1100 + + openssh-9.9p2 + +commit 0832aac79517611dd4de93ad0a83577994d9c907 +Author: djm@openbsd.org +Date: Tue Feb 18 08:02:48 2025 +0000 + + upstream: Fix cases where error codes were not correctly set + + Reported by the Qualys Security Advisory team. ok markus@ + + OpenBSD-Commit-ID: 7bcd4ffe0fa1e27ff98d451fb9c22f5fae6e610d + +commit 6ce00f0c2ecbb9f75023dbe627ee6460bcec78c2 +Author: djm@openbsd.org +Date: Tue Feb 18 08:02:12 2025 +0000 + + upstream: Don't reply to PING in preauth phase or during KEX + + Reported by the Qualys Security Advisory team. ok markus@ + + OpenBSD-Commit-ID: c656ac4abd1504389d1733d85152044b15830217 + +commit 9e5bd74a85192c00a842f63d7ab788713b4284c3 +Author: jmc@openbsd.org +Date: Sat Feb 15 06:48:56 2025 +0000 + + upstream: - use \& when contructs like "e.g." end a line, to avoid + + double spacing - macro is Qq not Oq + + OpenBSD-Commit-ID: 17e5d2d7f288cc7fc536e3af252224525f9fb43a + +commit f519e71fb7a46314ae16e2a75490649dc0bd01a2 +Author: Damien Miller +Date: Sat Feb 15 13:12:40 2025 +1100 + + depend + +commit 9131ac64b0ebe66dc1de9d44bf8d1bd64a24c350 +Author: djm@openbsd.org +Date: Sat Feb 15 01:52:07 2025 +0000 + + upstream: add "Match version" support to ssh_config. Allows + + matching on the local version of OpenSSH, e.g. "Match version OpenSSH_10.*" + + ok markus@ + + OpenBSD-Commit-ID: c0cb504d0b9e43ccf12e68a544a7cd625e89758d + +commit 192a20df00c8a56fe7d92ffa23d959c865d7fb9e +Author: djm@openbsd.org +Date: Sat Feb 15 01:50:47 2025 +0000 + + upstream: Add support for "Match sessiontype" to ssh_config. Allows + + matching on the type of session requested, either "shell" for interactive + sessions, "exec" for command execution sessions, "subsystem" for subsystem + requests, such as sftp, or "none" for transport/forwarding-only sessions. + + ok markus@ + + OpenBSD-Commit-ID: eff5c001aecb2283d36639cfb28c0935a8bfd468 + +commit caa3c0c77082888236b0b0c4feb3e6879731b3ba +Author: djm@openbsd.org +Date: Sat Feb 15 01:48:30 2025 +0000 + + upstream: "Match command ..." support for ssh_config to allow + + matching on the remote command specified on the commandline. + + Also relaxes matching rules for `Match tagged` to allow + `Match tagged ""` to match an empty tag value. This also works + for command. + + ok markus@ + + OpenBSD-Commit-ID: 00dcfea425bf58d824bf5e3464cfc2409121b60d + +commit 38f6000e9851a00e2e4b8e1eb4ea6a243ef7e6a3 +Author: Damien Miller +Date: Tue Feb 11 10:32:26 2025 +1100 + + depend + +commit aa1409e7a0a5605f0127651a3ba5a348666325bc +Author: djm@openbsd.org +Date: Mon Feb 10 23:19:26 2025 +0000 + + upstream: include arguments the command was invoked with, and + + operating system name, version and architecture in startup debugging output; + ok dtucker + + OpenBSD-Commit-ID: 2a509d319aaf31a6bf9998e1842832883fbc3edd + +commit 857ac20f5fe19f183defba5dbf4b7d9e6400230c +Author: djm@openbsd.org +Date: Mon Feb 10 23:16:51 2025 +0000 + + upstream: include line number in Match debug messages, makes it a + + little easier to see what's going on + + OpenBSD-Commit-ID: 1fcf4aa2ee667711b9497ded0fa52d757c69b1df + +commit af49d474e481d2d78b2f06b06a06b0b37629358e +Author: djm@openbsd.org +Date: Mon Feb 10 23:00:29 2025 +0000 + + upstream: fix "Match invalid-user" from incorrectly being activated + + in initial configuration pass when no other predicates were present on the + match line + + OpenBSD-Commit-ID: 02703b4bd207fafd03788bc4e7774bf80be6c9a8 + +commit 1c67bae3f5834e48ded71c406f2039dea6e536db +Author: schwarze@openbsd.org +Date: Sun Feb 9 18:24:08 2025 +0000 + + upstream: In a section 1 manual, use the plain English words + + "standard output" rather than the overly technical abbreviation "stdout" - we + are not talking about a device file or a FILE * object here. Issue reported + by on the groff mailing list. + + OpenBSD-Commit-ID: a0816999f970e6159523bed8484f62c42ec93109 + +commit 85b3d68dd931416ede657f371f1d60cdc3a66f34 +Author: dtucker@openbsd.org +Date: Fri Jan 17 00:09:41 2025 +0000 + + upstream: Fix debug logging of user specific delay. Patch from + + Achim Leitner (fjl5) via github PR#552. + + OpenBSD-Commit-ID: 834a869ed9b15058d3c1ef0cd75402ef989255d8 + +commit e4e5b06fdf4532705669c0ae944b364022d16b9d +Author: dtucker@openbsd.org +Date: Thu Jan 16 06:37:10 2025 +0000 + + upstream: Call log_init in sshd-auth and sshd-session immediately + + after parsing the config file so that any log settings set in the config file + take effect immediately. Move version banners to immediately after that, and + make them distinct per binary. ok djm@ + + OpenBSD-Commit-ID: acf3d090638edf9b6e6f78eed96b537fe671f0f5 + +commit 0643994b20f2cc54bca80842a984b3052ff1a6a9 +Author: dtucker@openbsd.org +Date: Wed Jan 15 22:23:13 2025 +0000 + + upstream: Use strprefix helper when processing sshd -C test args + + instead of counting bytes by hand. ok djm@ + + OpenBSD-Commit-ID: 2866d369d96fe04bf76112260ac37e489f98a9a9 + +commit 66efd0fbb6b8b95f8a520f2cdf8ede14e62b30b3 +Author: Damien Miller +Date: Thu Feb 6 09:38:09 2025 +1100 + + add support for AWS-LC (AWS libcrypto) + + Patch from Shubham Mittal via bz3784; ok dtucker + +commit 826483d51a9fee60703298bbf839d9ce37943474 +Author: Tim Rice +Date: Mon Dec 16 15:36:54 2024 -0800 + + fix old typo (s/SYSVINITSTOPT/SYSVINITSTOP/) + +commit 1a8ce460f1d0c3f7304edba0733783b57b430e21 +Author: dtucker@openbsd.org +Date: Thu Dec 12 09:09:09 2024 +0000 + + upstream: Plug leak on error path, spotted by Coverity. ok djm@ + + OpenBSD-Commit-ID: b1859959374b4709569760cae0866d22a16606d3 + +commit 924f996144fc0ae1a659fadcfc2237d1ae935fc4 +Author: Xavier Hsinyuan +Date: Mon Dec 9 11:21:05 2024 +0800 + + Add $(srcdir) for standalone sk-libfido2 make target. + + Fix out-of-tree build failure due to incorrect path for `sk-usbhid.c`. + +commit bbc9c18e84de29c83fa03e69290979fcca54a2b2 +Author: djm@openbsd.org +Date: Sat Dec 7 10:12:19 2024 +0000 + + upstream: replace bespoke logging of MaxSessions enforcement with + + new ratelimited logging infrastructure. + + Add ratelimits to logging of connections dropped by PerSourcePenalties + + ok dtucker + + OpenBSD-Commit-ID: f22fe7c39607e4361aadf95e33773ffd68c59489 + +commit 5a6ddf946cf105189c2c99a04f86ce95edc55fc5 +Author: djm@openbsd.org +Date: Sat Dec 7 10:05:36 2024 +0000 + + upstream: add infrastructure for ratelimited logging; feedback/ok + + dtucker + + OpenBSD-Commit-ID: 18a83e5ac09d59aaf1e834fd6b796db89dd842e7 + +commit 85f0c1e75e8f6c5d83b8070918ee2f6ab16d403e +Author: djm@openbsd.org +Date: Fri Dec 6 16:24:27 2024 +0000 + + upstream: allow glob(3) patterns for sshd_config AuthorizedKeysFile + + and AuthorizedPrincipalsFile directives; bz2755 ok dtucker + + OpenBSD-Commit-ID: 3e3e05a17fca39bba78b993a07b44664519adf7f + +commit 9a9ffee6e10bcd039f1f9385599577441ebe542a +Author: djm@openbsd.org +Date: Fri Dec 6 16:21:48 2024 +0000 + + upstream: support VersionAddendum in the client, mirroring the + + option of the same name in the server; bz2745 ok dtucker@ + + OpenBSD-Commit-ID: 6ff7905b3f9806649bde750515786553fb89cdf4 + +commit 41ab0ccecd68232e196efae5e224b31ca104c423 +Author: djm@openbsd.org +Date: Fri Dec 6 16:02:12 2024 +0000 + + upstream: clarify encoding of options/extensions; bz2389 + + OpenBSD-Commit-ID: c4e92356d44dfe6d0a4416deecb33d1d1eba016c + +commit 5488810359f0fd91e2f7b919c70a3798e46376cb +Author: djm@openbsd.org +Date: Fri Dec 6 15:17:15 2024 +0000 + + upstream: ignore SIGPIPE here; some downstreams have had this for + + years... + + OpenBSD-Commit-ID: 73674ee4f8ceb8fc9cb8de71d8ddea0c721eb035 + +commit 4389a792d9078212366eba124a3eed36e009d09e +Author: djm@openbsd.org +Date: Fri Dec 6 15:12:56 2024 +0000 + + upstream: sync -o option lists with ssh.1; requested jmc@ + + OpenBSD-Commit-ID: a7ac295b444da7b2ca7a33a52370594f6897f6bb + +commit 6b9cd095565ddc5402d5096dce248fa0521dbda3 +Author: Fabio Pedretti +Date: Mon Oct 16 17:12:24 2023 +0200 + + Remove ancient RHL 6.x config in RPM spec. + + It looks like build6x options were intended for RHL 6.x + (the Red Hat distro predating Fedora, not RHEL), but were + then applied to RHEL. + + Completely remove support for this ancient configuration. + + Successfully built, installed and run on RHEL 6. This also + remove a build warning about deprecation of PreReq. + +commit 5cacfa798f92b707491375fed748d1d1bcb33ec9 +Author: Darren Tucker +Date: Fri Dec 6 23:54:45 2024 +1100 + + Add new hardware-backed signing key for myself. + + Retire old non-hardware based signing key. + +commit f129b6ee1d4361799e65307216e3a4d5544356b7 +Author: Jonas 'Sortie' Termansen +Date: Sat Nov 2 22:05:45 2024 +0100 + + Fix configure implicit declaration and format warnings. + +commit 11a5e5179077f73c2d45bcdf3f60153ae3f17815 +Author: dtucker@openbsd.org +Date: Fri Dec 6 07:05:54 2024 +0000 + + upstream: Expand $SSH to absolute path if it's not already. + + Prevents problem later in increase_datafile_size if ssh is not in + the path. Patch from quaresmajose via GHPR#510. + + OpenBSD-Regress-ID: 2670a66af8b827410ca7139f0a89f4501cece77b + +commit dc2ef8f0944a4ff7ba19e52fd17b4654e6bd9b93 +Author: dtucker@openbsd.org +Date: Fri Dec 6 06:55:28 2024 +0000 + + upstream: Change "login again" to "log in again" + + in password change message. From ThinLinc-Zeijlon via github PR#532. + + OpenBSD-Commit-ID: fea5e9bc04caf613a118c419f16863733b340cf1 + +commit 8252f346eb21cd6b30816f905b7d94f10962373e +Author: naddy@openbsd.org +Date: Thu Dec 5 22:45:03 2024 +0000 + + upstream: catch up documentation: AES-GCM is preferred to AES-CTR + + OpenBSD-Commit-ID: 63360924b6834507fe70020edb936f5075043a9e + +commit 9a2f4c75081769bd45eba2bf3fab0a32b25f1879 +Author: Darren Tucker +Date: Fri Dec 6 17:56:17 2024 +1100 + + Change text from "login to" to "log in to". + + From ThinLinc-Zeijlon via GHPR#532. + +commit 24dcf368d816b06136a02845ebd0c7846bf18927 +Author: Xavier Hsinyuan +Date: Fri Dec 6 11:56:34 2024 +0800 + + Fix configure message typo in sk-libfido2 standalone. + +commit 1a0cac2f3411a22d69ae6918eff48456b805e73b +Author: Alexander Kanavin +Date: Thu Dec 5 16:26:46 2024 +0100 + + Skip 2038 key expiry test on 64 bit time_t systems. + + This allows testing Y2038 with system time set to after that (i.e. 2040), + so that actual Y2038 issues can be exposed, and not masked by key expiry + errors. + + Signed-off-by: Alexander Kanavin + +commit 6b4611dc1232c5d2c8e43201f580f19aab320c87 +Author: Darren Tucker +Date: Fri Dec 6 01:45:52 2024 +1100 + + Skip 64bit expiry time test on 32bit time_t. + +commit c9b7866a7dc5e6c30f5aa9d22dd0bbafda0d496f +Author: dtucker@openbsd.org +Date: Thu Dec 5 14:28:39 2024 +0000 + + upstream: Add key expiry test in the 64bit time_t range for additional + + coverage. From Alexander Kanavin via bz#3684. + + OpenBSD-Regress-ID: bdf6eb3c2421f2e1e11483d03b34c7931d1bccf7 + +commit 790c913b5fc6ee93ae14793443dc85a0f574b7eb +Author: Damien Miller +Date: Thu Dec 5 19:24:56 2024 +1100 + + typo + +commit d23a23aaeeabc228792e3fd7eb5f2fa6ae13c482 +Author: Damien Miller +Date: Thu Dec 5 08:47:02 2024 +1100 + + add a Makefile target for ssh-verify-attestation + + Not built by default, but easier than doing it by hand + +commit d0ac63d0f8b5f778d5fd326701ef4489bc27635e +Author: dtucker@openbsd.org +Date: Thu Dec 5 06:49:26 2024 +0000 + + upstream: De-magic the x11 base port number into a define. ok djm@ + + OpenBSD-Commit-ID: 23b85ca9d222cb739b9c33ee5e4d6ac9fdeecbfa + +commit 9998c93d57bf0f1df2bc93e0bc2d8112c6f8c720 +Author: dtucker@openbsd.org +Date: Thu Dec 5 06:47:00 2024 +0000 + + upstream: Prevent integer overflow in x11 port handling. These are + + theoretically possible if the admin misconfigures X11DisplayOffset or the + user misconfigures their own $DISPLAY, but don't happen in normal operation. + From Suhov Roman via bz#3730, ok djm@ + + OpenBSD-Commit-ID: e9e3860f1a19b862ccf07dc8ecbe8f1e1034f4ed + +commit 8c9ee046d40e4254c6c1711783ea11027b72c3e9 +Author: djm@openbsd.org +Date: Wed Dec 4 16:42:49 2024 +0000 + + upstream: add a work-in-progress tool to verify FIDO attestation + + blobs that ssh-keygen can write when enrolling FIDO keys. + + OpenBSD-Regress-ID: 6c97bf3f46e48866677ad69f54b77683eb92437f + +commit 50c640d874d0246dd0a0d949398c3d7f757c716a +Author: dtucker@openbsd.org +Date: Wed Dec 4 10:51:13 2024 +0000 + + upstream: Don't assume existence of SK provider in test. Patch from + + balu.gajjala at gmail via bz#3402. + + OpenBSD-Regress-ID: d571932016d07d135b54433d07520b9e1901db43 + +commit 73d782693144262570d3585b62f16b183170c014 +Author: djm@openbsd.org +Date: Wed Dec 4 14:37:55 2024 +0000 + + upstream: sync the list of options accepted by -o with ssh_config.5 + + prompted by bz3455 + + OpenBSD-Commit-ID: 0ecbfa70aea6c769bcc259defe07182edf461f57 + +commit 6993d9f0959534b0b7d52e17b95e9e79fb0b3d0a +Author: djm@openbsd.org +Date: Wed Dec 4 14:24:20 2024 +0000 + + upstream: don't screw up ssh-keygen -l output when the file + + contains CR characters; GHPR236 bz3385, fix from Dmitry Belyavskiy + + OpenBSD-Commit-ID: e458cf6b0adcea5b69ef4c7ba38e590841d02ef4 + +commit c0b03c2534946fc114880092177aa4a3683ced2d +Author: jsg@openbsd.org +Date: Tue Dec 3 22:30:03 2024 +0000 + + upstream: spelling; ok djm@ + + OpenBSD-Commit-ID: c8ff3f70020451eef214e598117b7ce1a29853ef + +commit 97eb247f40167f44324e88a537d5b4fe771a63b2 +Author: dtucker@openbsd.org +Date: Tue Dec 3 16:27:53 2024 +0000 + + upstream: Remove fallback to compiled-in gropup for dhgex when the + + moduli file exists, but does not contain moduli within the client-requested + range. The fallback behaviour remains for the case where the moduli file does + not exist (typically, running tests prior to installing). From bz#2793, based + in part on patch from Joe Testa, ok djm@ + + OpenBSD-Commit-ID: b1a8c5dbbedf249b42474679ebaf14db7332b1ab + +commit 30c746265ebde29806dba77c92fb1fd3803cbf5c +Author: tb@openbsd.org +Date: Tue Dec 3 15:53:51 2024 +0000 + + upstream: Remove redundant field of definition check + + This will allow us to get rid of EC_GROUP_method_of() in the near future. + + ok djm + + OpenBSD-Commit-ID: b4a3d2e00990cf5c2ec6881c21ddca67327c2df8 + +commit eaa1744f34c30740328fd0a0d84b5f2f9e6918c1 +Author: Damien Miller +Date: Thu Dec 5 00:59:19 2024 +1100 + + don't ignore changes in regress Makefiles + + reported by Torben Hansen in bz2880 + +commit 66e986880b2472fefaad781f10113b138b65ff27 +Author: Damien Miller +Date: Thu Dec 5 00:01:33 2024 +1100 + + Support systemd-style socket activation in agent + + Adds support for systemd LISTEN_PID/LISTEN_FDS socket activation to + ssh-agent. Activated when these environment variables are set and + the agent is started with the -d or -D option and no socket path + is set. + + Based on GHPR502 by Daniel Kahn Gillmor, ok dtucker + +commit 9b57c099f57152e6c94f633c114f544087f4bdaa +Author: Darren Tucker +Date: Wed Dec 4 21:36:01 2024 +1100 + + Update readme files to better reflect reality. + + Prompted by bz#3738, ok djm@. + +commit ffa885db1b960451d426455045d2f51288e48ee8 +Author: dtucker@openbsd.org +Date: Tue Dec 3 14:12:47 2024 +0000 + + upstream: Improve description of KbdInteractiveAuthentication. + + Based on bz#3658, fixes jmc@ ok markus@ djm@. + + OpenBSD-Commit-ID: 9fadb56b9afed554d501acbba911c685acd6ffc2 + +commit b460f82a67795bba37c6cc6c78f788e5b435b4cb +Author: Jonas 'Sortie' Termansen +Date: Sat Nov 2 17:53:23 2024 +0100 + + Inherit DESTDIR from the environment. + + autoconf packages conventionally inherit the DESTDIR variable from the + environment. + +commit 9da7fa7c7464df241ae5d17da94e4ebed9013719 +Author: Jonas 'Sortie' Termansen +Date: Sat Nov 2 22:10:39 2024 +0100 + + Define u_short and u_long if needed. + +commit d3a7ff7cecbc23cc37044bdf02e7118d05bf3c35 +Author: djm@openbsd.org +Date: Tue Dec 3 08:31:49 2024 +0000 + + upstream: support FIDO tokens that return no attestation data, e.g. + + recent WinHello. From Michael Braun via GHPR542 + + OpenBSD-Commit-ID: a71b0542f2f7819ba0e33a88908e01b6fc49e4ce + +commit 96b64056c812620014b65371a9e3ac86bfcd08d5 +Author: Thorsten Kukuk +Date: Tue Nov 19 10:53:28 2024 +0100 + + Add wtmpdb support as Y2038 safe wtmp replacement + +commit 1d9563a56f2ad5b0c0aeef20e19c1a03ad54f88a +Author: djm@openbsd.org +Date: Mon Dec 2 14:06:42 2024 +0000 + + upstream: unbreak + + OpenBSD-Commit-ID: 05b6c31f4a6e385338f43cc0e08776cea75802a1 + +commit d75837b9f6d0d6cc18ed5078789ea0f3dad08f00 +Author: djm@openbsd.org +Date: Mon Dec 2 13:37:18 2024 +0000 + + upstream: prefer AES-GCM to AES-CTR; ok deraadt markus + + OpenBSD-Commit-ID: 8366a72e0f300ee31c5dab2c95025387ec15bbc9 + +commit e19cd494b567a73dc390e09b47c1e21545e6116b +Author: Shiva Kaul +Date: Mon Dec 2 02:04:20 2024 -0500 + + Fix compilation with DEBUG_SK enabled + + In `ssh_ecdsa_sk_verify`, the `datalen` variable was renamed to `dlen` -- but not in this debugging block. + +commit 67ace92be0718df7e0f52c0a76684fc2ebae4089 +Author: dtucker@openbsd.org +Date: Fri Nov 29 00:13:36 2024 +0000 + + upstream: Import regenerated moduli. + + OpenBSD-Commit-ID: 311d271bf0fab8a119e84f4f696d8cd40731692f + +commit ca0697a90e5720ba4d76cb0ae9d5572b5260a16c +Author: Jeremy Stott +Date: Sat Oct 19 12:10:52 2024 +1300 + + Add make target for standalone sk-libfido2 + + Add a Makefile target for sk-libfido2, the standalone fido2 security + key shared library, suitable for use with the SecurityKeyProvider + option. + + Add a new configure option `--with-security-key-standalone` that + optionally sets the shared library target sk-libfido2$(SHLIBEXT), and + adds it to $(TARGETS). + + misc.h is required when SK_STANDALONE is defined, because of the use + of `monotime_tv` in `sk_select_by_touch`. + + Sets the shared library extension for sk-libfido2 is by setting + `SHLIBEXT` depending on the platform in configure.ac. + + Add the shared library to the CI builds in the `sk` target config to + make sure it can compile under the same conditions as + `--with-security-key-builtin`. + + Add a libssh-pic.a static library that compiles with `-fPIC` reusing + .c.lo method in sk-dummy.so for use in the shared library sk-libfido2. + + Note, a separate static library libssh-pic.a is needed, since defining + -DSK_STANDALONE excludes some symbols needed in sshkey.lo. + +commit 74d70841efbf41b9fcc8e6f6f4777d2e9d7e2004 +Author: Arnout Engelen +Date: Fri Oct 18 13:42:38 2024 +0200 + + mdoc2man: balance nested square brackets + + I noticed the square brackets in `destination [command [argument...]` + in the synopsis for the `ssh.1` manpage were not balanced, + this balances them. + + Signed-off-by: Arnout Engelen + +commit 8eabd2ae2ca1d7756417a1ee5b41f09c5d997634 +Author: djm@openbsd.org +Date: Wed Nov 27 16:07:08 2024 +0000 + + upstream: fix argument of "Compression" directive in ssh -G config + + dump, which used to work but broke in 9.8 + + OpenBSD-Commit-ID: c79936242d29c70d01941b28d2d07fd0b85fe46f + +commit 53c03961769d8879a81398074ea3cb36253d4f2e +Author: djm@openbsd.org +Date: Wed Nov 27 13:27:34 2024 +0000 + + upstream: new name/link for agent I-D + + OpenBSD-Commit-ID: e3420f3925a297a1b2ab7dfe7c7d274cfc8e1193 + +commit 785e3c9110df8f2d30e42ce8b45969c49700f35b +Author: djm@openbsd.org +Date: Wed Nov 27 13:00:23 2024 +0000 + + upstream: mention that biometrics may be used for FIDO key user + + verification as well as PIN. Prompted by Zack Newman, ok jmc@ + + OpenBSD-Commit-ID: b774a4438c9be70012661ee278450790d21277b8 + +commit fd2e64c9ec9ea3e89e396be0db41aaf982ae1210 +Author: djm@openbsd.org +Date: Tue Nov 26 22:05:51 2024 +0000 + + upstream: g/c outdated XXX comments + + OpenBSD-Commit-ID: 74d0c0b74994d9a4343c4d7ea4948cb34f609a6c + +commit 0ad34a6193357d286042322ea7347262a6fb0778 +Author: djm@openbsd.org +Date: Tue Nov 26 22:02:28 2024 +0000 + + upstream: regression test for UpdateHostkeys with multiple keys backed + + by ssh-agent. Patch from Maxime Rey. + + OpenBSD-Regress-ID: 1777ab6e639e57c0e20cbcb6df60455b49fd8bb3 + +commit 84023656d91b78f1ef86c8321ec563f2e90f7227 +Author: djm@openbsd.org +Date: Tue Nov 26 22:01:37 2024 +0000 + + upstream: Explicitly specify the signature algorithm when signing + + hostkeys-prove requests. + + Fixes a corner-case triggered by UpdateHostKeys with one or more unknown + host keys stored in ssh-agent where sshd refuses to accept the signature + coming back from the agent. + + Report/fix from Maxime Rey + + OpenBSD-Commit-ID: 460c7d527a24f92b7e5f68ca1a2fa242ebf0d086 + +commit d1c1cfc5e4e9b43593d4642810ea8135e4c7db49 +Author: djm@openbsd.org +Date: Tue Nov 26 21:23:35 2024 +0000 + + upstream: when using RSA keys to sign messages, select the + + signature algorithm based on the requested hash algorithm ("-Ohashalg=xxx"). + + This allows using something other than rsa-sha2-512, which may not + be supported on all signing backends, e.g. some smartcards only + support SHA256. + + Patch from Morten Linderud; ok markus@ + + OpenBSD-Commit-ID: 246353fac24e92629263996558c6788348363ad7 + +commit ac7544654441280071b90a4129a47467d40f2389 +Author: djm@openbsd.org +Date: Sun Nov 24 23:47:50 2024 +0000 + + upstream: turn off CDIAGFLAGS and turn back on INSTALL_STRIP + + accidentally changed in last commit + + OpenBSD-Commit-ID: 6d07e4606997e36b860621a14dd41975f2902f8f + +commit 953fa5b59afb04c3c74ed82d7bace65c13cd8baa +Author: Darren Tucker +Date: Sat Nov 9 11:41:44 2024 +1100 + + Disable security key for bigendian interop. + + It doesn't currently work. It's not clear why, but I suspect + sk-dummy.so ends up being built for the wrong architecture. + +commit a80eb71c428c474098087c672398f200be8fabdf +Author: Darren Tucker +Date: Sat Nov 9 05:14:16 2024 +1100 + + Reshuffle OpenWRT test configs. + + Move the the flags used by the OpenWRT distro to mipsel target and + enable OpenSSL on all targets to improve coverage. + + Explicitly disable security key and openssl on mips target so that host + end of the bigendian interop tests don't attempt them and fail (since + they're not enabled on the target side). + +commit d2709c461359e4129311cdff81ee05242d6c53cd +Author: Darren Tucker +Date: Sat Nov 9 03:26:08 2024 +1100 + + Add keytype to bigendian interop test. + +commit 50ac0f0e0627d29fd9becf5e15e8ceca5ad18078 +Author: Darren Tucker +Date: Sat Nov 9 03:24:29 2024 +1100 + + Ignore chown failure, eg due to dangling symlinks. + +commit 9e528e65a03245cf28e814f09b88c701bec935d1 +Author: Darren Tucker +Date: Sat Nov 2 18:05:41 2024 +1100 + + Test bigendian interop. + + Where our test target is a bigendian system, do an additional build on + the runner host (which is little endian) and test interop between the two. + Should hopefully catch obvious endianness bugs. + +commit dd416f5bfa96ac1ff44b27a93f7b55ee627c6baf +Author: Darren Tucker +Date: Fri Nov 1 19:44:29 2024 +1100 + + Allow overridding TEST_SSH_SSHD. + + This will allow tests to specify an alternative sshd, eg on a remote + machine with different endianness. + +commit 82662d562cf54829df8a941cdfb2fd307e1d9a90 +Author: djm@openbsd.org +Date: Wed Nov 6 22:51:26 2024 +0000 + + upstream: ssh-agent implemented an all-or-nothing allow-list of + + FIDO application IDs for security key-backed keys, to prevent web key handles + from being used remotely as this would likely lead to unpleasant surprises. + By default, only application IDs that start with "ssh:*" are allowed. + + This adds a -Owebsafe-allow=... argument that can override the default + list with a more or less restrictive one. The default remains unchanged. + + ok markus@ + + OpenBSD-Commit-ID: 957c1ed92a8d7c87453b9341f70cb3f4e6b23e8d + +commit 593a0b65c55c1e06a8c22b084aefc395aedb0127 +Author: jca@openbsd.org +Date: Mon Nov 4 21:59:15 2024 +0000 + + upstream: Ignore extra groups that don't fit in the buffer passed + + to getgrouplist(3) + + Our kernel supports 16 groups (NGROUPS_MAX), but nothing prevents + an admin from adding a user to more groups. With that tweak we'll keep + on ignoring them instead of potentially reading past the buffer passed to + getgrouplist(3). That behavior is explicitely described in initgroups(3). + + ok millert@ gilles@ + + OpenBSD-Commit-ID: a959fc45ea3431b36f52eda04faefc58bcde00db + +commit e7adebeff3a9d038d0eaeeb0fcefedf29acb7e90 +Author: Damien Miller +Date: Mon Nov 4 14:39:27 2024 +1100 + + Add git signing key for Tim Rice + +commit da4b84845e874f12af7e0686170fa391c919d1df +Author: Darren Tucker +Date: Fri Nov 1 18:51:22 2024 +1100 + + Correct path to c-cpp.yml file in workflow config. + +commit 28740aa2c75392a9c4191eb9523f9b20853e2932 +Author: Darren Tucker +Date: Fri Nov 1 18:44:42 2024 +1100 + + Test new OpenSSL and LibreSSL releases.` + +commit a74809fe06540f16231b354ffe21fcbf39e81f73 +Author: Darren Tucker +Date: Fri Nov 1 18:44:00 2024 +1100 + + Add nbsd10 default test config. + +commit 88b35cbdc1500efece65cd6a9a20a72cf7e46eaa +Author: Damien Miller +Date: Wed Oct 30 14:25:14 2024 +1100 + + fix uint64_t types; reported by Tom G. Christensen + +commit ef7c26cd2f0f9a8222f851d1e551f6dfd3113f8b +Author: Damien Miller +Date: Sun Oct 27 13:28:11 2024 +1100 + + htole64() etc for systems without endian.h + +commit 0c3927c45f8a57b511c874c4d51a8c89414f74ef +Author: djm@openbsd.org +Date: Sun Oct 27 02:06:59 2024 +0000 + + upstream: explicitly include endian.h + + OpenBSD-Commit-ID: 13511fdef7535bdbc35b644c90090013da43a318 + +commit cf3e48ee8ba1beeccddd2f203b558fa102be67a2 +Author: djm@openbsd.org +Date: Sun Oct 27 02:06:01 2024 +0000 + + upstream: fix ML-KEM768x25519 KEX on big-endian systems; spotted by + + jsg@ feedback/ok deraadt@ + + OpenBSD-Commit-ID: 26d81a430811672bc762687166986cad40d28cc0 + +commit ae566d51b64fa3dce7063e7745b9b35f8f47abde +Author: naddy@openbsd.org +Date: Fri Oct 25 21:53:24 2024 +0000 + + upstream: mlkem768x25519-sha256 has been promoted to default key + + exchange + + OpenBSD-Commit-ID: 5a3259a193fd42108a869ebf650b95b5f2d08dcf + +commit 3af1dba1384ca896df6e973c70398c41d36de1ea +Author: Darren Tucker +Date: Fri Oct 25 19:04:30 2024 +1100 + + Retire the minix3 test config. + + It got broken by the sshd-auth change, it's not obvious why, and the + platform lacks the debugging tools (eg gdb, strace) to figure it out. + The upstream project seems effectively dead (6 years since the last + commit, 10 since the last release). It was useful while it lasted + (we found a real bug because of it) but its time seems to have passed. + +commit 3b240cc44b8de9175280ddbe59331317d427b0e3 +Author: Preetish Amballi +Date: Mon Oct 21 14:07:02 2024 +0000 + + Updated gitignore to ignore sshd-session and sshd-auth targets + +commit 326495744f06a0ab18ee0d16f87b3fe91cac92fb +Author: Darren Tucker +Date: Fri Oct 25 19:01:02 2024 +1100 + + Simplify pselect shim and remove side effects. + + Instead of maintaing state (pipe descriptors, signal handlers) across + pselect-on-select invocations, set up and restore them each call. + This prevents outside factors (eg a closefrom or signal handler + installation) from potentially causing problems. This does result in a + drop in throughput of a couple of percent on geriatric platforms without + a native pselect due to the extra overhead. Tweaks & ok djm@ + +commit e53b615f3934ffac1efb3c1e491d126b9b09fd24 +Author: djm@openbsd.org +Date: Fri Oct 25 01:34:18 2024 +0000 + + upstream: promote mlkem768x25519-sha256 to be the default key exchange; + + ok markus@ + + OpenBSD-Commit-ID: fc673065e6505bb06b2e2b9362f78ccb4200a828 + +commit de644b1831b970f6655f871c051774cc871e8e74 +Author: djm@openbsd.org +Date: Thu Oct 24 03:28:34 2024 +0000 + + upstream: test SIGUSR1 dropping all keys from ssh-agent + + OpenBSD-Regress-ID: 8654b9aa8eb695b1499fffc408c25319592bf0e0 + +commit e86d7a077ce9a2b9ee9d4138c358a17cbdb786f9 +Author: djm@openbsd.org +Date: Thu Oct 24 03:15:47 2024 +0000 + + upstream: amake ssh-agent drop all keys when it receives SIGUSR1; + + let's users zap keys without access to $SSH_AUTH_SOCK + + ok deraadt@ + + OpenBSD-Commit-ID: dae9db0516b1011e5ba8c655ac702fce42e6c023 + +commit 94cdfebec852a2429c008cc2a55f8e4183f36972 +Author: djm@openbsd.org +Date: Thu Oct 24 03:14:37 2024 +0000 + + upstream: relax valid_domain() checks to allow an underscore as the + + first character. ok deraadt@ + + OpenBSD-Commit-ID: 3f8be6d32496e5596dd8b14e19cb067ddd7969ef + +commit 1b05d5437bf45bee5e3104772dea06ed51764f1b +Author: dtucker@openbsd.org +Date: Tue Oct 22 07:13:28 2024 +0000 + + upstream: Remove sshd logfile in start_sshd + + ... and ssh and sshd log wrappers before recreating them. Prevents "can't + create" errors during tests when running tests without SUDO after having + run them with SUDO. + + OpenBSD-Regress-ID: 2f0a83532e3dccd673a9bf0291090277268c69a6 + +commit 307ab3c7720f8879b835614b02687358ee4df9b9 +Author: dtucker@openbsd.org +Date: Tue Oct 22 06:16:26 2024 +0000 + + upstream: Add a sshd debug wrapper + + ... to run all of the subprograms from the build directory while + developing and debugging. Should help prevent accidentally testing + against unchanged installed sshd-auth and sshd-session binaries. ok djm@ + + OpenBSD-Commit-ID: 61760cdc98c2bc8f1e9f83a6f97cca0f66b52e69 + +commit 87bd1cb3ccba5e91d2650eb7f753c898ee43858e +Author: dtucker@openbsd.org +Date: Tue Oct 22 06:13:00 2024 +0000 + + upstream: Make debug call printf("%s", NULL) safe. + + Prevents problems on platforms where this isn't safe (which it's not + required to be). ok djm@ + + OpenBSD-Commit-ID: 8fa4ce3ad90915c925b81b99a79ab920b0523387 + +commit c44c349edd157b2c00c42bd5ef5f9dfb37de26f3 +Author: Darren Tucker +Date: Tue Oct 22 17:48:32 2024 +1100 + + Resync cvsid missed in commit 6072e4c9. + +commit fe4305c37ffe53540a67586854e25f05cf615849 +Author: djm@openbsd.org +Date: Fri Oct 18 05:53:26 2024 +0000 + + upstream: mention that LocalForward and RemoteForward can accept Unix + + domain socket paths; GHPR115 + + OpenBSD-Commit-ID: a8a34d0a0c51a9ddab3dfce615f9878fa76ef842 + +commit 9c97b6af8e052ab5ffe0f9096fadc8f9a4d0ed0f +Author: djm@openbsd.org +Date: Fri Oct 18 05:45:40 2024 +0000 + + upstream: remove duplicate check; GHPR392 from Pedro Martelletto + + OpenBSD-Commit-ID: 597ab7dd3f0e78939d2659fc1904d0f39ee95487 + +commit d9cd208e89a471a3ff8adfcec68d6210af9e9fd5 +Author: djm@openbsd.org +Date: Fri Oct 18 05:37:24 2024 +0000 + + upstream: allow "-" as output file for moduli screening + + based on GHPR393 + + OpenBSD-Commit-ID: 1517763764eb55d03a6092dd120d2909c6fef0e1 + +commit 5eb5c4b2820d0636b1eccee646fb32ec946c4a95 +Author: djm@openbsd.org +Date: Fri Oct 18 05:32:51 2024 +0000 + + upstream: ssh-keyscan doesn't need it's own sshfatal() definition, it + + can use the shared one from fatal.c + + based on GHPR401 from lengyijun + + OpenBSD-Commit-ID: 8ea75ea99f27f464c9223cbc89cb046ccf9cd5c4 + +commit 0a1e75499e2c6fc258ee903645c878480949f362 +Author: djm@openbsd.org +Date: Fri Oct 18 05:14:51 2024 +0000 + + upstream: in _ssh_order_hostkeyalgs() consider ECDSA curve type when + + arranging the hostkey algorithms. AFAIK this code is unused in OpenSSH, but I + guess others are using it + + based on GHPR387 from Pawel Jakub Dawidek + + OpenBSD-Commit-ID: 4d462495ac0c40f7b7dd66178e0005b9b2128225 + +commit d01ee7a88c5f4b1aa8c75a7c739f8f3bc1ad8bde +Author: djm@openbsd.org +Date: Fri Oct 18 05:03:34 2024 +0000 + + upstream: require control-escape character sequences passed via the '-e + + ^x' commandline to be exactly two characters long. Avoids one by OOB read if + ssh is invoked as "ssh -e^ ..." + + Spotted by Maciej Domanski in GHPR368 + + OpenBSD-Commit-ID: baa72bc60898fc5639e6c62de7493a202c95823d + +commit 74ff6382f5743e09930e6cbd195dac65cd6062c9 +Author: djm@openbsd.org +Date: Fri Oct 18 04:30:09 2024 +0000 + + upstream: remove addr.[ch] functions that are unused and + + visbility-restrict ones that are unused outside the implementation itself; + based on GHPR#282 by tobias@ + + OpenBSD-Commit-ID: a0140f2418b4d46cfaa7b33febc0a0931f9b2744 + +commit a9d6d7d93c533fa729f08b405e786d912553f33e +Author: djm@openbsd.org +Date: Fri Oct 18 04:14:59 2024 +0000 + + upstream: unreachable POLLERR case; from ya0guang via GHPR485 + + OpenBSD-Commit-ID: b3c82655190532b01eb817e532742cfaa4687eff + +commit d76424bf279ff951383e21213eb3759ea4090674 +Author: djm@openbsd.org +Date: Fri Oct 18 04:11:54 2024 +0000 + + upstream: s/Sx/Cm/ for external references; from Domen Puncer + + Kugler via GHPR501 + + OpenBSD-Commit-ID: f864a34feb5d5ff17160cf7c42ad0f7744fe8a3f + +commit ca204b994e2981e7bf95627b3105408917105649 +Author: naddy@openbsd.org +Date: Mon Oct 14 23:53:34 2024 +0000 + + upstream: mention SshdAuthPath option; ok djm@ + + OpenBSD-Commit-ID: 9a5d3add25e4e77bd3805bc5583a842ecf34d85c + +commit be27770e840c4dd9d9fcad1aa879400c727d7c2f +Author: Darren Tucker +Date: Fri Oct 18 13:37:55 2024 +1100 + + Remove references to systrace and pledge sandboxes. + + ok djm@ + +commit 49e64bf63fbf2f14961062dafe8ef08cb816bb08 +Author: Pavel Miadzvedzeu +Date: Wed Apr 24 10:19:56 2024 +0300 + + Fix "undeclared 'ut'" error by replacing it with 'utx' + +commit 67f684733f60f66479854a2867b953de731e71b2 +Author: Darren Tucker +Date: Thu Oct 17 20:50:29 2024 +1100 + + Seed RNG when starting up sshd-auth. + + Makes builds configured --without-openssl work again since otherwise + the first use of the RNG comes after the sandbox init and it can't + open /dev/random. + +commit c06c681aeebbe8e84e7410095514e7ee91f7e6cb +Author: Darren Tucker +Date: Thu Oct 17 19:18:23 2024 +1100 + + MacOS 12 runners are deprecated, replace with 15. + +commit 39db1f23bafb48a7c0cc9c65c716a0370f4cc677 +Author: Damien Miller +Date: Thu Oct 17 13:28:47 2024 +1100 + + Fix lookup path for sshd-auth; bz3745 + +commit c537eeb1ae5f069450053b0027e64efe5bdb37d2 +Author: Damien Miller +Date: Wed Oct 16 08:28:21 2024 +1100 + + fix breakage; missing saved_argc symbol + +commit 98a0883bdef28a06c7e017f27adf21ba57898bf4 +Author: Damien Miller +Date: Mon Oct 14 17:17:50 2024 +1100 + + fix capsicum sandbox + +commit 164ea4380564a2a83713eacf71908e3946e5e4e4 +Author: Damien Miller +Date: Mon Oct 14 17:16:41 2024 +1100 + + put back some portable bits for sshd-auth.c + +commit f8edf08c258ee2918689872c4702302052729726 +Author: Damien Miller +Date: Mon Oct 14 14:49:25 2024 +1100 + + there's only one sandbox, move to a static global + +commit 4482f0042b41d3d63c3845d7ba9fcf47c9252a84 +Author: Damien Miller +Date: Mon Oct 14 14:49:20 2024 +1100 + + depend + +commit 74856204a353a187dc6e7706c6cf84b7f14d775d +Author: djm@openbsd.org +Date: Mon Oct 14 03:02:08 2024 +0000 + + upstream: regress support for split sshd-auth binary + + OpenBSD-Regress-ID: df7d18a87b475f70004770f0f4e404adba5f6ab7 + +commit 461741083d7254595fecea274e60fe3ebf3ce3f9 +Author: djm@openbsd.org +Date: Fri Sep 27 01:05:54 2024 +0000 + + upstream: test some more Match syntax, including criteria=arg and + + negations + + OpenBSD-Regress-ID: 67476baccc60bf1a255fd4e329ada950047b8b8d + +commit 6072e4c9385713e9c166f32cfca6a7e603d4f0b8 +Author: djm@openbsd.org +Date: Mon Oct 14 01:57:50 2024 +0000 + + upstream: Split per-connection sshd-session binary + + This splits the user authentication code from the sshd-session + binary into a separate sshd-auth binary. This will be executed by + sshd-session to complete the user authentication phase of the + protocol only. + + Splitting this code into a separate binary ensures that the crucial + pre-authentication attack surface has an entirely disjoint address + space from the code used for the rest of the connection. It also + yields a small runtime memory saving as the authentication code will + be unloaded after thhe authentication phase completes. + + Joint work with markus@ feedback deraadt@ + + Tested in snaps since last week + + OpenBSD-Commit-ID: 9c3b2087ae08626ec31b4177b023db600e986d9c + +commit fe6c6330c1a94c7a537efe9069853ce7a275c50a +Author: djm@openbsd.org +Date: Sun Oct 13 22:20:06 2024 +0000 + + upstream: don't start the ObscureKeystrokeTiming mitigations if + + there has been traffic on a X11 forwarding channel recently. + + Should fix X11 forwarding performance problems when this setting is + enabled. Patch from Antonio Larrosa via bz3655 + + OpenBSD-Commit-ID: 820284a92eb4592fcd3d181a62c1b86b08a4a7ab + +commit 538cd28598ae942c94b99855b06fdd937e2e7381 +Author: jsg@openbsd.org +Date: Sat Oct 12 10:50:37 2024 +0000 + + upstream: remove duplicate misc.h include ok dtucker@ + + OpenBSD-Commit-ID: fdd056e7854294834d54632b4282b877cfe4c12e + +commit 0051381a8c33740a77a1eca6859efa1c78887d80 +Author: djm@openbsd.org +Date: Sun Oct 6 23:37:17 2024 +0000 + + upstream: Turn off finite field (a.k.a modp) Diffie-Hellman key + + exchange in sshd by default. Specifically, this removes the + diffie-hellman-group* and diffie-hellman-group-exchange-* methods. The client + is unchanged and continues to support these methods by default. + + Finite field Diffie Hellman is slow and computationally expensive for + the same security level as Elliptic Curve DH or PQ key agreement while + offering no redeeming advantages. + + ECDH has been specified for the SSH protocol for 15 years and some + form of ECDH has been the default key exchange in OpenSSH for the last + 14 years. + + ok markus@ + + OpenBSD-Commit-ID: 4e238ad480a33312667cc10ae0eb6393abaec8da + +commit 67a115e7a56dbdc3f5a58c64b29231151f3670f5 +Author: djm@openbsd.org +Date: Thu Sep 26 23:55:08 2024 +0000 + + upstream: fix previous change to ssh_config Match, which broken on + + negated Matches; spotted by phessler@ ok deraadt@ + + OpenBSD-Commit-ID: b1c6acec66cd5bd1252feff1d02ad7129ced37c7 + +commit 220b6c1290042acd5180d783dea01efe1365c265 +Author: jsg@openbsd.org +Date: Wed Sep 25 23:01:39 2024 +0000 + + upstream: remove some unused defines; ok djm@ + + OpenBSD-Commit-ID: 3a63e4e11d455704f684c28715d61b17f91e0996 + +commit 3ef4f6e8a4d774f73852391fdccbb95f39fc71bf +Author: jmc@openbsd.org +Date: Wed Sep 25 06:13:01 2024 +0000 + + upstream: remove some unneeded Xo/Xc calls; from evan silberman the + + original diff had a couple of errors, which i've fixed + + OpenBSD-Commit-ID: f37ad5888adbc0d4e1cd6b6de237841f4b1e650d + +commit 3f02368e8e9121847727c46b280efc280e5eb615 +Author: djm@openbsd.org +Date: Wed Sep 25 01:24:04 2024 +0000 + + upstream: fix regression introduced when I switched the "Match" + + criteria tokeniser to a more shell-like one. Apparently the old tokeniser + (accidentally?) allowed "Match criteria=argument" as well as the "Match + criteria argument" syntax that we tested for. + + People were using this syntax so this adds back support for + "Match criteria=argument" + + bz3739 ok dtucker + + OpenBSD-Commit-ID: d1eebedb8c902002b75b75debfe1eeea1801f58a + +commit 9517cc58577f85a0ba5f8bb46778dff625f0688f +Author: djm@openbsd.org +Date: Tue Sep 24 02:28:17 2024 +0000 + + upstream: some extra paranoia, reminded by jsg@ + + OpenBSD-Commit-ID: 22072bfa1df1391858ae7768a6c627e08593a91e + +commit 815a94e86a68c1000b8310cb47695cea9329516c +Author: Damien Miller +Date: Wed Sep 25 11:15:45 2024 +1000 + + gss-serv.c needs sys/param.h + + From Void Linux + +commit 76a618d2842c34c16cd21a4efc7230e2f459008d +Author: Damien Miller +Date: Wed Sep 25 11:13:05 2024 +1000 + + build construct_utmp() when USE_BTMP is set + + Fixes compile error on Void Linux/Musl + +commit d3aee17f6d395202eaa42a0c449b6da41f61527c +Author: Darren Tucker +Date: Tue Sep 24 18:41:44 2024 +1000 + + Test the flags from OpenWRT's package. + +commit 0f5d19e6fe4b58a89e6dc8c71a2aae30365d193e +Author: Christoph Ostarek +Date: Wed Jul 3 12:46:59 2024 +0200 + + fix utmpx ifdef + + 02e16ad95fb1f56ab004b01a10aab89f7103c55d did a copy-paste for + utmpx, but forgot to change the ifdef appropriately + +commit e03239f999acf9dc3da0f2f72bde36abbe678911 +Author: jsg@openbsd.org +Date: Sun Sep 22 12:56:21 2024 +0000 + + upstream: remove some unused defines; ok djm@ + + OpenBSD-Commit-ID: 81869ee6356fdbff19dae6ff757095e6b24de712 + +commit a35f543d3a6275fef781e515c262d1c687c3bc28 +Author: jsg@openbsd.org +Date: Fri Sep 20 02:00:46 2024 +0000 + + upstream: remove unneeded semicolons; checked by millert@ + + OpenBSD-Commit-ID: 3fb621a58e04b759a875ad6a33f35bb57ca80231 + +commit 1641f2d4d6e05d2147913442864cae546e64f08b +Author: Darren Tucker +Date: Mon Sep 23 20:52:31 2024 +1000 + + Add 9.9 branch to CI status console. + +commit 46d1fb16b20e971b9ac15e86a3d3e350b49c9ad6 +Author: Damien Miller +Date: Fri Sep 20 08:20:13 2024 +1000 + + update version numbers + +commit 0bdca1f218971b38728a0a129f482476baff0968 +Author: djm@openbsd.org +Date: Thu Sep 19 22:17:44 2024 +0000 + + upstream: openssh-9.9 + + OpenBSD-Commit-ID: 303417285f1a73b9cb7a2ae78d3f493bbbe31f98 + +commit ef2d7f2d3e1b4c9ae71bacf963e76a92ab8be543 +Author: Damien Miller +Date: Wed Sep 18 16:03:23 2024 +1000 + + include openbsd-compat/base64.c license in LICENSE + +commit 7ef362b989c8d1f7596f557f22e5924b9c08f0ea +Author: Damien Miller +Date: Wed Sep 18 09:01:23 2024 +1000 + + conditionally include mman.h in arc4random code + +commit 5fb2b5ad0e748732a27fd8cc16a7ca3c21770806 +Author: Damien Miller +Date: Tue Sep 17 11:53:24 2024 +1000 + + fix bug in recently-added sntrup761 fuzzer + + key values need to be static to persist across invocations; + spotted by the Qualys Security Advisory team. + +commit 0ca128c9ee894f1b0067abd473bfb33171df67f8 +Author: djm@openbsd.org +Date: Mon Sep 16 05:37:05 2024 +0000 + + upstream: use 64 bit math to avoid signed underflow. upstream code + + relies on using -fwrapv to provide defined over/underflow behaviour, but we + use -ftrapv to catch integer errors and abort the program. ok dtucker@ + + OpenBSD-Commit-ID: 8933369b33c17b5f02479503d0a92d87bc3a574b + +commit f82e5e22cad88c81d8a117de74241328c7b101c3 +Author: jmc@openbsd.org +Date: Sun Sep 15 08:27:38 2024 +0000 + + upstream: minor grammar/sort fixes for refuseconnection; ok djm + + OpenBSD-Commit-ID: 1c81f37b138b8b66abba811fec836388a0f3e6da + +commit 0c1165fc78e8fe69b5df71f81a8f944554a68b53 +Author: Damien Miller +Date: Sun Sep 15 13:30:13 2024 +1000 + + avoid gcc warning in fuzz test + +commit ce171d0718104b643854b53443ff72f7283d33f2 +Author: djm@openbsd.org +Date: Sun Sep 15 03:09:44 2024 +0000 + + upstream: bad whitespace in config dump output + + OpenBSD-Commit-ID: d899c13b0e8061d209298eaf58fe53e3643e967c + +commit 671c440786a5a66216922f15d0007b60f1e6733f +Author: Damien Miller +Date: Sun Sep 15 12:53:59 2024 +1000 + + use construct_utmp to construct btmp records + + Simpler and removes some code with the old-style BSD license. + +commit 930cb02b6113df72fbc732b9feb8e4f490952a81 +Author: djm@openbsd.org +Date: Sun Sep 15 02:20:51 2024 +0000 + + upstream: update the Streamlined NTRU Prime code from the "ref" + + implementation in SUPERCOP 20201130 to the "compact" implementation in + SUPERCOP 20240808. The new version is substantially faster. Thanks to Daniel + J Bernstein for pointing out the new implementation (and of course for + writing it). + + tested in snaps/ok deraadt@ + + OpenBSD-Commit-ID: bf1a77924c125ecdbf03e2f3df8ad13bd3dafdcb + +commit 9306d6017e0ce5dea6824c29ca5ba5673c2923ad +Author: djm@openbsd.org +Date: Sun Sep 15 01:19:56 2024 +0000 + + upstream: document Match invalid-user + + OpenBSD-Commit-ID: 2c84a9b517283e9711e2812c1f268081dcb02081 + +commit 0118a4da21147a88a56dc8b90bbc2849fefd5c1e +Author: djm@openbsd.org +Date: Sun Sep 15 01:18:26 2024 +0000 + + upstream: add a "Match invalid-user" predicate to sshd_config Match + + options. + + This allows writing Match conditions that trigger for invalid username. + E.g. + + PerSourcePenalties refuseconnection:90s + Match invalid-user + RefuseConnection yes + + Will effectively penalise bots try to guess passwords for bogus accounts, + at the cost of implicitly revealing which accounts are invalid. + + feedback markus@ + + OpenBSD-Commit-ID: 93d3a46ca04bbd9d84a94d1e1d9d3a21073fbb07 + +commit 7875975136f275619427604900cb0ffd7020e845 +Author: djm@openbsd.org +Date: Sun Sep 15 01:11:26 2024 +0000 + + upstream: Add a "refuseconnection" penalty class to sshd_config + + PerSourcePenalties + + This allows penalising connection sources that have had connections + dropped by the RefuseConnection option. ok markus@ + + OpenBSD-Commit-ID: 3c8443c427470bb3eac1880aa075cb4864463cb6 + +commit 8d21713b669b8516ca6d43424a356fccc37212bb +Author: djm@openbsd.org +Date: Sun Sep 15 01:09:40 2024 +0000 + + upstream: Add a sshd_config "RefuseConnection" option + + If set, this will terminate the connection at the first authentication + request (this is the earliest we can evaluate sshd_config Match blocks) + + ok markus@ + + OpenBSD-Commit-ID: 43cc2533984074c44d0d2f92eb93f661e7a0b09c + +commit acad117e66018fe1fa5caf41b36e6dfbd61f76a1 +Author: djm@openbsd.org +Date: Sun Sep 15 00:58:01 2024 +0000 + + upstream: switch sshd_config Match processing to the argv tokeniser + + too; ok markus@ + + OpenBSD-Commit-ID: b74b5b0385f2e0379670e2b869318a65b0bc3923 + +commit baec3f7f4c60cd5aa1bb9adbeb6dfa4a172502a8 +Author: djm@openbsd.org +Date: Sun Sep 15 00:57:36 2024 +0000 + + upstream: switch "Match" directive processing over to the argv + + string tokeniser, making it possible to use shell-like quoting in Match + directives, particularly "Match exec". ok markus@ + + OpenBSD-Commit-ID: 0877309650b76f624b2194c35dbacaf065e769a5 + +commit dd424d7c382c2074ab70f1b8ad4f169a10f60ee7 +Author: djm@openbsd.org +Date: Sun Sep 15 00:47:01 2024 +0000 + + upstream: include pathname in some of the ssh-keygen passphrase + + prompts. Helps the user know what's going on when ssh-keygen is invoked via + other tools. Requested in GHPR503 + + OpenBSD-Commit-ID: 613b0bb6cf845b7e787d69a5b314057ceda6a8b6 + +commit 62bbf8f825cc390ecb0523752ddac1435006f206 +Author: djm@openbsd.org +Date: Sun Sep 15 00:41:18 2024 +0000 + + upstream: Do not apply authorized_keys options when signature + + verification fails. Prevents restrictive key options being incorrectly + applied to subsequent keys in authorized_keys. bz3733, ok markus@ + + OpenBSD-Commit-ID: ba3776d9da4642443c19dbc015a1333622eb5a4e + +commit 49f325fd47af4e53fcd7aafdbcc280e53f5aa5ce +Author: Wu Weixin +Date: Fri Aug 2 22:16:40 2024 +0800 + + Fix without_openssl always being set to 1 + + In Fedora systems, %{?rhel} is empty. In RHEL systems, %{?fedora} is + empty. Therefore, the original code always sets without_openssl to 1. + +commit c21c3a2419bbc1c59cb1a16ea356e703e99a90d9 +Author: djm@openbsd.org +Date: Thu Sep 12 00:36:27 2024 +0000 + + upstream: Relax absolute path requirement back to what it was prior to + + OpenSSH 9.8, which incorrectly required that sshd was started with an + absolute path in inetd mode. bz3717, patch from Colin Wilson + + OpenBSD-Commit-ID: 25c57f22764897242d942853f8cccc5e991ea058 + +commit 1bc426f51b0a5cfdcfbd205218f0b6839ffe91e9 +Author: naddy@openbsd.org +Date: Mon Sep 9 14:41:21 2024 +0000 + + upstream: document the mlkem768x25519-sha256 key exchange algorithm + + OpenBSD-Commit-ID: fa18dccdd9753dd287e62ecab189b3de45672521 + +commit 0a2db61a5ffc64d2e2961c52964f933879952fc7 +Author: Darren Tucker +Date: Tue Sep 10 21:11:14 2024 +1000 + + Spell omnios test host correctly. + +commit 059ed698a47c9af541a49cf754fd09f984ac5a21 +Author: Darren Tucker +Date: Tue Sep 10 18:52:02 2024 +1000 + + Add omnios test target. + +commit f4ff91575a448b19176ceaa8fd6843a25f39d572 +Author: Darren Tucker +Date: Tue Sep 10 18:45:55 2024 +1000 + + Wrap stdint.h in ifdef. + +commit ff714f001d20a9c843ee1fd9d92a16d40567d264 +Author: Darren Tucker +Date: Mon Sep 9 19:31:54 2024 +1000 + + Also test PAM on dfly64. + +commit 509b757c052ea969b3a41fc36818b44801caf1cf +Author: Damien Miller +Date: Mon Sep 9 21:50:14 2024 +1000 + + stubs for ML-KEM KEX functions + + used for C89 compilers + +commit 273581210c99ce7275b8efdefbb9f89e1c22e341 +Author: Damien Miller +Date: Mon Sep 9 17:30:38 2024 +1000 + + declare defeat trying to detect C89 compilers + + I can't find a reliable way to detect the features the ML-KEM code + requires in configure. Give up for now and use VLA support (that we + can detect) as a proxy for "old compiler" and turn off ML-KEM if + it isn't supported. + +commit e8a0f19b56dfa20f98ea9876d7171ec315fb338a +Author: Damien Miller +Date: Mon Sep 9 16:46:40 2024 +1000 + + fix previous; check for C99 compound literals + + The previous commit was incorrect (or at least insufficient), the + ML-KEM code is actually using compound literals, so test for them. + +commit 7c07bec1446978bebe0780ed822c8fedfb377ae8 +Author: Damien Miller +Date: Mon Sep 9 16:06:21 2024 +1000 + + test for compiler feature needed for ML-KEM + + The ML-KEM implementation we uses need the compiler to support + C99-style named struct initialisers (e.g foo = {.bar = 1}). We + still support (barely) building OpenSSH with older compilers, so + add a configure test for this. + +commit d469d5f348772058789d35332d1ccb0b109c28ef +Author: djm@openbsd.org +Date: Mon Sep 9 03:13:39 2024 +0000 + + upstream: test mlkem768x25519-sha256 + + OpenBSD-Regress-ID: 7baf6bc39ae55648db1a2bfdc55a624954847611 + +commit 62fb2b51bb7f6863c3ab697f397b2068da1c993f +Author: djm@openbsd.org +Date: Mon Sep 9 02:39:57 2024 +0000 + + upstream: pull post-quantum ML-KEM/x25519 key exchange out from + + compile-time flag now than an IANA codepoint has been assigned for the + algorithm. + + Add mlkem768x25519-sha256 in 2nd KexAlgorithms preference slot. + + ok markus@ + + OpenBSD-Commit-ID: 9f50a0fae7d7ae8b27fcca11f8dc6f979207451a + +commit a8ad7a2952111c6ce32949a775df94286550af6b +Author: djm@openbsd.org +Date: Fri Sep 6 02:30:44 2024 +0000 + + upstream: make parsing user@host consistently look for the last '@' in + + the string rather than the first. This makes it possible to use usernames + that contain '@' characters. + MIME-Version: 1.0 + Content-Type: text/plain; charset=UTF-8 + Content-Transfer-Encoding: 8bit + + Prompted by Max Zettlmeißl; feedback/ok millert@ + + OpenBSD-Commit-ID: 0b16eec246cda15469ebdcf3b1e2479810e394c5 + +commit 13cc78d016b67a74a67f1c97c7c348084cd9212c +Author: djm@openbsd.org +Date: Wed Sep 4 05:33:34 2024 +0000 + + upstream: be more strict in parsing key type names. Only allow + + shortnames (e.g "rsa") in user-interface code and require full SSH protocol + names (e.g. "ssh-rsa") everywhere else. + + Prompted by bz3725; ok markus@ + + OpenBSD-Commit-ID: b3d8de9dac37992eab78adbf84fab2fe0d84b187 + +commit ef8472309a68e319018def6f8ea47aeb40d806f5 +Author: djm@openbsd.org +Date: Wed Sep 4 05:11:33 2024 +0000 + + upstream: fix RCSID in output + + OpenBSD-Commit-ID: 889ae07f2d2193ddc4351711919134664951dd76 + +commit ba2ef20c75c5268d4d1257adfc2ac11c930d31e1 +Author: jmc@openbsd.org +Date: Tue Sep 3 06:17:48 2024 +0000 + + upstream: envrionment -> environment; + + OpenBSD-Commit-ID: b719f39c20e8c671ec6135c832d6cc67a595af9c + +commit e66c0c5673a4304a3a9fbf8305c6a19f8653740f +Author: Damien Miller +Date: Wed Sep 4 15:35:29 2024 +1000 + + add basic fuzzers for our import of sntrup761 + +commit d19dea6330ecd4eb403fef2423bd7e127f4c9828 +Author: djm@openbsd.org +Date: Tue Sep 3 05:58:56 2024 +0000 + + upstream: regression test for Include variable expansion + + OpenBSD-Regress-ID: 35477da3ba1abd9ca64bc49080c50a9c1350c6ca + +commit 8c4d6a628051e318bae2f283e8dc38b896400862 +Author: djm@openbsd.org +Date: Tue Sep 3 05:29:55 2024 +0000 + + upstream: allow the "Include" directive to expand the same set of + + %-tokens that "Match Exec" and environment variables. + + ok dtucker@ + + OpenBSD-Commit-ID: 12ef521eaa966a9241e684258564f52f1f3c5d37 + +commit 51b82648b6827675fc0cde21175fd1ed8e89aab2 +Author: djm@openbsd.org +Date: Mon Sep 2 12:18:35 2024 +0000 + + upstream: missing ifdef + + OpenBSD-Commit-ID: 85f09da957dd39fd0abe08fe5ee19393f25c2021 + +commit f68312eb593943127b39ba79a4d7fa438c34c153 +Author: djm@openbsd.org +Date: Mon Sep 2 12:13:56 2024 +0000 + + upstream: Add experimental support for hybrid post-quantum key exchange + + ML-KEM768 with ECDH/X25519 from the Internet-draft: + https://datatracker.ietf.org/doc/html/draft-kampanakis-curdle-ssh-pq-ke-03 + + This is based on previous patches from markus@ but adapted to use the + final FIPS203 standard ML-KEM using a formally-verified implementation + from libcrux. + + Note this key exchange method is still a draft and thus subject to + change. It is therefore disabled by default; set MLKEM=yes to build it. + We're making it available now to make it easy for other SSH + implementations to test against it. + + ok markus@ deraadt@ + + OpenBSD-Commit-ID: 02a8730a570b63fa8acd9913ec66353735dea42c + +commit 05f2b141cfcc60c7cdedf9450d2b9d390c19eaad +Author: Antonio Larrosa +Date: Fri Aug 23 12:21:06 2024 +0200 + + Don't skip audit before exitting cleanup_exit + + This fixes an issue where the SSH_CONNECTION_ABANDON event is not + audited because cleanup_exit overrides the regular _exit too soon and + as a result, failed auth attempts are not logged correctly. + + The problem was introduced in 81c1099d22b81ebfd20a334ce986c4f753b0db29 + where the code from upstream was merged before the audit_event call when + it should have been merged right before the _exit call in order to honor + the comment that just mentions an override of the exit value. + +commit 16eaf9d401e70996f89f3f417738a8db421aa959 +Author: djm@openbsd.org +Date: Wed Aug 28 12:08:26 2024 +0000 + + upstream: fix test: -F is the argument to specify a non-default + + ssh_config, not -f (this is sadly not a new bug) + + OpenBSD-Regress-ID: 45a7bda4cf33f2cea218507d8b6a55cddbcfb322 + +commit 10ccf611ab8ecba9ce6b0548c5ccd8c1220baf92 +Author: deraadt@openbsd.org +Date: Fri Aug 23 04:51:00 2024 +0000 + + upstream: As defined in the RFC, the SSH protocol has negotiable + + compression support (which is requested as the name "zlib"). Compression + starts very early in the session. Relative early in OpenSSH lifetime, privsep + was added to sshd, and this required a shared-memory hack so the two + processes could see what was going on in the dataflow. This shared-memory + hack was soon recognized as a tremendous complexity risk, because it put libz + (which very much trusts it's memory) in a dangerous place, and a new option + ("zlib@openssh.com") was added begins compression after authentication (aka + delayed-compression). That change also permitted removal of the + shared-memory hack. Despite removal from the server, the old "zlib" support + remained in the client, to allow negotiation with non-OpenSSH daemons which + lack the delayed-compression option. This commit deletes support for the + older "zlib" option in the client. It reduces our featureset in a small way, + and encourages other servers to move to a better design. The SSH protocol is + different enough that compressed-key-material attacks like BEAST are + unlikely, but who wants to take the chance? We encourage other ssh servers + who care about optional compression support to add delayed-zlib support. + (Some already do "zlib@openssh.com") ok djm markus + + OpenBSD-Commit-ID: 6df986f38e4ab389f795a6e39e7c6857a763ba72 + +commit aee54878255d71bf93aa6e91bbd4eb1825c0d1b9 +Author: djm@openbsd.org +Date: Thu Aug 22 23:11:30 2024 +0000 + + upstream: sntrup761x25519-sha512 now has an IANA codepoint assigned, so + + we can make the algorithm available without the @openssh.com suffix too. ok + markus@ deraadt@ + + OpenBSD-Commit-ID: eeed8fcde688143a737729d3d56d20ab4353770f + +commit a76a6b85108e3032c8175611ecc5746e7131f876 +Author: Darren Tucker +Date: Thu Aug 22 20:36:12 2024 +1000 + + Move rekey test into valgrind-2. + + Now that the rekey test has been optimized it's fast enough to not be in + its own valgrind test, so move it into valgrind-2, which is currently + the quickest of the others, bringing all of them to roughly the same + runtime of ~1.1 hours. + +commit 7e75e3f57c41b9a6e6401e7674d7c2ff5c33975b +Author: dtucker@openbsd.org +Date: Thu Aug 22 10:21:02 2024 +0000 + + upstream: Use aes128-ctr for MAC tests since default has implicit MAC. + + Also verify that the Cipher or MAC we intended to use is actually the one + selected during the test. + + OpenBSD-Regress-ID: ff43fed30552afe23d1364526fe8cf88cbfafe1d + +commit ebc890b8b4ba08c84cd1066b7b94b2b11f6c4cb4 +Author: Damien Miller +Date: Thu Aug 22 09:45:49 2024 +1000 + + fix incorrect default for PasswordAuthentication + + merge botch spotted by gsgleason + +commit 15ace435ea1c2fab2a1cc7d9c3157fe20c776b80 +Author: dtucker@openbsd.org +Date: Wed Aug 21 10:33:27 2024 +0000 + + upstream: Some awks won't match on the \r so delete it instead. Fixes + + regress in portable on, eg Solaris. + + OpenBSD-Regress-ID: 44a96d6d2f8341d89b7d5fff777502b92ac9e9ba + +commit 51c96b6ed627779a04493a8fe25747996a37f3c2 +Author: dtucker@openbsd.org +Date: Wed Aug 21 07:06:27 2024 +0000 + + upstream: Import regenerated moduli. + + OpenBSD-Commit-ID: 5db7049ad5558dee5b2079d3422e8ddab187c1cc + +commit 25c52f37a82c4da48ec537de37d7c168982b8d6d +Author: dtucker@openbsd.org +Date: Wed Aug 21 06:59:08 2024 +0000 + + upstream: Use curve25519-sha256 kex where possible. + + Except where we're explicitly testing a different kex, use + curve25519-sha256 since it's faster than the default and supported even + when configured without OpenSSL. Add a check to ensure that the kex we + intended to test is the one we actually tested. Speeds test up by ~5%. + + OpenBSD-Regress-ID: 3b27fcc2ae953cb08fd82a0d3155c498b226d6e0 + +commit 3eb62b7ba49483c309b483eb9002a679014f3887 +Author: dtucker@openbsd.org +Date: Tue Aug 20 12:36:59 2024 +0000 + + upstream: Send only as much data as needed to trigger rekeying. Speeds + + up tests by about 10% in the common case, hopefully more when instrumented + with something like valgrind. + + OpenBSD-Regress-ID: 7bf9292b4803357efcf0baf7cfbdc8521f212da1 + +commit cbd3f034bbf7853618fac99d7d868a2250154ea7 +Author: Damien Miller +Date: Wed Aug 21 09:18:29 2024 +1000 + + simplify sshkey_prekey_alloc(); always use mmap + +commit 4442bbc2fc661277a6dabfedb756a7e15ee8b8b8 +Author: dtucker@openbsd.org +Date: Tue Aug 20 09:15:49 2024 +0000 + + upstream: Merge AEAD test into main test loop. + + Removes 3 duplicate tests and speeds overall test up by about 1%. + + OpenBSD-Regress-ID: 5e5c9ff3f7588091ed369e34ac28520490ad2619 + +commit 829976a63fd1efae3a4c3e7c16fded59d92edb67 +Author: dtucker@openbsd.org +Date: Tue Aug 20 09:02:45 2024 +0000 + + upstream: Set a default RekeyLimit of 256k. + + Used unless overridden by a command-line flag, which simplifies some of + the ssh command lines. + + OpenBSD-Regress-ID: e7cffa57027088e10336e412b34113969f88cb87 + +commit 57d02c9ea36aebad4e7146d46e041b6b2e582f7f +Author: dtucker@openbsd.org +Date: Tue Aug 20 07:52:43 2024 +0000 + + upstream: Add Compression=no to default ssh_config. + + All of the rekey tests use it (otherwise the encrypted byte counts would + not match) so this lets us simplify the command lines. + + OpenBSD-Regress-ID: dab7ce10f4cf6c68827eb8658141272aab3ea262 + +commit 7254eb26f7c0772c4b47c3b32f6d1b15855cdd8c +Author: dtucker@openbsd.org +Date: Tue Aug 20 07:41:35 2024 +0000 + + upstream: Remove duplicate curve25519-sha256 kex. + + curve25519-sha256@libssh.org is the pre-standardization name for the same + thing, so remove it as a duplicate. Speeds up test by a tiny amount. + + OpenBSD-Regress-ID: 5a5ee5fa1595a6e140b1cc16040bedf5996a5715 + +commit 749896b874928c2785256cae4d75161dc3bfcc7d +Author: dtucker@openbsd.org +Date: Tue Aug 20 07:27:25 2024 +0000 + + upstream: Unnest rekey param parsing test and use ssh not sshd. + + ssh uses the same parsing code, now has "-G" to dump its config and is + slightly faster to start up. This speeds up the test slightly (~5%) in the + common case but should help more during instrumented tests, eg under + valgrind, where startup costs are magnified. + + OpenBSD-Regress-ID: 07c3acaf4c728e641033071f4441afc88141b0d0 + +commit 2b1762115481ff2b7a60fd4db2ae69b725437462 +Author: djm@openbsd.org +Date: Tue Aug 20 11:10:04 2024 +0000 + + upstream: actually use the length parameter that was passed in rather + + than a constant (this makes no difference in practice because the length is + always the same); reported by martin AT nmkd.net + + OpenBSD-Commit-ID: 4aecce232c2fe9b16e9217ff6bcb3c848d853e7e + +commit d922762ca16a7381131b242f49d7376c41fabcb5 +Author: Damien Miller +Date: Tue Aug 20 13:55:30 2024 +1000 + + private key coredump protection for Linux/FreeBSD + + platforms not supporting coredump exclusion using mmap/madvise flags + fall back to plain old malloc(3). + +commit cc048ca536d6bed6f2285b07040b0d57cd559ba5 +Author: djm@openbsd.org +Date: Tue Aug 20 03:48:30 2024 +0000 + + upstream: place shielded keys (i.e. keys at rest in RAM) into memory + + allocated using mmap(3) with MAP_CONCEAL set. This prevents exposure of the + key material in coredumps, etc (this is in addition to other measures we take + in this area). + + ok deraadt@ + + OpenBSD-Commit-ID: cbbae59f337a00c9858d6358bc65f74e62261369 + +commit a0b35c791cad1f85481b23ba46373060292e1c80 +Author: djm@openbsd.org +Date: Sat Aug 17 08:35:04 2024 +0000 + + upstream: mention that ed25519 is the default key type generated and + + clarify that rsa-sha2-512 is the default signature scheme when RSA is in use. + Based on GHPR505 from SebastianRzk + + OpenBSD-Commit-ID: 1d90df71636a04601685d2a10a8233bcc8d4f4c5 + +commit 127a50f2c80572ed1a021feb11ecf941e92cbbef +Author: djm@openbsd.org +Date: Sat Aug 17 08:23:04 2024 +0000 + + upstream: fix minor memory leak in Subsystem option parsing; from + + Antonio Larrosa via GHPR515 + + OpenBSD-Commit-ID: fff3bbefd1b2c45c98cbe45c6b857b15d8a2d364 + +commit 171427261d2079941eb1041079dbae875da37cbc +Author: djm@openbsd.org +Date: Sat Aug 17 08:09:50 2024 +0000 + + upstream: fix swapping of source and destination addresses in some sshd + + log messages + + OpenBSD-Commit-ID: 24d4cbb86325275df1f037545aa3b91456e52d25 + +commit 2a50a8f1fa57857a5e124a2280bcf61cc63c77f7 +Author: Darren Tucker +Date: Sat Aug 17 11:10:19 2024 +1000 + + Add compat functions for EVP_Digest{Sign,Verify}. + + This should make LibreSSL 3.1.x through 3.3.x work again. Code from + tb@, ok djm@. Restore the test configs covering those. + +commit 1c3a7145260e03037cc18715b883880836fd122d +Author: Philip Hands +Date: Thu Aug 8 13:03:51 2024 +0200 + + make sure that usage & man page match + + SSH-Copy-ID-Upstream: da5b1abe55b72a16e0430e7598e1573da01779c0 + +commit cd0d681645b9adcf2467e7838bfd9d5142de4c4e +Author: Philip Hands +Date: Thu Aug 8 13:01:47 2024 +0200 + + update copyright notices + + Bump the year to 2024, but also reflect the fact that hands.com Ltd. has + been wound up in the UK, and its assets (including this copyright) have + now reverted to its owner, Philip Hands. + + SSH-Copy-ID-Upstream: 0e4c4d072747a6568b11a790c29dd1b4ce663d7f + +commit 7fc9ccdce18841ebd0a97e31e43258512ab32a32 +Author: Philip Hands +Date: Sun Aug 4 20:45:00 2024 +0200 + + restore optionality of -i's argument + + SSH-Copy-ID-Upstream: f70e3abb510e4eeb040b47894e41828246c1b720 + +commit c37aa7012b1a3c2c322fd19e71310aadc90fc674 +Author: Philip Hands +Date: Fri Aug 2 15:52:07 2024 +0200 + + avoid exploring .ssh/id*.pub subdirectories + + SSH-Copy-ID-Upstream: 0b9e08b7707ad16de3c8e6a0410d9f42fbd56997 + +commit 777dce9e2e0d12f7e81e162f77749f30899869fe +Author: Philip Hands +Date: Fri Aug 2 10:07:11 2024 +0200 + + ensure that we're always told the source of keys + + SSH-Copy-ID-Upstream: 1bee96f4793e8ec3fab9f9361204ae58f5cc7cae + +commit fb94fd2339848e40cad6c9bb42b822244cc1a7bc +Author: Philip Hands +Date: Wed Jul 31 23:19:51 2024 +0200 + + add $HOME to ERROR if one cannot write to ~/.ssh + + SSH-Copy-ID-Upstream: ebef3e9c06e0447bff06e9d84b33023cf592e0ba + +commit eb5aafa1ffaeee75799141ec5ded406a65ec7d18 +Author: Philip Hands +Date: Wed Jul 31 23:19:03 2024 +0200 + + assert that SCRATCH_DIR is a writable directory + + SSH-Copy-ID-Upstream: ecb2b9d10883b9a16df56c83896c9bb47a80cde2 + +commit abcc460a2af46f0d812f8433d97a8eae1d80724c +Author: Philip Hands +Date: Wed Jul 31 23:17:54 2024 +0200 + + quote to avoid potential for word splitting + + SSH-Copy-ID-Upstream: f379adbe06ac2ef1daf0f130752234c7f8b97e3c + +commit b3f91411fd1473605f74c40c1a91a024c7171e27 +Author: Philip Hands +Date: Wed Jul 31 23:15:11 2024 +0200 + + ensure ERROR output goes to STDERR + + SSH-Copy-ID-Upstream: ac394b05eead3b91feb7c2ae4129a3e9b892f1e2 + +commit 674b8f30f0dbacd787eb1e4e7e1ece34b5543d8f +Author: Philip Hands +Date: Thu Aug 1 14:03:06 2024 +0200 + + avoid extra space when no arg given to -i option + + SSH-Copy-ID-Upstream: feca9e67e6e37c5653445d1c733569d7abb1770e + +commit 0efa0e1c41427c0c6ba839a18c72c1afcd7b7cc0 +Author: Philip Hands +Date: Wed Jul 31 23:28:36 2024 +0200 + + put the -i before -[pP] (matching man pages) + + The man pages (ssh, sftp & ssh-copy-id) all list -i before the port + setting, so make the output match that order, which also seems more + natural with the port being next to the server. + + SSH-Copy-ID-Upstream: 34d5d614172c78f9a42249466c4b81975b8883a1 + +commit 87831345e9745f2d13bd7a4a7972809f6788f331 +Author: Shreyas Mahangade +Date: Mon Jul 29 15:26:05 2024 +0000 + + Minor space issue fixed + + SSH-Copy-ID-Upstream: 335e44d7be78b03962a54c3a5c99a2ff45294a54 + +commit 2f3010f4736b4b3f5c10a4be97a24e90ff04c5e7 +Author: Shreyas Mahangade +Date: Mon Jul 29 16:55:28 2024 +0530 + + Show identity file in 'ssh' command + + - Previously no identity file is shown in "ssh" command output on the line "Now try logging into the..." + - This commit makes sure whenever "ssh-copy-id" with "-i" is invoked, it also reflects in "ssh" command + + SSH-Copy-ID-Upstream: 58e022ec26cb2315eb3be581d01e0ba787082428 + +commit a13856374b894397a7682b32257ed0bf67cfede9 +Author: Damien Miller +Date: Fri Aug 16 08:30:20 2024 +1000 + + more OPENSSL_HAS_ECC + +commit 4da2a1a7f648979bea6eaf3b17f5f250faed4afc +Author: Damien Miller +Date: Thu Aug 15 23:35:54 2024 +1000 + + fix merge botch that broke !OPENSSL_HAS_ECC + +commit 2c53d2f32b8e3992b61682c909ae5bc5122b6e5d +Author: Damien Miller +Date: Thu Aug 15 15:09:45 2024 +1000 + + missed OPENSSL_HAS_ECC case + +commit 342dd7a219f39119b8b686b5aaa99c8e15ede368 +Author: Damien Miller +Date: Thu Aug 15 15:06:55 2024 +1000 + + retire testing aginst older LibreSSL versions + + libressl prior to 3.4.x lack support for the EVP_DigestSign and + EVP_DigestVerify APIs that we need now that sshkey is converted + to EVP_PKEY. + + If someone makes a good case for why we should support these versions + then we could bring back support with wrappers. + +commit a7c6ea8eebe0f179141ec5dbf0c9e5354417930f +Author: Damien Miller +Date: Thu Aug 15 12:44:17 2024 +1000 + + sync TEST_MALLOC_OPTIONS for OpenBSD + +commit 60c2cf22e8f64f35d8b1175e4671257313f2e4d3 +Author: Damien Miller +Date: Thu Aug 15 12:43:47 2024 +1000 + + remove gratuitious difference from OpenBSD + +commit 339c4fc60a6250429d41fa8713f783d82aad4551 +Author: djm@openbsd.org +Date: Thu Aug 15 00:52:23 2024 +0000 + + upstream: adapt to EVP_PKEY conversion + + OpenBSD-Regress-ID: 0e2d4efb0ed0e392e23cd8fda183fe56531ac446 + +commit 63a94f99b9d7c8a48182a40192e45879d1ba8791 +Author: djm@openbsd.org +Date: Fri Jul 19 04:33:36 2024 +0000 + + upstream: test transfers in mux proxy mode too + + OpenBSD-Regress-ID: 2edfc980628cfef3550649cab8d69fa23b5cd6c4 + +commit 7bdfc20516e288b58c8c847958059c7b141eeff9 +Author: djm@openbsd.org +Date: Thu Aug 15 00:51:51 2024 +0000 + + upstream: Convert RSA and ECDSA key to the libcrypto EVP_PKEY API. + + DSA remains unconverted as it will be removed within six months. + + Based on patches originally from Dmitry Belyavskiy, but significantly + reworked based on feedback from Bob Beck, Joel Sing and especially + Theo Buehler (apologies to anyone I've missed). + + ok tb@ + + OpenBSD-Commit-ID: d098744e89f1dc7e5952a6817bef234eced648b5 + +commit 0af06e2c5b898992a18c74333e75a0136506acc6 +Author: tobias@openbsd.org +Date: Wed Aug 14 15:42:18 2024 +0000 + + upstream: Reorder calloc arguments + + The first argument should be the amount, the second argument should be the + element size. Fixing this also silences some gcc compiler warnings for + portable. + + Spotted with Benny Baumann (BenBE at geshi dot org). + + ok djm@ + + OpenBSD-Commit-ID: 711ad6f7bd7fb48bf52208f2cf9f108cddb6d41a + +commit 56ce0aa3c6cf28d9fcbce3207457abeac91b5050 +Author: tobias@openbsd.org +Date: Wed Aug 14 15:40:30 2024 +0000 + + upstream: Extend sshbuf validation + + Multiple sshbuf structs can be linked through a parent/child relationship. + Make sure that a single sshbuf cannot be its own parent. If this would ever + happen, it would result in reference counting issues. + + This is a cheap way of testing this with very little overhead. It does not + detect A->B->A linkages though for performance reason and the fact that it + takes a programming error for this to occur anyway. + + Authored with Benny Baumann (BenBE at geshi dot org). + + ok djm@ + + OpenBSD-Commit-ID: fb3fa9ee2cad3c7e842ebadfd7f5db220c4aaf16 + +commit fc48ddf6998188517af42dce807e2088b6a0c0be +Author: tobias@openbsd.org +Date: Wed Aug 14 15:37:11 2024 +0000 + + upstream: Use freezero for better readability + + It has the same meaning as the current pair of calling explicit_bzero + and free. Spotted with Benny Baumann (BenBE at geshi dot org). + + ok djm@ + + OpenBSD-Commit-ID: 939fbe9ccf52d0d48c5fa53694d6f3bb9927970c + +commit 1ff6907ec26dac6ac59fe9fe232899a63b4c14d8 +Author: tobias@openbsd.org +Date: Wed Aug 14 15:35:23 2024 +0000 + + upstream: Fix typo in comment + + Spotted with Benny Baumann (BenBE at geshi dot org). + + ok djm@ + + OpenBSD-Commit-ID: 829160ac8ef3ad3409695ce3a3ade835061cae57 + +commit 487faaed8f3bb9ffb19e8f807a3da72895b16421 +Author: dlg@openbsd.org +Date: Wed Jul 31 12:00:18 2024 +0000 + + upstream: add a random amount of time (up to 4 seconds) to the + + grace login time. + + ok deraadt@ djm@ + + OpenBSD-Commit-ID: abd3c57aaa5861517529b322df79b6be35ee67f4 + +commit 2865f5b7520bed3e74fbbb5f8d7a44193d7a4314 +Author: naddy@openbsd.org +Date: Fri Jul 26 15:24:49 2024 +0000 + + upstream: document the reduced logingrace penalty + + OpenBSD-Commit-ID: 9b63e0e3599d524ddc10edc4f978081382c3548b + +commit 1ec0a64c5dc57b8a2053a93b5ef0d02ff8598e5c +Author: Darren Tucker +Date: Sun Jul 28 21:26:51 2024 +1000 + + Explicitly install libssl-devel cygwin. + + Should fix CI tests for cygwin default config. + +commit 0bf6e5bb750b66b25c20a1c5a471f91850de3748 +Author: djm@openbsd.org +Date: Thu Jul 25 23:44:01 2024 +0000 + + upstream: reduce logingrace penalty. + + A single forgotton login that times out should be below the penalty + threshold. + + ok deraadt/claudio + + OpenBSD-Commit-ID: cee1f7d17597c97bff8e5092af5d136fdb08f81d + +commit 29fb6f6d46b67770084b4f12bcf8a01bd535041b +Author: djm@openbsd.org +Date: Thu Jul 25 22:40:08 2024 +0000 + + upstream: Fix proxy multiplexing (-O proxy) bug + + If a mux started with ControlPersist then later has a forwarding added using + mux proxy connection and the forwarding was used, then when the mux proxy + session terminates, the mux master process will send a channel close to the + server with a bad channel ID and crash the connection. + + This was caused by my stupidly reusing c->remote_id for mux channel + associations when I should have just added another member to struct channel. + + ok markus@ + + OpenBSD-Commit-ID: c9f474e0124e3fe456c5e43749b97d75e65b82b2 + +commit 53d1d307438517805989c7d5616d752739a97e03 +Author: djm@openbsd.org +Date: Thu Jul 18 01:47:27 2024 +0000 + + upstream: mention mux proxy mode + + OpenBSD-Commit-ID: fd77a77779f06d316a314e4540dc57c93fc3369a + +commit a9b90859d252c2f5a24142f985d38610ac74685f +Author: jsg@openbsd.org +Date: Sun Jul 14 10:19:23 2024 +0000 + + upstream: fix double word; ok dtucker@ + + OpenBSD-Commit-ID: e6aff005914fa350b896d2be030be3d3b56ec0e8 + +commit b05fda224bbcd2f641254534ed2175c42487f3c8 +Author: Darren Tucker +Date: Thu Jul 25 17:59:35 2024 +1000 + + Check for SA_RESTART before using it. + + ok djm@ + +commit c276672fc0e99f0c4389988d54a84c203ce325b6 +Author: Yuichiro Naito +Date: Wed Sep 1 10:19:32 2021 +0900 + + Class-imposed login restrictions + + If the following functions are available, + add an additional check if users are allowed to login imposed by login class. + + * auth_hostok(3) + * auth_timeok(3) + + These functions are implemented on FreeBSD. + +commit 7717b9e9155209916cc6b4b4b54f4e8fa578e889 +Author: djm@openbsd.org +Date: Wed Jul 10 21:58:34 2024 +0000 + + upstream: correct keyword; from Yatao Su via GHPR509 + + OpenBSD-Commit-ID: 81c778c76dea7ef407603caa157eb0c381c52ad2 + +commit f2b78bb8f149d6b4d1f62c21aa1f06995dccf4ce +Author: djm@openbsd.org +Date: Mon Jul 8 03:04:34 2024 +0000 + + upstream: don't need return at end of void function + + OpenBSD-Commit-ID: 42d322d37f13aa075ae7b1ad9eef591e20b89717 + +commit a395d37a813c0177cb5bfc4bebf5a52badb73cf0 +Author: djm@openbsd.org +Date: Thu Jul 4 22:53:59 2024 +0000 + + upstream: fix grammar: "a pattern lists" -> "one or more pattern + + lists" + + OpenBSD-Commit-ID: f3c844763398faa9800687e8ff6621225498202a + +commit 8b664df75966e5aed8dabea00b8838303d3488b8 +Author: Darren Tucker +Date: Sun Jul 7 18:46:19 2024 +1000 + + Cast to sockaddr * in systemd interface. + + Fixes build with musl libx. bz#3707. + +commit 30c8c81da2169e78357d08dbb0ddd823b60e93bc +Author: Darren Tucker +Date: Thu Jul 4 20:12:26 2024 +1000 + + Add 9.8 branch to ci-status page. + +commit ee6b9e661633fcefd29dba0c811cecbc4d027f6f +Author: Samuel Thibault +Date: Tue Mar 26 22:15:08 2024 +0100 + + Fix detection of setres*id on GNU/Hurd + + Like Linux, proper _SOURCE macros need to be set to get declarations of + various standard functions, notably setres*id. Now that Debian is using + -Werror=implicit-function-declaration this is really required. While at + it, define other _SOURCE macros like on GNU/Linux, since GNU/Hurd uses + the same glibc. + +commit fa41f6592ff1b6ead4a652ac75af31eabb05b912 +Author: Damien Miller +Date: Mon Jul 1 14:33:26 2024 +1000 + + version numbers + +commit bfebb8a5130a792c5356bd06e1ddef72a0a0449f +Author: djm@openbsd.org +Date: Mon Jul 1 04:31:59 2024 +0000 + + upstream: openssh-9.8 + + OpenBSD-Commit-ID: 5f8b89e38a4c5f7c6d52ffa19f796d49f36fab19 + +commit 146c420d29d055cc75c8606327a1cf8439fe3a08 +Author: djm@openbsd.org +Date: Mon Jul 1 04:31:17 2024 +0000 + + upstream: when sending ObscureKeystrokeTiming chaff packets, we + + can't rely on channel_did_enqueue to tell that there is data to send. This + flag indicates that the channels code enqueued a packet on _this_ ppoll() + iteration, not that data was enqueued in _any_ ppoll() iteration in the + timeslice. ok markus@ + + OpenBSD-Commit-ID: 009b74fd2769b36b5284a0188ade182f00564136 + +commit 637e4dfea4ed81264e264b6200172ce319c64ead +Author: djm@openbsd.org +Date: Mon Jul 1 03:10:19 2024 +0000 + + upstream: use "lcd" to change directory before "lls" rather then "cd", + + since the directory we're trying to list is local. Spotted by Corinna + Vinschen + + OpenBSD-Regress-ID: 821feca4a4bebe491944e624c8f7f2990b891415 + +commit c8cfe258cee0b8466ea84597bf15e1fcff3bc328 +Author: djm@openbsd.org +Date: Thu Jun 27 23:01:15 2024 +0000 + + upstream: delete obsolete comment + + OpenBSD-Commit-ID: 5fb04f298ed155053f3fbfdf0c6fe7cdf84bbfa2 + +commit 94b9d37100f6fa536aaa1d1a0e4926fe44fbf04d +Author: djm@openbsd.org +Date: Thu Jun 27 22:36:44 2024 +0000 + + upstream: retire unused API + + OpenBSD-Commit-ID: 3e30d7b0615e2707f6bbe70f61b1c2f72f78161b + +commit 268c3a7f5783e731ed60f4e28da66ee3743581d3 +Author: jmc@openbsd.org +Date: Thu Jun 27 21:02:16 2024 +0000 + + upstream: ssl(8) no longer contains a HISTORY section; + + OpenBSD-Commit-ID: 83b7ff34433d79595e9c2a5d2a561a6660251245 + +commit 12b6cc09ce6c430681f03af2a8069e37a664690b +Author: djm@openbsd.org +Date: Wed Jun 26 23:47:46 2024 +0000 + + upstream: move child process waitpid() loop out of SIGCHLD handler; + + ok deraadt + + OpenBSD-Commit-ID: 65815a39564e431414aed7c5ace8076f4e9ca741 + +commit d6bcd13297c2ab8b528df5a6898f994734849031 +Author: deraadt@openbsd.org +Date: Wed Jun 26 23:16:52 2024 +0000 + + upstream: Instead of using possibly complex ssh_signal(), write all + + the parts of the grace_alarm_handler() using the exact things allowed by the + signal-safe rules. This is a good rule of thumb: Handlers should be written + to either set a global volatile sig_atomic_t inspected from outside, and/or + directly perform only safe operations listed in our sigaction(2) manual page. + ok djm markus + + OpenBSD-Commit-ID: 14168ae8368aab76e4ed79e17a667cb46f404ecd + +commit b8793e2b0851f7d71b97554fa5260b23796d6277 +Author: deraadt@openbsd.org +Date: Wed Jun 26 23:14:14 2024 +0000 + + upstream: save_errno wrappers inside two small signal handlers that + + perform system calls, for systems with libc that do perform libc sigtramps. + ok djm markus + + OpenBSD-Commit-ID: 7749b56419a7c9dcfe4c6c04811e429813346c62 + +commit f23e9332c4c8df37465c4a4f38275ea98980ed7e +Author: jmc@openbsd.org +Date: Mon Jun 24 06:59:39 2024 +0000 + + upstream: - uppercase start of sentence - correct sentence grammar + + ok djm + + OpenBSD-Commit-ID: 1ec4b0fdb633a43667f2c8fff1d600bd647dde25 + +commit 1839e3eb71a759aa795602c1e4196300f4ac2615 +Author: djm@openbsd.org +Date: Mon Jun 24 04:05:11 2024 +0000 + + upstream: mention SshdSessionPath option + + OpenBSD-Commit-ID: c29734d36c21003973b15c1c9965c35f36cef30c + +commit 603193e32aef5db7d60c58066d5de89806e79312 +Author: Darren Tucker +Date: Thu Jun 20 18:45:14 2024 +1000 + + Rerun upstream tests on .sh file changes too. + +commit dbbf9337c19381786a8e5a8a49152fe6b80c780d +Author: dtucker@openbsd.org +Date: Thu Jun 20 08:23:18 2024 +0000 + + upstream: Work around dbclient cipher/mac query bug. + + Unlike earlier versions, recent Dropbear (at least v2024.85) requires + a host arg when querying supported ciphers and macs via "-c/-m + help". Earlier versions accept but do not require it, so always + provide it. If these queries fail, skip the test with a warning. + + OpenBSD-Regress-ID: 98eb863a3f0363416922efb273885e6b3c7f68d4 + +commit 8de2c8cebc46bbdb94b7a2c120fcadfb66a3cccc +Author: dtucker@openbsd.org +Date: Thu Jun 20 08:18:34 2024 +0000 + + upstream: Remove dropbear key types not supported + + by current OpenSSH. Allows subsequent test runs to work if OpenSSH is + rebuilt w/out OpenSSL. + + OpenBSD-Regress-ID: e0129eb2b1d31771105903a8055216fbba20a770 + +commit e9b6471c59b21e5d9ef1b3832d4bf727338add85 +Author: djm@openbsd.org +Date: Thu Jun 20 00:18:05 2024 +0000 + + upstream: stricter check for overfull tables in penalty record path + + OpenBSD-Commit-ID: 7df01e648a0723418c554e64a9f2b6d38db060a6 + +commit d9336d344eb2a1e898c5e66147b3f108c7214694 +Author: djm@openbsd.org +Date: Wed Jun 19 23:24:47 2024 +0000 + + upstream: put back reaping of preauth child process when writes + + from the monitor fail. Not sure how this got lost in the avalanche of + patches. + + OpenBSD-Commit-ID: eb7eb36371e1ac01050b32b70fb2b3e5d98e72f5 + +commit 579d9adb70ec0206a788eb5c63804c31a67e9310 +Author: naddy@openbsd.org +Date: Mon Jun 17 13:50:18 2024 +0000 + + upstream: remove one more mention of DSA + + OpenBSD-Commit-ID: 8515f55a15f02836ba657df341415f63c60526ca + +commit 7089b5f8436ef0b8d3d3ad9ce01045fb9e7aab15 +Author: Darren Tucker +Date: Wed Jun 19 23:09:05 2024 +1000 + + Move -f to the place needed to restart sshd. + +commit d5f83cfd852b14a25f347f082ab539a9454702ad +Author: Darren Tucker +Date: Wed Jun 19 21:04:01 2024 +1000 + + Need to supply "-f" to restart sshd. + +commit fad34b4ca25c0ef31e5aa841d461b6f21da5b8c1 +Author: dtucker@openbsd.org +Date: Wed Jun 19 10:15:51 2024 +0000 + + upstream: Provide defaults for ciphers and macs + + if querying for them fails since on some versions of Dropbear (at least + v2024.85) "-m help" doesn't seem to work. Enable all supported pubkey + algorithms in the server. + + OpenBSD-Regress-ID: 4f95556a49ee9f621789f25217c367a33d2745ca + +commit 5521060e35ada9f957cecdddc06d0524e75409ef +Author: dtucker@openbsd.org +Date: Wed Jun 19 10:10:46 2024 +0000 + + upstream: Use ed25519 keys for kex tests + + since that's supported by OpenSSH even when built without OpenSSL. + Only test diffie-hellman kex if OpenSSH is compiled with support for it. + + OpenBSD-Regress-ID: a5d09ef9bbd171f9e4ec73ed0d9eeb49a8878e97 + +commit dbd3b833f6e3815e58f2dc6e14f61a51bcd4d6bd +Author: dtucker@openbsd.org +Date: Wed Jun 19 10:08:34 2024 +0000 + + upstream: Rework dropbear key setup + + to always generate ed25519 keys, other types only if OpenSSH has support + for the corresponding key type. + + OpenBSD-Regress-ID: 8f91f12604cddb9f8d93aa34f3f93a3f6074395d + +commit d6218504e11ae9148adf410fc69b0710a052be36 +Author: Darren Tucker +Date: Wed Jun 19 20:20:24 2024 +1000 + + Restart sshd after installing it for testing. + + When installing an sshd built without OpenSSL the mismatch between + the running sshd and newly installed sshd-session will cause the + remainder of the test to fail. + +commit 786a4465b6bb702daf4fb17b7c3bcb42b52f0b46 +Author: Darren Tucker +Date: Tue Jun 18 19:59:59 2024 +1000 + + Remove macos-11 runner. + + Github is retiring them soon. + +commit df1c72a55edbebac14363b57de66ac6a147ecc67 +Author: Damien Miller +Date: Wed Jun 19 09:34:34 2024 +1000 + + PAMServiceName may appear in a Match block + +commit de1c2e70e5a5dc3c8d2fe04b24cc93d8ef6930e7 +Author: dtucker@openbsd.org +Date: Tue Jun 18 08:11:48 2024 +0000 + + upstream: Re-enable ssh-dss tests + + ... if ssh is compiled with DSA support + + OpenBSD-Regress-ID: bbfaf8c17f2b50a2d46ac35cb97af99b990c990d + +commit dabc2c7cf3c141e8e5d5a1a60d6c1d2d2422cf43 +Author: anton@openbsd.org +Date: Tue Jun 18 06:14:27 2024 +0000 + + upstream: Stop using DSA in dropbear interop tests. + + OpenBSD-Regress-ID: abfd4457d99d8cc1417fd22ca2c570270f74c1cf + +commit 761438012710169445acc179e3870c53c862bda0 +Author: Damien Miller +Date: Tue Jun 18 12:29:45 2024 +1000 + + missed a bit of DSA in the fuzzer + +commit 3f9cc47da588e8de520720e59f98438043fdaf93 +Author: Damien Miller +Date: Tue Jun 18 09:35:53 2024 +1000 + + DSA support is disabled, so remove from fuzzers + +commit 00eb95957dea5484b2c7c043f7d2bbc87301bef2 +Author: djm@openbsd.org +Date: Mon Jun 17 08:30:29 2024 +0000 + + upstream: disable the DSA signature algorithm by default; ok + + markus@ + + (yes, I know this expands to "the Digitial Signature Algorithm + signature algorithm) + + OpenBSD-Commit-ID: 961ef594e46dd2dcade8dd5721fa565cee79ffed + +commit 5603befe11c9464ea26fe77cbacc95a7cc0b1ea7 +Author: djm@openbsd.org +Date: Mon Jun 17 08:28:31 2024 +0000 + + upstream: promote connection-closed messages from verbose to info + + log level; they could be the only record of the connection terminating if the + client doesn't send a SSH2_MSG_DISCONNECT message. ok dtucker@ + + OpenBSD-Commit-ID: 0c8bfaf5e9fdff945cee09ac21e641f6c5d65d3c + +commit b00331402fe5c60d577f3ffcc35e49286cdc6b47 +Author: Damien Miller +Date: Mon Jun 17 17:02:18 2024 +1000 + + propagate PAM crashes to PerSourcePenalties + + If the PAM subprocess crashes, exit with a crash status that will be + picked up by the sshd(8) listener process where it can be used by + PerSourcePenalties to block the client. This is similar handling to + the privsep preauth process. + +commit 1c207f456ace38987deda047758d13fbf857f948 +Author: Damien Miller +Date: Mon Jun 17 15:06:01 2024 +1000 + + minix doesn't have loopback, so skip penalty tests + + pointed out by dtucker@ + +commit 48443d202eaec52d4d39defdd709a4499a7140c6 +Author: djm@openbsd.org +Date: Sun Jun 16 11:54:49 2024 +0000 + + upstream: same treatment for this test + + OpenBSD-Regress-ID: d0cc9efca7833e673ea7b0cb3a679a3acee8d4c7 + +commit 45562a95ea11d328c22d97bf39401cd29684fb1f +Author: djm@openbsd.org +Date: Sun Jun 16 08:18:06 2024 +0000 + + upstream: penalty test is still a bit racy + + OpenBSD-Regress-ID: 90c9ac224db454637baf1ebee5857e007321e824 + +commit 8d0f7eb147ef72d18acb16c0b18672d44941a8ca +Author: djm@openbsd.org +Date: Sat Jun 15 03:59:10 2024 +0000 + + upstream: crank up penalty timeouts so this should work on even the + + slowest of test builders + + OpenBSD-Regress-ID: 70bda39c83e3fc9d0f3c1fad4542ed33e173d468 + +commit 93c75471a1202ab3e29db6938648d4e2602c0475 +Author: jmc@openbsd.org +Date: Fri Jun 14 05:20:34 2024 +0000 + + upstream: sort -q in the options list; + + OpenBSD-Commit-ID: 6839b38378f38f754de638a5e988c13b4164cc7c + +commit dd7807bbe80a93ffb4616f2bd5cf83ad5a5595fb +Author: djm@openbsd.org +Date: Fri Jun 14 05:01:22 2024 +0000 + + upstream: clarify KEXAlgorithms supported vs available. Inspired by + + bz3701 from Colin Watson. + + OpenBSD-Commit-ID: e698e69bea19bd52971d253f2b1094490c4701f7 + +commit d172ad56df85b68316dbadbedad16761a1265874 +Author: djm@openbsd.org +Date: Fri Jun 14 05:00:42 2024 +0000 + + upstream: ssh-keyscan -q man bits + + OpenBSD-Commit-ID: ba28d0e1ac609a4c99c453e57e86560c79079db1 + +commit 092e4ff9ccaacbe035f286feb1b56ed499604743 +Author: Damien Miller +Date: Fri Jun 14 14:46:35 2024 +1000 + + skip penalty-expire test in valgrind test env + +commit 2866ad08a9c50d7b67ce9424ca990532b806a21a +Author: djm@openbsd.org +Date: Fri Jun 14 04:43:11 2024 +0000 + + upstream: split the PerSourcePenalties test in two: one tests penalty + + enforcement but not penalty expiry, the other tests penalty expiry. + + This lets us disable the expiry testing in certain CI test environments. + + OpenBSD-Regress-ID: f56811064f3e3cb52ee73a206b8c2a06af1c8791 + +commit b2c64bc170d75823622a37cab3ca1804ca87ad16 +Author: Damien Miller +Date: Fri Jun 14 14:19:23 2024 +1000 + + add a sshd_config PamServiceName option + + Allows selecting which PAM service name to use when UsePAM is + enabled. Defaults to "sshd" unless overridden at compile time + by defining SSHD_PAM_SERVICE. + + bz2102, ok dtucker@ + +commit 9f032a4dd17bf0ae6066223d82aa5e784285d987 +Author: djm@openbsd.org +Date: Fri Jun 14 00:26:12 2024 +0000 + + upstream: don't redirect stderr for ssh-keyscan we expect to succeed + + OpenBSD-Regress-ID: 8878b8eb4e070ed2e343166d3eb86db4a08a216c + +commit 1e84d0cf40e94ae3a77d6a7ca8c036d8e3d55a40 +Author: djm@openbsd.org +Date: Fri Jun 14 00:25:25 2024 +0000 + + upstream: make host/banner comments go to stderr instead of stdout, + + so they are useful as comments without extra shell redirection and so they + don't clutter actual errors on stderr. + + Add a -q flag to shut them up. + + ok dtucker@ + + OpenBSD-Commit-ID: bec813de56a71adb5c1a76adcf49621130d24264 + +commit 3e806d011855d6bd648ec95b9df630ebbd11c3bf +Author: naddy@openbsd.org +Date: Thu Jun 13 15:06:33 2024 +0000 + + upstream: separate keywords with comma + + OpenBSD-Commit-ID: d65a99666202a8188c4991c18d14374a229f7be5 + +commit abfd1f7a3cbd0a92581a0febba254b2f6649c0d9 +Author: djm@openbsd.org +Date: Fri Jun 14 00:23:55 2024 +0000 + + upstream: specify an algorithm for ssh-keyscan, otherwise it will make + + multiple attempts simultaneously and confuse the test + + OpenBSD-Regress-ID: 6e910f3315c4345053db1bf5cbf61826b194d0b9 + +commit a8fbe2f7d0d96d299ee8e69769e3b51067978748 +Author: Damien Miller +Date: Thu Jun 13 16:41:29 2024 +1000 + + sshd: don't use argv[0] as PAM service name + + sshd would implicitly use argv[0] as the PAM service name to + allow people to select different PAM service names by making + differently-named copies/links to the sshd binary. + + Splitting sshd into sshd/sshd-session broke this, as the process + that starts PAM is always sshd-session and the user has no control + over this. + + Hardcode "sshd" as the default PAM service name unless/until we + figure out a better way. Should unbreak OSX integration tests. + +commit bf204bd05c3ae650f87e2b96527688579f59774c +Author: Damien Miller +Date: Thu Jun 13 15:00:28 2024 +1000 + + prepare for checking in autogenerated files + + We plan to check in automatically generated files (config.h.in, etc) on + release branches. These files are normally ignored by .gitignore, but + this shuffles the contents of this file to make it easy to un-ignore + them. + +commit 425f79a837489904c343b349ef00e09aeaa4e752 +Author: Damien Miller +Date: Thu Jun 13 14:41:33 2024 +1000 + + typo in comment + +commit afe10313c1fa8d478af399ee7d54c8f85503013b +Author: Damien Miller +Date: Thu Jun 13 14:35:25 2024 +1000 + + fix PTY allocation on Cygwin, broken by sshd split + + Cygwin doesn't support FD passing and so used to disable post-auth + privilege separation entirely because privsep requires PTY allocation + to happen in the privileged monitor process with the PTY file + descriptors being passed back to the unprivileged process. + + This brings back a minimal version of the previous special treatment + for Cygwin (and any other platform that sets DISABLE_FD_PASSING): + privilege separation remains enabled, but PTY allocation happens in + the post-auth user process rather than the monitor. + + This either requires PTY allocation to not need privilege to begin + with (this appears to be the case on Cygwin), or the post-auth + privsep process retain privilege (other platforms that set the + DISABLE_FD_PASSING option). + + Keeping privileges here is bad, but the non-Cygwin systems that set + DISABLE_FD_PASSING are so deeply legacy that this is likely to be the + least of their problems. + +commit f66d4df5749551380a8c4ae642347675a0b6a2e9 +Author: Damien Miller +Date: Thu Jun 13 11:33:09 2024 +1000 + + delay lookup of privsep user until config loaded + + sshd-session attempting to use options.kerberos_authentication to + decide whether it needed to lookup the privsep user before the + configuration was loaded. This caused it to get a placeholder value + that caused it always to try to lookup the privsep user, breaking at + least one test environment. + +commit f1c42858b94f5d9b58867b34dce3afb39c6b56a8 +Author: Damien Miller +Date: Thu Jun 13 11:16:57 2024 +1000 + + missing file for PerSourcePenalties regress test + +commit 4de80ff4e6fab5a6bb0028e7d57c6c23d1485adb +Author: djm@openbsd.org +Date: Wed Jun 12 22:36:00 2024 +0000 + + upstream: split PerSourcePenalties address tracking. Previously it + + used one shared table and overflow policy for IPv4 and IPv6 addresses, now it + will use separate tables and optionally different overflow policies. + + This prevents misbehaviour from IPv6 addresses (which are vastly easier + to obtain many of) from affecting IPv4 connections and may allow for + stricter overflow policies. + + ok deraadt@ + + OpenBSD-Commit-ID: 12637ed0aa4d5f1f3e702da42ea967cbd8bfdfd9 + +commit 06ab4c6931b0aaa4334db2faaa7e1069e76d0df6 +Author: jmc@openbsd.org +Date: Tue Jun 11 05:24:39 2024 +0000 + + upstream: do not mark up "(default: 20ms)"; + + OpenBSD-Commit-ID: 54151ecdecfa1b67dcdda4fd24826ef6e2148ad4 + +commit cfe243cd9fde148ed060637876e27bb55ac78be9 +Author: djm@openbsd.org +Date: Tue Jun 11 02:54:51 2024 +0000 + + upstream: reap preauth net child if it hangs up during privsep message + + send, not just message receive + + OpenBSD-Commit-ID: 02a093f4ab4f8f83f0cd1ea2bb35b9ca420448f0 + +commit b0a711c00b9c64afd1c9d6fb538275c6604a2676 +Author: djm@openbsd.org +Date: Tue Jun 11 01:58:27 2024 +0000 + + upstream: fix PIDFILE handling, broken for SUDO=doas in last commit + + here + + OpenBSD-Regress-ID: 96fec579af228f87a036e94801eb294af9074625 + +commit 90fb801e2d9241be50a2a7ff79428386442a041f +Author: djm@openbsd.org +Date: Tue Jun 11 02:00:30 2024 +0000 + + upstream: reap the pre-auth [net] child if it hangs up during privsep + + message sending, not just receiving + + OpenBSD-Commit-ID: f7341605bf08c4c15830910446e6775323f2f8cb + +commit ef878d58798f6688c7f4d4e417dc0c29023ea831 +Author: djm@openbsd.org +Date: Tue Jun 11 01:23:25 2024 +0000 + + upstream: a little more RB_TREE paranoia + + OpenBSD-Commit-ID: 8dc2fd21eebd8830c4a4d25461ac4fe228e11156 + +commit fc4e96b2174d6a894d2033421699d091679baced +Author: djm@openbsd.org +Date: Tue Jun 11 01:22:25 2024 +0000 + + upstream: fix off-by-one comparison for PerSourcePenalty + + OpenBSD-Commit-ID: af4f5d01c41ef870b23e55655bfbf73474a6c02b + +commit 82c836df4ff41145553cd7adb11c5b985aeaa06f +Author: djm@openbsd.org +Date: Tue Jun 11 01:21:41 2024 +0000 + + upstream: move tree init before possible early return + + OpenBSD-Commit-ID: 72e2c5b69f151c08a7c5bf5ad929b97a92c273df + +commit a2300f015cc4939c4d9c564b58b74e71202dc978 +Author: djm@openbsd.org +Date: Tue Jun 11 01:07:35 2024 +0000 + + upstream: update to mention that PerSourcePenalties default to + + being enabled and document the default values for each parameter. + + OpenBSD-Commit-ID: b981288bddfb097aad269f62df4081c688ce0034 + +commit 41987efd356d3fc30139aeab4b09374acf8f91a0 +Author: djm@openbsd.org +Date: Tue Jun 11 00:44:52 2024 +0000 + + upstream: reap the [net] child if it hangs up while writing privsep + + message payloads, not just the message header + + OpenBSD-Commit-ID: 24dbd400aa381ac96be7ed2dd49018487dfef6ce + +commit 6211aa085fa91155a24922e5329576ac9a8f3175 +Author: djm@openbsd.org +Date: Tue Jun 11 00:40:21 2024 +0000 + + upstream: log waitpid() status for abnormal exits + + OpenBSD-Commit-ID: b317930e06b51819c1a2bc6a4359764fecfb1c2d + +commit a59634c7adb9ae988748d99963dfafb3070d8d41 +Author: djm@openbsd.org +Date: Tue Jun 11 00:36:20 2024 +0000 + + upstream: correct error message + + OpenBSD-Commit-ID: 581f60f73099083392887206860229ab104620ed + +commit fa7d7a667f2ee031e72873e36de2d2a36bca973b +Author: deraadt@openbsd.org +Date: Fri Jun 7 13:23:30 2024 +0000 + + upstream: avoid shadowing issues which some compilers won't accept + + ok djm + + OpenBSD-Commit-ID: 1e89572397dda83433d58c4fa6333a08f51170d4 + +commit 3ad4cd9eeca5c9bc6706db44b6de88e2e4513fd6 +Author: jmc@openbsd.org +Date: Thu Jun 6 21:14:49 2024 +0000 + + upstream: escape the final dot at eol in "e.g." to avoid double + + spacing; + + OpenBSD-Commit-ID: 0a9fb10bc9f7d577afe2da3f498a08bc431115b9 + +commit 0e0c69761a4c33ccd4a256560f522784a753d1a8 +Author: djm@openbsd.org +Date: Thu Jun 6 20:25:48 2024 +0000 + + upstream: enable PerSourcePenalties by default. + + ok markus + + NB. if you run a sshd that accepts connections from behind large NAT + blocks, proxies or anything else that aggregates many possible users + behind few IP addresses, then this change may cause legitimate traffic + to be denied. + + Please read the PerSourcePenalties, PerSourcePenaltyExemptList and + PerSourceNetBlockSize options in sshd_config(5) for how to tune your + sshd(8) for your specific circumstances. + + OpenBSD-Commit-ID: 24a0e5c23d37e5a63e16d2c6da3920a51078f6ce + +commit bd1f74741daabeaf20939a85cd8cec08c76d0bec +Author: djm@openbsd.org +Date: Thu Jun 6 20:20:42 2024 +0000 + + upstream: mention that PerSourcePenalties don't affect concurrent + + in-progress connections. + + OpenBSD-Commit-ID: 20389da6264f2c97ac3463edfaa1182c212d420c + +commit 9774b938578327d88a651f4c63c504809717590a +Author: djm@openbsd.org +Date: Thu Jun 6 19:49:25 2024 +0000 + + upstream: regress test for PerSourcePenalties + + OpenBSD-Regress-ID: a1af13d411b25a727742644459d26480b9a1b0f1 + +commit b8ebd86cefe9812204a10c028dc90de29918667d +Author: djm@openbsd.org +Date: Thu Jun 6 19:48:40 2024 +0000 + + upstream: make sure logs are saved from sshd run via start_sshd + + OpenBSD-Regress-ID: de4ef0e32e3ab85ff3a6c36eb08d1909c0dd1b4a + +commit d7b2070bdaa4ebbfafb9975c1d5a62b73289d31f +Author: djm@openbsd.org +Date: Thu Jun 6 19:47:48 2024 +0000 + + upstream: simplify + + OpenBSD-Regress-ID: 50316e0d1ae0c0a057a45af042253e54ce23d11c + +commit e6ea3d224513b6bfb93818809d4c7397f5995ba2 +Author: djm@openbsd.org +Date: Thu Jun 6 18:48:13 2024 +0000 + + upstream: prepare for PerSourcePenalties being enabled by default + + in future + + OpenBSD-Regress-ID: 5236c6d1c823997aac5a35e2915da30f1903bec7 + +commit c0cb3b8c837761816a60a3cdb54062668df09652 +Author: djm@openbsd.org +Date: Thu Jun 6 19:50:01 2024 +0000 + + upstream: disable stderr redirection before closing fds + + OpenBSD-Commit-ID: d42cb895ee4542098050367fc35321c9303f003a + +commit 81c1099d22b81ebfd20a334ce986c4f753b0db29 +Author: djm@openbsd.org +Date: Thu Jun 6 17:15:25 2024 +0000 + + upstream: Add a facility to sshd(8) to penalise particular + + problematic client behaviours, controlled by two new sshd_config(5) options: + PerSourcePenalties and PerSourcePenaltyExemptList. + + When PerSourcePenalties are enabled, sshd(8) will monitor the exit + status of its child pre-auth session processes. Through the exit + status, it can observe situations where the session did not + authenticate as expected. These conditions include when the client + repeatedly attempted authentication unsucessfully (possibly indicating + an attack against one or more accounts, e.g. password guessing), or + when client behaviour caused sshd to crash (possibly indicating + attempts to exploit sshd). + + When such a condition is observed, sshd will record a penalty of some + duration (e.g. 30 seconds) against the client's address. If this time + is above a minimum threshold specified by the PerSourcePenalties, then + connections from the client address will be refused (along with any + others in the same PerSourceNetBlockSize CIDR range). + + Repeated offenses by the same client address will accrue greater + penalties, up to a configurable maximum. A PerSourcePenaltyExemptList + option allows certain address ranges to be exempt from all penalties. + + We hope these options will make it significantly more difficult for + attackers to find accounts with weak/guessable passwords or exploit + bugs in sshd(8) itself. + + PerSourcePenalties is off by default, but we expect to enable it + automatically in the near future. + + much feedback markus@ and others, ok markus@ + + OpenBSD-Commit-ID: 89ded70eccb2b4926ef0366a4d58a693de366cca + +commit 916b0b6174e203cf2c5ec9bcf409472eb7ffbf43 +Author: Damien Miller +Date: Fri Jun 7 03:31:02 2024 +1000 + + whitespace + +commit 49b55e44182b8294419aa580cbf043d5b9e3d953 +Author: deraadt@openbsd.org +Date: Tue Jun 4 15:14:45 2024 +0000 + + upstream: enable -fret-clean on amd64, for libc libcrypto ld.so + + kernel, and all the ssh tools. The dynamic objects are entirely ret-clean, + static binaries will contain a blend of cleaning and non-cleaning callers. + + OpenBSD-Commit-ID: 112aacedd3b61cc5c34b1fa6d9fb759214179172 + +commit cc80d51d034bcb24fd0f2564a4bdf1612000a2a2 +Author: Damien Miller +Date: Wed Jun 5 02:21:30 2024 +1000 + + remove PRIVSEP macros for osx + +commit 8785491123d4d722b310c20f383570be758f8263 +Author: djm@openbsd.org +Date: Sat Jun 1 07:03:37 2024 +0000 + + upstream: be really strict with fds reserved for communication with the + + separate sshd-session process - reserve them early and fatal if we can't + dup2(2) them later. The pre-split fallback to re-reading the configuration + files is not possible, so sshd-session absolutely requires the fd the + configuration is passed over to be in order. + + ok deraadt@ + + OpenBSD-Commit-ID: 308a98ef3c8a6665ebf92c7c9a0fc9600ccd7065 + +commit f1c8918cb98459910fb159373baea053ba4108c0 +Author: Damien Miller +Date: Fri May 31 19:12:26 2024 +1000 + + depend + +commit 94b4866cb1f4b0ed29a9f367047b30f81002316f +Author: Damien Miller +Date: Fri May 31 19:11:14 2024 +1000 + + rename need_privsep to need_chroot + + privsep is mandatory, chroot is optional (disabled when running + sshd as non-root) + +commit e68a95142e5024b144f8eeccd5ffdee42c34f44c +Author: Damien Miller +Date: Fri May 31 19:05:34 2024 +1000 + + remove remaining use_privsep mention + +commit b21d271f651d2536dca819cc6d74032fe98634db +Author: djm@openbsd.org +Date: Fri May 31 09:01:08 2024 +0000 + + upstream: warn when -r (deprecated option to disable re-exec) is + + passed + + OpenBSD-Commit-ID: 73145ef5150edbe3ce7889f0844ed8fa6155f551 + +commit a4b5bc246cbca476deeeb4462aa31746a56e3021 +Author: djm@openbsd.org +Date: Fri May 31 08:49:35 2024 +0000 + + upstream: typos + + OpenBSD-Commit-ID: edfa72eb06bfa65da30fabf7d2fe76d2d33f77bf + +commit 8054b906983ceaed01fabd8188d3dac24c05ba39 +Author: djm@openbsd.org +Date: Mon May 27 01:52:26 2024 +0000 + + upstream: don't need sys/queue.h here + + OpenBSD-Commit-ID: dd137396828171eb19e4911581812ca58de6c578 + +commit 210d4239733da6180ce853538aeb9413d5c62ad5 +Author: naddy@openbsd.org +Date: Sun May 26 20:35:12 2024 +0000 + + upstream: remove references to SSH1 and DSA server keys + + OpenBSD-Commit-ID: 57cc1c98d4f998981473734f144b904af7d178a2 + +commit f0b9261d7fdd0ef86806b49fe76344bd16770cd0 +Author: jsg@openbsd.org +Date: Thu May 23 23:47:16 2024 +0000 + + upstream: remove unused struct fwd_perm_list, no decl with complete + + type ok djm@ + + OpenBSD-Commit-ID: 416fb3970b7e73c76d2963c4f00cf96f2b2ee2fb + +commit 2477a98c3ef78e63b11a1393656e00288f52ae97 +Author: naddy@openbsd.org +Date: Wed May 22 15:24:55 2024 +0000 + + upstream: Do not pass -Werror twice when building with clang. + + OpenBSD-Commit-ID: 5f378c38ad8976d507786dc4db9283a879ec8cd0 + +commit 435844f5675245b4271f8581f15e6d1f34fde3bc +Author: miod@openbsd.org +Date: Wed May 22 11:49:36 2024 +0000 + + upstream: Do not pass -Werror if building with gcc 3, for asn1.h + + and bio.h cause (admittedly bogus) warnings with gcc 3. + + OpenBSD-Commit-ID: fb39324748824cb0387e9d67c41d1bef945c54ea + +commit fc5dc092830de23767c6ef67baa18310a64ee533 +Author: djm@openbsd.org +Date: Wed May 22 04:20:00 2024 +0000 + + upstream: this test has been broken since 2014, and has been + + testing the same key exchange algorithm repeatedly instead of testing all of + them. Spotted by nreilly AT blackberry.com in bz3692 + + Who broke the test? me. + + OpenBSD-Regress-ID: 48f4f5946276f975667141957d25441b3c9a50e2 + +commit fd4816791beaed2fdae7eea3e1494d1972b2a39d +Author: anton@openbsd.org +Date: Sun May 19 19:10:01 2024 +0000 + + upstream: Add missing kex-names.c source file required since the + + ssh split. + + OpenBSD-Regress-ID: ca666223f828fc4b069cb9016bff1eb50faf9fbb + +commit beccb7319c5449f6454889013403c336446d622e +Author: naddy@openbsd.org +Date: Fri May 17 14:42:00 2024 +0000 + + upstream: remove duplicate copy of relink kit for sshd-session + + OpenBSD-Commit-ID: 6d2ded4cd91d4d727c2b26e099b91ea935bed504 + +commit dcd79fa141311c287e0595ede684b7116122fae0 +Author: jsg@openbsd.org +Date: Fri May 17 06:42:04 2024 +0000 + + upstream: remove prototypes with no matching function; ok djm@ + + OpenBSD-Commit-ID: 6d9065dadea5f14a01bece0dbfe2fba1be31c693 + +commit 6454a05e7c6574d70adf17efe505a8581a86ca4f +Author: jsg@openbsd.org +Date: Fri May 17 06:38:00 2024 +0000 + + upstream: remove externs for removed vars; ok djm@ + + OpenBSD-Commit-ID: f51ea791d45c15d4927eb4ae7d877ccc1e5a2aab + +commit f3e4db4601ef7d2feb1d6f7447e432aaf353a616 +Author: deraadt@openbsd.org +Date: Fri May 17 06:11:17 2024 +0000 + + upstream: -Werror was turned on (probably just for development), + + and this is a simple way to satisfy older gcc. + + OpenBSD-Commit-ID: 7f698df54384b437ce33ab7405f0b86c87019e86 + +commit 24a1f3e5ad6f4a49377d4c74c36637e9a239efd0 +Author: Damien Miller +Date: Fri May 17 14:50:43 2024 +1000 + + attempt at updating RPM specs for sshd-session + +commit 17b566eeb7a0c6acc9c48b35c08885901186f861 +Author: djm@openbsd.org +Date: Fri May 17 04:42:13 2024 +0000 + + upstream: g/c unused variable + + OpenBSD-Commit-ID: aa6ef0778a1f1bde0d73efba72a777c48d2bd010 + +commit 01fb82eb2aa0a4eaf5c394ea8bb37ea4c26f8a3f +Author: jsg@openbsd.org +Date: Fri May 17 02:39:11 2024 +0000 + + upstream: spelling; ok djm@ + + OpenBSD-Commit-ID: bdea29bb3ed2a5a7782999c4c663b219d2270483 + +commit b88b690e99145a021fc1a1a116a11e0bce0594e7 +Author: djm@openbsd.org +Date: Fri May 17 01:45:22 2024 +0000 + + upstream: allow overriding the sshd-session binary path + + OpenBSD-Regress-ID: 5058cd1c4b6ca1a15474e33546142931d9f964da + +commit a68f80f2511f0e0c5cef737a8284cc2dfabad818 +Author: anton@openbsd.org +Date: Wed Apr 3 06:01:11 2024 +0000 + + upstream: Since ssh-agent(1) is only readable by root by now, use + + ssh(1) while generating data in tests. + + OpenBSD-Regress-ID: 24eb40de2e6b0ace185caaba35e2d470331ffe68 + +commit 92e55890314ce2b0be21a43ebcbc043b4abc232f +Author: djm@openbsd.org +Date: Fri May 17 01:17:40 2024 +0000 + + upstream: fix incorrect debug option name introduce in previous + + commit + + OpenBSD-Commit-ID: 66d69e22b1c072c694a7267c847f212284614ed3 + +commit 4ad72878af7b6ec28da6e230e36a91650ebe84c1 +Author: deraadt@openbsd.org +Date: Fri May 17 00:33:25 2024 +0000 + + upstream: construct and install a relink-kit for sshd-session ok + + djm + + OpenBSD-Commit-ID: 8b3820adb4da4e139c4b3cffbcc0bde9f08bf0c6 + +commit 02e679a2cb3f6df8e9dbb1519ed578226485157f +Author: Damien Miller +Date: Fri May 17 12:21:27 2024 +1000 + + Makefile support for sshd-session + +commit c0416035c5eaf70a8450d11c8833c5f7068ee7ad +Author: djm@openbsd.org +Date: Fri May 17 00:32:32 2024 +0000 + + upstream: missing files from previous + + OpenBSD-Commit-ID: 4b7be4434d8799f02365552b641a7a70a7ebeb2f + +commit 03e3de416ed7c34faeb692967737be4a7bbe2eb5 +Author: djm@openbsd.org +Date: Fri May 17 00:30:23 2024 +0000 + + upstream: Start the process of splitting sshd into separate + + binaries. This step splits sshd into a listener and a session binary. More + splits are planned. + + After this changes, the listener binary will validate the configuration, + load the hostkeys, listen on port 22 and manage MaxStartups only. All + session handling will be performed by a new sshd-session binary that the + listener fork+execs. + + This reduces the listener process to the minimum necessary and sets us + up for future work on the sshd-session binary. + + feedback/ok markus@ deraadt@ + + NB. if you're updating via source, please restart sshd after installing, + otherwise you run the risk of locking yourself out. + + OpenBSD-Commit-ID: 43c04a1ab96cdbdeb53d2df0125a6d42c5f19934 + +commit 1c0d81357921f8d3bab06841df649edac515ae5b +Author: djm@openbsd.org +Date: Thu May 9 09:46:47 2024 +0000 + + upstream: simplify exit message handling, which was more complicated + + than it needed to be because of unexpunged ssh1 remnants. ok markus@ + + OpenBSD-Commit-ID: 8b0cd2c0dee75fb053718f442aa89510b684610b + +commit cbbbf76aa6cd54fce32eacce1300e7abcf9461d4 +Author: tobias@openbsd.org +Date: Mon May 6 19:26:17 2024 +0000 + + upstream: remove SSH1 leftovers + + Authored with Space Meyer + + ok djm + + OpenBSD-Commit-ID: 81db602e4cb407baae472689db1c222ed7b2afa3 + +commit bc5dcb8ab9a4e8af54a724883732af378f42ea78 +Author: tobias@openbsd.org +Date: Tue Apr 30 15:40:43 2024 +0000 + + upstream: never close stdin + + The sanitise_stdfd call makes sure that standard file descriptors are + open (if they were closed, they are connected with /dev/null). + + Do not close stdin in any case to prevent error messages when stdin is + read multiple times and to prevent later usage of fd 0 for connections, + e.g. + + echo localhost | ssh-keyscan -f - -f - + + While at it, make stdin-related error messages nicer. + + Authored with Max Kunzelmann + + ok djm + + OpenBSD-Commit-ID: 48e9b7938e2fa2f9bd47e6de6df66a31e0b375d3 + +commit 6a42b70e56bef1aacdcdf06352396e837883e84f +Author: Damien Miller +Date: Wed May 8 09:43:59 2024 +1000 + + sync getrrsetbyname.c with recent upstream changes + +commit 385ecb31e147dfea59c1c488a1d2011d3867e60e +Author: djm@openbsd.org +Date: Tue Apr 30 06:23:51 2024 +0000 + + upstream: fix home-directory extension implementation, it always + + returned the current user's home directory contrary to the spec. + + Patch from Jakub Jelen via GHPR477 + + OpenBSD-Commit-ID: 5afd775eab7f9cbe222d7fbae4c793de6c3b3d28 + +commit 14e2b16bc67ffcc188906f65008667e22f73d103 +Author: djm@openbsd.org +Date: Tue Apr 30 06:16:55 2024 +0000 + + upstream: flush stdout after writing "sftp>" prompt when not using + + editline. + + From Alpine Linux via GHPR480 + + OpenBSD-Commit-ID: 80bdc7ffe0358dc090eb9b93e6dedb2b087b24cd + +commit 2e69a724051488e3fb3cd11531c4b5bc1764945b +Author: djm@openbsd.org +Date: Tue Apr 30 05:53:03 2024 +0000 + + upstream: stricter validation of messaging socket fd number; disallow + + usage of stderr. Based on GHPR492 by RealHurrison + + OpenBSD-Commit-ID: 73dbbe82ea16f73ce1d044d3232bc869ae2f2ce8 + +commit da757b022bf18c6f7d04e685a10cd96ed00f83da +Author: djm@openbsd.org +Date: Tue Apr 30 05:45:56 2024 +0000 + + upstream: add missing reserved fields to key constraint protocol + + documentation. + + from Wiktor Kwapisiewicz via GHPR487 + + OpenBSD-Commit-ID: 0dfb69998cfdb3fa00cbb0e7809e7d2f6126e3df + +commit 16d0b82fa08038f35f1b3630c70116979f49784f +Author: Damien Miller +Date: Tue Apr 30 12:39:34 2024 +1000 + + depend + +commit 66aaa678dbe59aa21d0d9d89a3596ecedde0254b +Author: djm@openbsd.org +Date: Tue Apr 30 02:14:10 2024 +0000 + + upstream: correctly restore sigprocmask around ppoll() reported + + by Tõivo Leedjärv; ok deraadt@ + + OpenBSD-Commit-ID: c0c0f89de5294a166578f071eade2501929c4686 + +commit 80fb0eb21551aed3aebb009ab20aeffeb01e44e0 +Author: djm@openbsd.org +Date: Tue Apr 30 02:10:49 2024 +0000 + + upstream: add explict check for server hostkey type against + + HostkeyAlgorithms. Allows HostkeyAlgorithms to disable implicit fallback from + certificate keys to plain keys. ok markus@ + + OpenBSD-Commit-ID: 364087e4a395ff9b2f42bf3aefdb2090bb23643a + +commit 5b28096d31ff7d80748fc845553a4aef5bb05d86 +Author: jsg@openbsd.org +Date: Tue Apr 23 13:34:50 2024 +0000 + + upstream: correct indentation; no functional change ok tb@ + + OpenBSD-Commit-ID: dd9702fd43de546bc6a3f4f025c74d6f3692a0d4 + +commit fd3cb8a82784e05f621dea5b56ac6f89bc53c067 +Author: semarie@openbsd.org +Date: Thu Apr 4 16:00:51 2024 +0000 + + upstream: set right mode on ssh-agent at boot-time + + which sthen@ + ok deraadt@ + + OpenBSD-Commit-ID: 662b5056a2c6171563e1626f9c69f27862b5e7af + +commit 54343a260e3aa4bceca1852dde31cd08e2abd82b +Author: deraadt@openbsd.org +Date: Tue Apr 2 12:22:38 2024 +0000 + + upstream: Oops, incorrect hex conversion spotted by claudio. + + While here try to improve how it reads a bit better. Surprising the + regression tests didn't spot this error, maybe it fails to roundtrip the + values. + + OpenBSD-Commit-ID: 866cfcc1955aef8f3fc32da0b70c353a1b859f2e + +commit ec78c31409590ad74efc194f886273ed080a545a +Author: deraadt@openbsd.org +Date: Tue Apr 2 10:02:08 2024 +0000 + + upstream: for parse_ipqos(), use strtonum() instead of mostly + + idiomatic strtoul(), but wow it's so gross. ok djm + + OpenBSD-Commit-ID: cec14a76af2eb7b225300c80fc0e21052be67b05 + +commit 8176e1a6c2e6da9361a7abb6fbf6c23c299f495b +Author: deraadt@openbsd.org +Date: Tue Apr 2 09:56:58 2024 +0000 + + upstream: can shortcut by returning strtonum() value directly; ok + + djm + + OpenBSD-Commit-ID: 7bb2dd3d6d1f288dac14247d1de446e3d7ba8b8e + +commit 9f543d7022a781f80bb696f9d73f1d1c6f9e31d6 +Author: deraadt@openbsd.org +Date: Tue Apr 2 09:52:14 2024 +0000 + + upstream: rewrite convtime() to use a isdigit-scanner and + + strtonum() instead of strange strtoul can might be fooled by garage + characters. passes regress/usr.bin/ssh/unittests/misc ok djm + + OpenBSD-Commit-ID: 4b1ef826bb16047aea3f3bdcb385b72ffd450abc + +commit 8673137f780d8d9e4cda3c4605cb5d88d5cea271 +Author: claudio@openbsd.org +Date: Tue Apr 2 09:48:24 2024 +0000 + + upstream: Remove unused ptr[3] char array in pkcs11_decode_hex. + + OK deraadt@ + + OpenBSD-Commit-ID: 3d14433e39fd558f662d3b0431c4c555ef920481 + +commit c7fec708f331f108343d69e4d74c9a5d86d6cfe7 +Author: deraadt@openbsd.org +Date: Tue Apr 2 09:32:28 2024 +0000 + + upstream: Replace non-idiomatic strtoul(, 16) to parse a region + + of 2-character hex sequences with a low-level replacement designed just for + the task. ok djm + + OpenBSD-Commit-ID: 67bab8b8a4329a19a0add5085eacd6f4cc215e85 + +commit 019a5f483b0f588da6270ec401d0b4bb35032f3f +Author: deraadt@openbsd.org +Date: Tue Apr 2 09:29:31 2024 +0000 + + upstream: Use strtonum() instead of severely non-idomatic + + strtoul() In particular this will now reject trailing garbage, ie. + '12garbage'. ok djm + + OpenBSD-Commit-ID: c82d95e3ccbfedfc91a8041c2f8bf0cf987d1501 + +commit 8231ca046fa39ea4eb99b79e0a6e09dec50ac952 +Author: deraadt@openbsd.org +Date: Mon Apr 1 15:50:17 2024 +0000 + + upstream: also create a relink kit for ssh-agent, since it is a + + long-running setgid program carrying keys with some (not very powerful) + communication channels. solution for testing the binary from dtucker. + agreement from djm. Will add it into /etc/rc in a few days. + + OpenBSD-Commit-ID: 2fe8d707ae35ba23c7916adcb818bb5b66837ba0 + +commit bf7bf50bd6a14e49c9c243cb8f4de31e555a5a2e +Author: deraadt@openbsd.org +Date: Mon Apr 1 15:48:16 2024 +0000 + + upstream: new-style relink kit for sshd. The old scheme created + + a Makefile by concatenating two Makefiles and was incredibly fragile. In the + new way a narrow-purposed install.sh script is created and shipped with the + objects. A recently commited /etc/rc script understands these files. + + OpenBSD-Commit-ID: ef9341d5a50f0d33e3a6fbe995e92964bc7ef2d3 + +commit 00e63688920905e326d8667cb47f17a156b6dc8f +Author: renmingshuai +Date: Fri Apr 12 10:20:49 2024 +0800 + + Shell syntax fix (leftover from a sync). + + Signed-off-by: renmingshuai + +commit 2eded551ba96e66bc3afbbcc883812c2eac02bd7 +Author: Darren Tucker +Date: Thu Apr 25 13:20:19 2024 +1000 + + Merge flags for OpenSSL 3.x versions. + + OpenSSL has moved to 3.4 which we don't currently accept. Based on + the OpenSSL versioning policy[0] it looks like all of the 3.x versions + should work with OpenSSH, so remove the distinction in configure and + accept all of them. + + [0] https://openssl.org/policies/general/versioning-policy.html + +commit 8673245918081c6d1dc7fb3733c8eb2c5a902c5e +Author: Darren Tucker +Date: Thu Apr 25 13:19:03 2024 +1000 + + Remove 9.6 branch from status page. + +commit 70d43049747fa3c66cf876d52271859407cec2fa +Author: Darren Tucker +Date: Thu Apr 25 13:16:58 2024 +1000 + + Update LibreSSL and OpenSSL versions tested. + + Update LibreSSL versions to current releases (3.8.4 & 3.9.1). + Add newly-released OpenSSL 3.3.0, and add tests against the 3.1 and + 3.3 branches. + +commit 88351eca17dcc55189991ba60e50819b6d4193c1 +Author: 90 +Date: Fri Apr 5 19:36:06 2024 +0100 + + Fix missing header for systemd notification + +commit 08f579231cd38a1c657aaa6ddeb8ab57a1fd4f5c +Author: Damien Miller +Date: Wed Apr 3 14:40:32 2024 +1100 + + notify systemd on listen and reload + + Standalone implementation that does not depend on libsystemd. + With assistance from Luca Boccassi, and feedback/testing from Colin + Watson. bz2641 + +commit 43e7c1c07cf6aae7f4394ca8ae91a3efc46514e2 +Author: Darren Tucker +Date: Sun Mar 31 21:51:57 2024 +1100 + + Port changes from selfhosted to upstream tests. + + Should get them working again. + +commit 281ea25a44bff53eefb4af7bab7aa670b1f8b6b2 +Author: Darren Tucker +Date: Sat Mar 30 18:20:16 2024 +1100 + + Check if OpenSSL implementation supports DSA. + + If --enable/disable-dsa-keys is not specified, set based on what OpenSSL + supports. If specified as enabled, but not supported by OpenSSL error + out. ok djm@ + +commit 2d2c068de8d696fe3246f390b146197f51ea1e83 +Author: djm@openbsd.org +Date: Sat Mar 30 05:56:22 2024 +0000 + + upstream: in OpenSSH private key format, correct type for subsequent + + private keys in blob. From Jakub Jelen via GHPR430 + + OpenBSD-Commit-ID: d17dbf47554de2d752061592f95b5d772baab50b + +commit c2c0bdd3e96b3ef66d77fccb85ff4962dc76caf0 +Author: Eero Häkkinen +Date: Sat Sep 16 00:55:08 2023 +0300 + + Expose SSH_AUTH_INFO_0 always to PAM auth modules. + + This changes SSH_AUTH_INFO_0 to be exposed to PAM auth modules also + when a password authentication method is in use and not only + when a keyboard-interactive authentication method is in use. + +commit 02c5ad23124ae801cf248d99ea5068fc4331ca01 +Author: Darren Tucker +Date: Wed Mar 27 17:42:58 2024 +1100 + + Rearrange selfhosted VM scheduling. + + Instead of trying to infer the type of the self hosted tests in each of + the driver scripts (inconsistently...), set one of the following + variables to "true" in the workflow: + + VM: tests run in a virtual machine. + EPHEMERAL: tests run on an ephemeral virtual machine. + PERSISTENT: tests run on a persistent virtual machine + REMOTE: tests run on a physical remote host. + + EPHEMERAL VMs can have multiple instances of any given VM can exist + simultaneously and are run by a runner pool. The other types have a + dedicated runner instance and can only run a single test at a time. + + Other settings: + SSHFS: We need to sshfs mount over the repo so the workflow can collect + build artifacts. This also implies the tests must be run over ssh. + DEBUG_ACTIONS: enable "set -x" in scripts for debugging. + +commit cd8a72707c02615365d0851ac51063ab6bfe258f +Author: Damien Miller +Date: Sat Mar 30 16:05:59 2024 +1100 + + add new token-based signing key for dtucker@ + + Verified in person and via signature with old key. + Will remove old key in a bit. + +commit 8d0e46c1ddb5b7f0992591b0dc5d8aaa77cc9dba +Author: Alkaid +Date: Tue Mar 12 03:59:12 2024 -0700 + + Fix OpenSSL ED25519 support detection + + Wrong function signature in configure.ac prevents openssh from enabling + the recently new support for ED25519 priv keys in PEM PKCS8 format. + +commit 697359be9c23ee43618243cdbcc9c7981e766752 +Author: djm@openbsd.org +Date: Sat Mar 30 04:27:44 2024 +0000 + + upstream: allow WAYLAND_DISPLAY to enable SSH_ASKPASS + + From dkg via GHPR479; ok dtucker@ + + OpenBSD-Commit-ID: 1ac1f9c45da44eabbae89375393c662349239257 + +commit 7844705b0364574cc70b941be72036c2c2966363 +Author: dtucker@openbsd.org +Date: Fri Mar 29 10:40:07 2024 +0000 + + upstream: Use egrep instead of grep -E. + + Some plaforms don't have the latter so this makes things easier + in -portable. + + OpenBSD-Regress-ID: ff82260eb0db1f11130200b25d820cf73753bbe3 + +commit 22b2b6c555334bffdf357a2e4aa74308b03b83c3 +Author: dtucker@openbsd.org +Date: Tue Mar 26 08:09:16 2024 +0000 + + upstream: test -h is the POSIXly way of testing for a symlink. Reduces + + diff vs Portable. + + OpenBSD-Regress-ID: 6f31cd6e231e3b8c5c2ca0307573ccb7484bff7d + +commit edcff77f82c2bb2b5653b36f1e47274c5ef3e8be +Author: Darren Tucker +Date: Tue Mar 26 18:58:58 2024 +1100 + + Fix name of OpenBSD upstream CI jobs. + +commit 861b084429940e024f1b6e9c2779eac95d7a45db +Author: Darren Tucker +Date: Tue Mar 26 18:55:33 2024 +1100 + + Resync with upstream: ${} around DATAFILE. + +commit 63f248c7693e7f0a3b9a13d2980ac9a7e37f2aea +Author: djm@openbsd.org +Date: Mon Mar 25 19:28:09 2024 +0000 + + upstream: optional debugging + + OpenBSD-Regress-ID: b4852bf97ac8fb2e3530f2d5f999edd66058d7bc + +commit 16e2ebe06a62f09d4877b769876d92d6008a896f +Author: dtucker@openbsd.org +Date: Mon Mar 25 06:05:42 2024 +0000 + + upstream: Verify string returned from local shell command. + + OpenBSD-Regress-ID: 5039bde24d33d809aebfa8d3ad7fe9053224e6f8 + +commit b326f7a1f39ff31324cc3fe2735178fb474c04a4 +Author: dtucker@openbsd.org +Date: Mon Mar 25 03:30:31 2024 +0000 + + upstream: Improve shell portability: grep -q is not portable so + + redirect stdout, and use printf instead of relying on echo to do \n + substitution. Reduces diff vs Portable. + + Also resync somewhat with upstream. + + OpenBSD-Regress-ID: 9ae876a8ec4c4725f1e9820a0667360ee2398337 + +commit dbf2e319f0c582613fa45a735ea3c242ce56946b +Author: dtucker@openbsd.org +Date: Mon Mar 25 02:07:08 2024 +0000 + + upstream: Save error code from SSH for use inside case statement, + + from portable. In some shells, "case" will reset the value of $?, so save it + first. + + OpenBSD-Regress-ID: da32e5be19299cb4f0f7de7f29c11257a62d6949 + +commit d2c8c4fa7def4fb057ed05b3db57b62c810a26f6 +Author: dtucker@openbsd.org +Date: Mon Mar 25 01:40:47 2024 +0000 + + upstream: Increase timeout. Resyncs with portable where some of + + the test VMs are slow enough for this to matter. + + OpenBSD-Regress-ID: 6a83a693602eb0312f06a4ad2cd6f40d99d24b26 + +commit 83621b63514a84791623db3efb59d38bc4bf9563 +Author: dtucker@openbsd.org +Date: Mon Mar 25 01:28:29 2024 +0000 + + upstream: In PuTTY interop test, don't assume the PuTTY major + + version is 0. Patch from cjwatson at debian.org via bz#3671. + + OpenBSD-Regress-ID: 835ed03c1b04ad46be82e674495521f11b840191 + +commit 8a421b927700f3834b4d985778e252b8e3299f83 +Author: Darren Tucker +Date: Tue Mar 26 18:38:14 2024 +1100 + + Really mkdir /usr/local/etc in CI tests. + +commit 2946ed522c47ce045314533d426b4e379f745e59 +Author: Darren Tucker +Date: Tue Mar 26 17:19:09 2024 +1100 + + Better short name for OpenBSD upstream CI jobs too. + +commit 18dbe8eff647aacb82d7e86b4ce63d5beee11f25 +Author: Darren Tucker +Date: Tue Mar 26 17:13:52 2024 +1100 + + Ensure /usr/local/etc exists before using in tests. + +commit 5fc1085128e3348bb1b5ee4d955cc767b019b3ad +Author: Darren Tucker +Date: Tue Mar 26 16:50:46 2024 +1100 + + Be more specific about when to rerun workflows. + +commit 5516923e8ae3da0823fea0d7d28aa813627142c0 +Author: Darren Tucker +Date: Tue Mar 26 16:35:27 2024 +1100 + + Add short names for test jobs on github CI. + +commit dc37d2d2470b4a9cedcee9ac926b7362214e3305 +Author: Darren Tucker +Date: Tue Mar 26 16:26:14 2024 +1100 + + If we're using xpg4's id, remember to pass args. + +commit fe169487937780392b23d3ff3c00e5898c10f784 +Author: dtucker@openbsd.org +Date: Tue Mar 26 01:23:11 2024 +0000 + + upstream: Import regenerated moduli. + + OpenBSD-Commit-ID: ad3d1486d105b008c93e952d158e5af4d9d4c531 + +commit 151146f03b490d19145cd421763aa7d42f5c50e2 +Author: job@openbsd.org +Date: Thu Mar 14 06:23:14 2024 +0000 + + upstream: Clarify how literal IPv6 addresses can be used in -J mode + + OK djm@ + + OpenBSD-Commit-ID: 524ddae97746b3563ad4a887dfd0a6e6ba114c50 + +commit 0d5bdc87a675271862b67eb6a9fb13a202fb4894 +Author: Darren Tucker +Date: Mon Mar 25 16:14:21 2024 +1100 + + Add Mac OS X 14 test targets. + +commit 2d7964a03e1f50a48040ec6912c0a956df909d21 +Author: Darren Tucker +Date: Mon Mar 25 14:05:40 2024 +1100 + + Move xpg4 'id' handling into test-exec.sh. + + Handle replacement of 'id' the same way as we do other Portable specific + replacements in test-exec.sh. This brings percent.sh back into sync + with upstream. + +commit 75d1d49ed10d978171cdafad28bdbffdbd48f41e +Author: Darren Tucker +Date: Mon Mar 25 10:38:03 2024 +1100 + + Update branches shown on ci-status to 9.7 and 9.6. + +commit f9193f03db0029fc9c31fbdb5c66a2737446bd8f +Author: Darren Tucker +Date: Mon Mar 25 09:28:02 2024 +1100 + + Improve detection of -fzero-call-used-regs=used. + + Should better detect problems with gcc 13 on m68k. bz#3673 from Colin + Watson via bz#3673 and https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110934 + + Signed-off-by: Darren Tucker + +commit 86bdd3853f4d32c85e295e6216a2fe0953ad93f0 +Author: Damien Miller +Date: Mon Mar 11 16:20:49 2024 +1100 + + version number in README + +commit 282721418e6465bc39ccfd39bb0133e670ee4423 +Author: Damien Miller +Date: Mon Mar 11 16:20:08 2024 +1100 + + crank RPM spec versions + +commit 3876a3bbd2ca84d23ba20f8b69ba83270c04ce3a +Author: djm@openbsd.org +Date: Mon Mar 11 04:59:47 2024 +0000 + + upstream: openssh-9.7 + + OpenBSD-Commit-ID: 618ececf58b8cdae016b149787af06240f7b0cbc + +commit 8fc109cc614954a8eb2738c48c0db36a62af9a06 +Author: Darren Tucker +Date: Mon Mar 11 12:59:26 2024 +1100 + + Test against current OpenSSL and LibreSSL releases. + + Add LibreSSL 3.9.0, bump older branches to their respective current + releases. + +commit 26b09b45fec7b88ba09042c09be4157e58e231e2 +Author: Damien Miller +Date: Sun Mar 10 16:24:57 2024 +1100 + + quote regexes used to test for algorithm support + + Fixes test failures on Solaris 8 reported by Tom G. Christensen + +commit a6a740a4948d10a622b505135bb485c10f21db5e +Author: djm@openbsd.org +Date: Sat Mar 9 05:12:13 2024 +0000 + + upstream: avoid logging in signal handler by converting mainloop to + + ppoll() bz3670, reported by Ben Hamilton; ok dtucker@ + + OpenBSD-Commit-ID: e58f18042b86425405ca09e6e9d7dfa1df9f5f7f + +commit cd82f7526e0481720567ae41db7849ab1c27e27b +Author: djm@openbsd.org +Date: Fri Mar 8 22:16:32 2024 +0000 + + upstream: skip more whitespace, fixes find-principals on + + allowed_signers files with blank lines; reported by Wiktor Kwapisiewicz + + OpenBSD-Commit-ID: b3a22a2afd753d70766f34bc7f309c03706b5298 + +commit 2f9d2af5cb19905d87f37d1e11c9f035ac5daf3b +Author: dtucker@openbsd.org +Date: Fri Mar 8 11:34:10 2024 +0000 + + upstream: Invoke ProxyCommand that uses stderr redirection via + + $TEST_SHELL. Fixes test when run by a user whose login shell is tcsh. + Found by vinschen at redhat.com. + + OpenBSD-Regress-ID: f68d79e7f00caa8d216ebe00ee5f0adbb944062a + +commit 9b3f0beb4007a7e01dfedabb429097fb593deae6 +Author: Darren Tucker +Date: Thu Mar 7 17:18:14 2024 +1100 + + Prefer openssl binary from --with-ssl-dir directory. + + Use openssl in the directory specified by --with-ssl-dir as long + as it's functional. Reported by The Doctor. + +commit c47e1c9c7911f38b2fc2fb01b1f6ae3a3121a838 +Author: djm@openbsd.org +Date: Wed Mar 6 02:59:59 2024 +0000 + + upstream: fix memory leak in mux proxy mode when requesting forwarding. + + found by RASU JSC, reported by Maks Mishin in GHPR#467 + + OpenBSD-Commit-ID: 97d96a166b1ad4b8d229864a553e3e56d3116860 + +commit 242742827fea4508e68097c128e802edc79addb5 +Author: djm@openbsd.org +Date: Wed Mar 6 00:31:04 2024 +0000 + + upstream: wrap a few PKCS#11-specific bits in ENABLE_PKCS11 + + OpenBSD-Commit-ID: 463e4a69eef3426a43a2b922c4e7b2011885d923 + +commit d52b6509210e2043f33e5a1de58dd4a0d5d48c2a +Author: Damien Miller +Date: Wed Mar 6 11:31:36 2024 +1100 + + disable RSA tests when algorithm is not supported + + Unbreaks "make test" when compiled --without-openssl. + + Similar treatment to how we do DSA and ECDSA. + +commit 668d270a6c77e8b5a1da26ecad2e6de9f62c8fe4 +Author: Damien Miller +Date: Wed Mar 6 10:33:20 2024 +1100 + + add a --without-retpoline configure option + + discussed with deraadt and dtucker a while ago + +commit 3deb501f86fc47e175ef6a3eaba9b9846a80d444 +Author: djm@openbsd.org +Date: Mon Mar 4 04:13:18 2024 +0000 + + upstream: fix leak of CanonicalizePermittedCNAMEs on error path; + + spotted by Coverity (CID 438039) + + OpenBSD-Commit-ID: 208839699939721f452a4418afc028a9f9d3d8af + +commit 65a44a8a4f7d902a64d4e60eda84384b2e2a24a2 +Author: djm@openbsd.org +Date: Mon Mar 4 02:16:11 2024 +0000 + + upstream: Separate parsing of string array options from applying them + + to the active configuration. This fixes the config parser from erroneously + rejecting cases like: + + AuthenticationMethods password + Match User ivy + AuthenticationMethods any + + bz3657 ok markus@ + + OpenBSD-Commit-ID: 7f196cba634c2a3dba115f3fac3c4635a2199491 + +commit 6886e1b1f55c90942e4e6deed930f8ac32e0f938 +Author: Darren Tucker +Date: Thu Feb 22 17:59:35 2024 +1100 + + Add nbsd10 test target. + +commit d86bf8a3f6ea4fa7887406c2aa9959db71fa41be +Author: Damien Miller +Date: Thu Feb 22 12:06:10 2024 +1100 + + more descriptive configure test name + +commit 9ee335aacc9f5bdc4cc2c19fafb45e27be7d234e +Author: djm@openbsd.org +Date: Wed Feb 21 06:17:29 2024 +0000 + + upstream: explain arguments of internal-sftp GHPR#454 from Niklas + + Hambüchen + MIME-Version: 1.0 + Content-Type: text/plain; charset=UTF-8 + Content-Transfer-Encoding: 8bit + + OpenBSD-Commit-ID: 0335d641ae6b5b6201b9ffd5dd06345ebbd0a3f3 + +commit d1164cb1001dd208fee88aaa9b43d5e6fd917274 +Author: djm@openbsd.org +Date: Wed Feb 21 06:06:43 2024 +0000 + + upstream: clarify permissions requirements for ChrootDirectory Part + + of GHPR#454 from Niklas Hambüchen + MIME-Version: 1.0 + Content-Type: text/plain; charset=UTF-8 + Content-Transfer-Encoding: 8bit + + OpenBSD-Commit-ID: d37bc8786317a11649c62ff5e2936441186ef7a0 + +commit d410e17d186552d0717f18217d0d049486754365 +Author: djm@openbsd.org +Date: Wed Feb 21 06:05:06 2024 +0000 + + upstream: .Cm for a keyword. Part of GHPR#454 from Niklas Hambüchen + + OpenBSD-Commit-ID: d59c52559f926fa82859035d79749fbb4a3ce18a + +commit ab73f9678ebf06b32d6361b88b50b42775e0565b +Author: djm@openbsd.org +Date: Wed Feb 21 06:01:13 2024 +0000 + + upstream: fix typo in match directive predicate (s/tagged/tag) GHPR#462 + + from Tobias Manske + + OpenBSD-Commit-ID: 05b23b772677d48aa82eefd7ebebd369ae758908 + +commit 9844aa2521ccfb1a2d73745680327b79e0574445 +Author: djm@openbsd.org +Date: Wed Feb 21 05:57:34 2024 +0000 + + upstream: fix proxy multiplexing mode, broken when keystroke timing + + obfuscation was added. GHPR#463 from montag451 + + OpenBSD-Commit-ID: 4e412d59b3f557d431f1d81c715a3bc0491cc677 + +commit ee6d932acb532f80b11bb7cf161668c70ec8a117 +Author: djm@openbsd.org +Date: Tue Feb 20 04:10:03 2024 +0000 + + upstream: don't append a gratuitous space to the end of subsystem + + arguments; bz3667 + + OpenBSD-Commit-ID: e11023aeb3f30b77a674e37b8292c862926d5dc6 + +commit e27f032aa8fcbae9b2e7c451baaf4b8ac6fa3d45 +Author: dtucker@openbsd.org +Date: Mon Feb 19 09:25:52 2024 +0000 + + upstream: Always define puttysetup function. + + OpenBSD-Regress-ID: b4c0ccfa4006a1bc5dfd99ccf21c854d3ce2aee0 + +commit 84046f9991abef5f46b040b10cf3d494f933a17b +Author: dtucker@openbsd.org +Date: Fri Feb 9 08:56:59 2024 +0000 + + upstream: Exapnd PuTTY test coverage. + + Expand the set of ciphers, MACs and KEX methods in the PuTTY interop + tests. + + OpenBSD-Regress-ID: dd28d97d48efe7329a396d0d505ee2907bf7fc57 + +commit bbf541ee2afe07b08a8b56fa0dc6f38fcfceef2a +Author: dtucker@openbsd.org +Date: Fri Feb 9 08:47:42 2024 +0000 + + upstream: Factor out PuTTY setup. + + Factor out PuTTY and call only when needed. + + This allows us to avoid PuTTY key setup when it's not needed, which + speeds up the overall test run by a couple of percent. + + OpenBSD-Regress-ID: c25eaccc3c91bc874400f7c85ce40e9032358c1c + +commit d31c21c57fb4245271680a1e5043cf6470a96766 +Author: naddy@openbsd.org +Date: Sat Feb 10 11:28:52 2024 +0000 + + upstream: clean sshd random relinking kit; ok miod@ + + OpenBSD-Commit-ID: 509bb19bb9762a4b3b589af98bac2e730541b6d4 + +commit 4dbc5a363ff53a2fcecf6bc3bcc038badc12f118 +Author: djm@openbsd.org +Date: Fri Feb 2 00:13:34 2024 +0000 + + upstream: whitespace + + OpenBSD-Commit-ID: b24680bc755b621ea801ff8edf6f0f02b68edae1 + +commit efde85dda2130272af24cc346f6c3cd326182ff1 +Author: Darren Tucker +Date: Mon Feb 19 17:29:31 2024 +1100 + + Improve error message for OpenSSL header check. + + bz#3668, ok djm@ + +commit cbbdf868bce431a59e2fa36ca244d5739429408d +Author: Darren Tucker +Date: Wed Feb 7 13:45:02 2024 +1100 + + Interop test against PuTTY snapshot and releases. + +commit 91898bf786b0f149f962c4c96c08a46f29888c10 +Author: Darren Tucker +Date: Tue Feb 6 16:21:05 2024 +1100 + + Put privsep dir on OS X on /usr/local. + + On some runners we can't create /var/empty, so put it some place we can + write. Should fix test breakage on Max OS X 11. + +commit be5ed8ebed8388c5056bfde4688308cc873c18b9 +Author: Darren Tucker +Date: Tue Feb 6 11:19:42 2024 +1100 + + Add --disable-fd-passing option. + + .. and enable for the minix3 test VM. This will cause it to more reliably + skip tests that need FD passing and should fix the current test breakage. + +commit 0f6a8a0d0a518fd78c4cbebfdac990a57a1c4e41 +Author: Darren Tucker +Date: Tue Feb 6 11:18:44 2024 +1100 + + Use "skip" function instead doing it ourselves. + +commit 3ad669f81aabbd2ba9fbd472903f680f598e1e99 +Author: Damien Miller +Date: Thu Feb 1 14:01:18 2024 +1100 + + ignore some vim droppings + +commit c283f29d23611a06bbee06bcf458f2fffad721d9 +Author: djm@openbsd.org +Date: Thu Feb 1 02:37:33 2024 +0000 + + upstream: whitespace + + OpenBSD-Commit-ID: bf9e4a1049562ee4322684fbdce07142f04fdbb7 + +commit 0d96b1506b2f4757fefa5d1f884d49e96a6fd4c3 +Author: Damien Miller +Date: Tue Jan 16 14:40:18 2024 +1100 + + skip tests that use multiplexing on Windows + + Some tests here use multiplexing, skip these if DISABLE_FD_PASSING + is set. Should unbreak tests on Windows. + +commit 50080fa42f5f744b798ee29400c0710f1b59f50e +Author: djm@openbsd.org +Date: Thu Jan 11 04:50:28 2024 +0000 + + upstream: don't disable RSA test when DSA is disabled; bug introduced + + in last commit + + OpenBSD-Regress-ID: 8780a7250bf742b33010e9336359a1c516f2d7b5 + +commit 415c94ce17288e0cdcb9e58cc91fba78d33c8457 +Author: djm@openbsd.org +Date: Thu Jan 11 01:45:58 2024 +0000 + + upstream: make DSA testing optional, defaulting to on + + ok markus + + OpenBSD-Regress-ID: dfc27b5574e3f19dc4043395594cea5f90b8572a + +commit f9311e8921d92c5efca767227a497ab63280ac39 +Author: djm@openbsd.org +Date: Thu Jan 11 01:51:16 2024 +0000 + + upstream: ensure key_fd is filled when DSA is disabled; spotted by + + tb@ + + OpenBSD-Commit-ID: 9dd417b6eec3cf67e870f147464a8d93f076dce7 + +commit 4e838120a759d187b036036610402cbda33f3203 +Author: djm@openbsd.org +Date: Thu Jan 11 01:45:36 2024 +0000 + + upstream: make DSA key support compile-time optional, defaulting to + + on + + ok markus@ + + OpenBSD-Commit-ID: 4f8e98fc1fd6de399d0921d5b31b3127a03f581d + +commit afcc9028bfc411bc26d20bba803b83f90cb84e26 +Author: jmc@openbsd.org +Date: Wed Jan 10 06:33:13 2024 +0000 + + upstream: fix incorrect capitalisation; + + OpenBSD-Commit-ID: cb07eb06e15fa2334660ac73e98f29b6a1931984 + +commit 9707c8170c0c1baeb1e06e5a53f604498193885f +Author: djm@openbsd.org +Date: Tue Jan 9 22:19:36 2024 +0000 + + upstream: extend ChannelTimeout regression test to exercise multiplexed + + connections and the new "global" timeout type. ok dtucker@ + + OpenBSD-Regress-ID: f10d19f697024e9941acad7c2057f73d6eacb8a2 + +commit b31b12d28de96e1d43581d32f34da8db27e11c03 +Author: djm@openbsd.org +Date: Tue Jan 9 22:19:00 2024 +0000 + + upstream: add a "global" ChannelTimeout type to ssh(1) and sshd(8) + + that watches all open channels and will close all open channels if there is + no traffic on any of them for the specified interval. This is in addition to + the existing per-channel timeouts added a few releases ago. + + This supports use-cases like having a session + x11 forwarding channel + open where one may be idle for an extended period but the other is + actively used. The global timeout would allow closing both channels when + both have been idle for too long. + + ok dtucker@ + + OpenBSD-Commit-ID: 0054157d24d2eaa5dc1a9a9859afefc13d1d7eb3 + +commit 602f4beeeda5bb0eca181f8753d923a2997d0a51 +Author: djm@openbsd.org +Date: Tue Jan 9 21:39:14 2024 +0000 + + upstream: adapt ssh_api.c code for kex-strict + + from markus@ ok me + + OpenBSD-Commit-ID: 4d9f256852af2a5b882b12cae9447f8f00f933ac + +commit 42ba34aba8708cf96583ff52975d95a8b47d990d +Author: Damien Miller +Date: Mon Jan 8 16:26:37 2024 +1100 + + nite that recent OSX tun/tap is unsupported + +commit 690bc125f9a3b20e47745fa8f5b5e1fd5820247f +Author: Sevan Janiyan +Date: Wed Dec 27 04:57:49 2023 +0000 + + README.platform: update tuntap url + +commit 6b8be2ccd7dd091808f86af52066b0c2ec30483a +Author: Rose <83477269+AtariDreams@users.noreply.github.com> +Date: Tue Dec 19 11:48:20 2023 -0500 + + Fix compilation error in ssh-pcks11-client.c + + Compilation fails becaus of an undefined reference to helper_by_ec, + because we forgot the preprocessor conditional that excludes that function + from being called in unsupported configurations. + +commit 219c8134157744886ee6ac5b8c1650abcd981f4c +Author: djm@openbsd.org +Date: Mon Jan 8 05:11:18 2024 +0000 + + upstream: Remove outdated note from PROTOCOL.mux + + Port forward close by control master is already implemented + by `mux_master_process_close_fwd` in `mux.c` + + GHPR442 from bigb4ng + + OpenBSD-Commit-ID: ad0734fe5916d2dc7dd02b588906cea4df0482fb + +commit 4c3cf362631ccc4ffd422e572f075d5d594feace +Author: djm@openbsd.org +Date: Mon Jan 8 05:05:15 2024 +0000 + + upstream: fix missing field in users-groups-by-id@openssh.com reply + + documentation + + GHPR441 from TJ Saunders + + OpenBSD-Commit-ID: ff5733ff6ef4cd24e0758ebeed557aa91184c674 + +commit f64cede2a3c298b50a2659a8b53eb3ab2c0b8d23 +Author: djm@openbsd.org +Date: Mon Jan 8 04:10:03 2024 +0000 + + upstream: make kex-strict section more explicit about its intent: + + banning all messages not strictly required in KEX + + OpenBSD-Commit-ID: fc33a2d7f3b7013a7fb7500bdbaa8254ebc88116 + +commit 698fe6fd61cbcb8e3e0e874a561d4335a49fbde5 +Author: Damien Miller +Date: Mon Jan 8 14:46:19 2024 +1100 + + update fuzzer example makefile to clang16 + +commit fc332cb2d602c60983a8ec9f89412754ace06425 +Author: Damien Miller +Date: Mon Jan 8 14:45:49 2024 +1100 + + unbreak fuzzers - missing pkcs11_make_cert() + + provide stub for use in fuzzer harness + +commit 9ea0a4524ae3276546248a926b6641b2fbc8421b +Author: Damien Miller +Date: Mon Jan 8 14:45:14 2024 +1100 + + unbreak fuzzers for clang16 + + getopt() needs a throw() attribute to compile, so supply one when compiling + things with C++ + +commit a72833d00788ef91100c643536ac08ada46440e1 +Author: djm@openbsd.org +Date: Mon Jan 8 00:34:33 2024 +0000 + + upstream: remove ext-info-* in the kex.c code, not in callers; + + with/ok markus@ + + OpenBSD-Commit-ID: c06fe2d3a0605c517ff7d65e38ec7b2d1b0b2799 + +commit 86f9e96d9bcfd1f5cd4bf8fb57a9b4c242df67df +Author: djm@openbsd.org +Date: Mon Jan 8 00:30:39 2024 +0000 + + upstream: fix typo; spotted by Albert Chin + + OpenBSD-Commit-ID: 77140b520a43375b886e535eb8bd842a268f9368 + +commit f0cbd26ec91bd49719fb3eea7ca44d2380318b9a +Author: dtucker@openbsd.org +Date: Thu Jan 4 09:51:49 2024 +0000 + + upstream: Import regenerated moduli. + + OpenBSD-Commit-ID: 5a636f6ca7f25bfe775df4952f7aac90a7fcbbee + +commit 64ddf776531ca4933832beecc8b7ebe1b937e081 +Author: jsg@openbsd.org +Date: Wed Dec 20 00:06:25 2023 +0000 + + upstream: spelling; ok markus@ + + OpenBSD-Commit-ID: 9d01f2e9d59a999d5d42fc3b3efcf8dfb892e31b + +commit 503fbe9ea238a4637e8778208bde8c09bcf78475 +Author: jmc@openbsd.org +Date: Tue Dec 19 06:57:34 2023 +0000 + + upstream: sort -C, and add to usage(); ok djm + + OpenBSD-Commit-ID: 80141b2a5d60c8593e3c65ca3c53c431262c812f + +commit 5413b1c7ff5a19c6a7d44bd98c5a83eb47819ba6 +Author: djm@openbsd.org +Date: Tue Dec 19 06:41:14 2023 +0000 + + upstream: correct section numbers; from Ed Maste + + OpenBSD-Commit-ID: e289576ee5651528404cb2fb68945556052cf83f + +commit 430ef864645cff83a4022f5b050174c840e275da +Author: djm@openbsd.org +Date: Mon Dec 18 15:58:56 2023 +0000 + + upstream: match flag type (s/int/u_int) + + OpenBSD-Commit-ID: 9422289747c35ccb7b31d0e1888ccd5e74ad566a + +commit 1036d77b34a5fa15e56f516b81b9928006848cbd +Author: Damien Miller +Date: Fri Dec 22 17:56:26 2023 +1100 + + better detection of broken -fzero-call-used-regs + + gcc 13.2.0 on ppc64le refuses to compile some function, including + cipher.c:compression_alg_list() with an error: + + > sorry, unimplemented: argument ‘used’ is not supportedcw + > for ‘-fzero-call-used-regs’ on this target + + This extends the autoconf will-it-work test with a similarly- + structured function that seems to catch this. + + Spotted/tested by Colin Watson; bz3645 + +commit 8241b9c0529228b4b86d88b1a6076fb9f97e4a99 +Author: Damien Miller +Date: Tue Dec 19 01:59:50 2023 +1100 + + crank versions + +commit 2f2c65cb5f1518a9c556d3e8efa27ea0ca305c6b +Author: Damien Miller +Date: Tue Dec 19 01:59:06 2023 +1100 + + depend + +commit e48cdee8e19059203b1aeeabec2350b8375fa61f +Author: djm@openbsd.org +Date: Mon Dec 18 14:50:08 2023 +0000 + + upstream: regress test for agent PKCS#11-backed certificates + + OpenBSD-Regress-ID: 38f681777cb944a8cc3bf9d0ad62959a16764df9 + +commit 2f512f862df1d5f456f82a0334c9e8cc7208a2a1 +Author: djm@openbsd.org +Date: Mon Dec 18 14:49:39 2023 +0000 + + upstream: regress test for constrained PKCS#11 keys + + OpenBSD-Regress-ID: b2f26ae95d609d12257b43aef7cd7714c82618ff + +commit cdddd66412ca5920ed4d3ebbfa6ace12dbd9b82f +Author: djm@openbsd.org +Date: Mon Dec 18 14:48:44 2023 +0000 + + upstream: openssh-9.6 + + OpenBSD-Commit-ID: 21759837cf0e0092d9a2079f8fb562071c11016b + +commit 6d51feab157cedf1e7ef5b3f8781ca8ff9c4ab1b +Author: djm@openbsd.org +Date: Mon Dec 18 14:48:08 2023 +0000 + + upstream: ssh-agent: record failed session-bind attempts + + Record failed attempts to session-bind a connection and refuse signing + operations on that connection henceforth. + + Prevents a future situation where we add a new hostkey type that is not + recognised by an older ssh-agent, that consequently causes session-bind + to fail (this situation is only likely to arise when people mix ssh(1) + and ssh-agent(1) of different versions on the same host). Previously, + after such a failure the agent socket would be considered unbound and + not subject to restriction. + + Spotted by Jann Horn + + OpenBSD-Commit-ID: b0fdd023e920aa4831413f640de4c5307b53552e + +commit 7ef3787c84b6b524501211b11a26c742f829af1a +Author: djm@openbsd.org +Date: Mon Dec 18 14:47:44 2023 +0000 + + upstream: ban user/hostnames with most shell metacharacters + + This makes ssh(1) refuse user or host names provided on the + commandline that contain most shell metacharacters. + + Some programs that invoke ssh(1) using untrusted data do not filter + metacharacters in arguments they supply. This could create + interactions with user-specified ProxyCommand and other directives + that allow shell injection attacks to occur. + + It's a mistake to invoke ssh(1) with arbitrary untrusted arguments, + but getting this stuff right can be tricky, so this should prevent + most obvious ways of creating risky situations. It however is not + and cannot be perfect: ssh(1) has no practical way of interpreting + what shell quoting rules are in use and how they interact with the + user's specified ProxyCommand. + + To allow configurations that use strange user or hostnames to + continue to work, this strictness is applied only to names coming + from the commandline. Names specified using User or Hostname + directives in ssh_config(5) are not affected. + + feedback/ok millert@ markus@ dtucker@ deraadt@ + + OpenBSD-Commit-ID: 3b487348b5964f3e77b6b4d3da4c3b439e94b2d9 + +commit 0cb50eefdd29f0fec31d0e71cc4b004a5f704e67 +Author: djm@openbsd.org +Date: Mon Dec 18 14:47:20 2023 +0000 + + upstream: stricter handling of channel window limits + + This makes ssh/sshd more strict in handling non-compliant peers that + send more data than the advertised channel window allows. Previously + the additional data would be silently discarded. This change will + cause ssh/sshd to terminate the connection if the channel window is + exceeded by more than a small grace allowance. + + ok markus@ + + OpenBSD-Commit-ID: 811e21b41831eba3dd7f67b3d409a438f20d3037 + +commit 4448a2938abc76e6bd33ba09b2ec17a216dfb491 +Author: djm@openbsd.org +Date: Mon Dec 18 14:46:56 2023 +0000 + + upstream: Make it possible to load certs from PKCS#11 tokens + + Adds a protocol extension to allow grafting certificates supplied by + ssh-add to keys loaded from PKCS#11 tokens in the agent. + + feedback/ok markus@ + + OpenBSD-Commit-ID: bb5433cd28ede2bc910996eb3c0b53e20f86037f + +commit 881d9c6af9da4257c69c327c4e2f1508b2fa754b +Author: djm@openbsd.org +Date: Mon Dec 18 14:46:12 2023 +0000 + + upstream: apply destination constraints to all p11 keys + + Previously applied only to the first key returned from each token. + + ok markus@ + + OpenBSD-Commit-ID: 36df3afb8eb94eec6b2541f063d0d164ef8b488d + +commit a7ed931caeb68947d30af8a795f4108b6efad761 +Author: djm@openbsd.org +Date: Mon Dec 18 14:45:49 2023 +0000 + + upstream: add "ext-info-in-auth@openssh.com" extension + + This adds another transport protocol extension to allow a sshd to send + SSH2_MSG_EXT_INFO during user authentication, after the server has + learned the username that is being logged in to. + + This lets sshd to update the acceptable signature algoritms for public + key authentication, and allows these to be varied via sshd_config(5) + "Match" directives, which are evaluated after the server learns the + username being authenticated. + + Full details in the PROTOCOL file + + OpenBSD-Commit-ID: 1de7da7f2b6c32a46043d75fcd49b0cbb7db7779 + +commit 1edb00c58f8a6875fad6a497aa2bacf37f9e6cd5 +Author: djm@openbsd.org +Date: Mon Dec 18 14:45:17 2023 +0000 + + upstream: implement "strict key exchange" in ssh and sshd + + This adds a protocol extension to improve the integrity of the SSH + transport protocol, particular in and around the initial key exchange + (KEX) phase. + + Full details of the extension are in the PROTOCOL file. + + with markus@ + + OpenBSD-Commit-ID: 2a66ac962f0a630d7945fee54004ed9e9c439f14 + +commit 59d691b886c79e70b1d1c4ab744e81fd176222fd +Author: Damien Miller +Date: Mon Dec 18 14:49:11 2023 +1100 + + better detection of broken -fzero-call-used-regs + + Use OSSH_CHECK_CFLAG_LINK() for detection of these flags and extend + test program to exercise varargs, which seems to catch more stuff. + + ok dtucker@ + +commit aa7b21708511a6d4aed3839fc9f6e82e849dd4a1 +Author: djm@openbsd.org +Date: Wed Dec 13 03:28:19 2023 +0000 + + upstream: when invoking KnownHostsCommand to determine the order of + + host key algorithms to request, ensure that the hostname passed to the + command is decorated with the port number for ports other than 22. + + This matches the behaviour of KnownHostsCommand when invoked to look + up the actual host key. + + bz3643, ok dtucker@ + + OpenBSD-Commit-ID: 5cfabc0b7c6c7ab473666df314f377b1f15420b1 + +commit 4086bd6652c0badccc020218a62190a7798fb72c +Author: markus@openbsd.org +Date: Fri Dec 8 09:18:39 2023 +0000 + + upstream: prevent leak in sshsig_match_principals; ok djm@ + + OpenBSD-Commit-ID: 594f61ad4819ff5c72dfe99ba666a17f0e1030ae + +commit 19d3ee2f3adf7d9a606ff015c1e153744702c4c9 +Author: djm@openbsd.org +Date: Wed Dec 6 21:06:48 2023 +0000 + + upstream: short circuit debug log processing early if we're not going + + to log anything. From Kobe Housen + + OpenBSD-Commit-ID: 2bcddd695872a1bef137cfff7823044dcded90ea + +commit 947affad4831df015c498c00c6351ea6f13895d5 +Author: Darren Tucker +Date: Mon Nov 27 09:37:28 2023 +1100 + + Add tests for OpenSSL 3.2.0 and 3.2 stable branch. + +commit 747dce36206675ca6b885010a835733df469351b +Author: Darren Tucker +Date: Sat Nov 25 09:03:38 2023 +1100 + + Use non-zero arg in compiler test program. + + Now that we're running the test program, passing zero to the test function + can cause divide-by-zero exceptions which might show up in logs. + +commit 3d44a5c56585d1c351dbc006240a591b6da502b1 +Author: dtucker@openbsd.org +Date: Fri Nov 24 00:31:30 2023 +0000 + + upstream: Plug mem leak of msg when processing a quit message. + + Coverity CID#427852, ok djm@ + + OpenBSD-Commit-ID: bf85362addbe2134c3d8c4b80f16601fbff823b7 + +commit 1d7f9b6e297877bd00973e6dc5c0642dbefc3b5f +Author: dtucker@openbsd.org +Date: Thu Nov 23 03:37:05 2023 +0000 + + upstream: Include existing mux path in debug message. + + OpenBSD-Commit-ID: 1c3641be10c2f4fbad2a1b088a441d072e18bf16 + +commit f29934066bd0e561a2e516b7e584fb92d2eedee0 +Author: Darren Tucker +Date: Thu Nov 23 19:41:27 2023 +1100 + + Add an Ubuntu 22.04 test VM. + + This is the same version as Github's runners so most of the testing on + it is over there, but having a local VM makes debugging much easier. + +commit a93284a780cd3972afe5f89086b75d564ba157f3 +Author: Darren Tucker +Date: Thu Nov 23 19:36:22 2023 +1100 + + Add gcc-12 -Werror test on Ubuntu 22.04. + + Explictly specify gcc-11 on Ubuntu 22.04 (it's the system compiler). + +commit 670f5a647e98b6fd95ad64f789f87ee3274b481b +Author: Darren Tucker +Date: Thu Nov 23 19:34:57 2023 +1100 + + Check return value from write to prevent warning. + + ... and since we're testing for flags with -Werror, this caused + configure to mis-detect compiler flags. + +commit cea007d691cfedfa07a5b8599f97ce0511f53fc9 +Author: Darren Tucker +Date: Wed Nov 22 21:18:55 2023 +1100 + + Run compiler test program when compiling natively. + + ok djm@ + +commit ee0d305828f13536c0a416bbf9c3e81039d9ea55 +Author: Darren Tucker +Date: Wed Nov 22 21:18:07 2023 +1100 + + Factor out compiler test program into a macro. + + ok djm@ + +commit de304c76316b029df460673725a9104224b9959b +Author: Darren Tucker +Date: Wed Nov 22 08:55:36 2023 +1100 + + Add fbsd14 VM to test pool. + +commit 99a2df5e1994cdcb44ba2187b5f34d0e9190be91 +Author: Darren Tucker +Date: Tue Nov 21 16:19:29 2023 +1100 + + Expand -fzero-call-used-regs test to cover gcc 11. + + It turns out that gcc also has some problems with -fzero-call-used-regs, + at least v11 on mips. Previously the test in OSSH_CHECK_CFLAG_COMPILE + was sufficient to catch it with "=all", but not sufficient for "=used". + Expand the testcase and include it in the other tests for good measure. + See bz#3629. ok djm@. + +commit ff220d4010717f7bfbbc02a2400666fb9d24f250 +Author: Darren Tucker +Date: Tue Nov 21 14:04:34 2023 +1100 + + Stop using -fzero-call-used-regs=all + + ... since it seems to be problematic with several different versions of + clang. Only use -fzero-call-used-regs=used which is less + problematic, except with Apple's clang where we don't use it at all. + bz#3629, ok djm@ + +commit 2a19e02f36b16f0f6cc915f7d1e60ead5e36303b +Author: Darren Tucker +Date: Tue Nov 21 14:02:18 2023 +1100 + + Allow for vendor prefix on clang version numbers. + + Correctly detects the version of OpenBSD's native clang, as well as + Apple's. Spotted tb@, ok djm@. + +commit c52db0114826d73eff6cdbf205e9c1fa4f7ca6c6 +Author: djm@openbsd.org +Date: Mon Nov 20 02:50:00 2023 +0000 + + upstream: set errno=EAFNOSUPPORT when filtering addresses that don't + + match AddressFamily; yields slightly better error message if no address + matches. bz#3526 + + OpenBSD-Commit-ID: 29cea900ddd8b04a4d1968da5c4a893be2ebd9e6 + +commit 26f3f3bbc69196d908cad6558c8c7dc5beb8d74a +Author: djm@openbsd.org +Date: Wed Nov 15 23:03:38 2023 +0000 + + upstream: when connecting via socket (the default case), filter + + addresses by AddressFamily if one was specified. Fixes the case where, if + CanonicalizeHostname is enabled, ssh may ignore AddressFamily. bz5326; ok + dtucker + + OpenBSD-Commit-ID: 6c7d7751f6cd055126b2b268a7b64dcafa447439 + +commit 050c335c8da43741ed0df2570ebfbd5d1dfd0a31 +Author: djm@openbsd.org +Date: Wed Nov 15 22:51:49 2023 +0000 + + upstream: when deciding whether to enable keystroke timing + + obfuscation, only consider enabling it when a channel with a tty is open. + + Avoids turning on the obfucation when X11 forwarding only is in use, + which slows it right down. Reported by Roger Marsh + + OpenBSD-Commit-ID: c292f738db410f729190f92de100c39ec931a4f1 + +commit 676377ce67807a24e08a54cd60ec832946cc6cae +Author: tobhe@openbsd.org +Date: Mon Nov 13 09:18:19 2023 +0000 + + upstream: Make sure sftp_get_limits() only returns 0 if 'limits' + + was initialized. This fixes a potential uninitialized use of 'limits' in + sftp_init() if sftp_get_limits() returned early because of an unexpected + message type. + + ok djm@ + + OpenBSD-Commit-ID: 1c177d7c3becc1d71bc8763eecf61873a1d3884c + +commit 64e0600f23c6dec36c3875392ac95b8a9100c2d6 +Author: Darren Tucker +Date: Mon Nov 13 20:03:31 2023 +1100 + + Test current releases of LibreSSL and OpenSSL. + + Retire some of the older releases. + +commit c8ed7cc545879ac15f6ce428be4b29c35598bb2a +Author: dtucker@openbsd.org +Date: Wed Nov 1 02:08:38 2023 +0000 + + upstream: Specify ssh binary to use + + ... instead of relying on installed one. Fixes test failures in -portable + when running tests prior to installation. + + OpenBSD-Regress-ID: b6d6ba71c23209c616efc805a60d9a445d53a685 + +commit e9fc2c48121cada1b4dcc5dadea5d447fe0093c3 +Author: Darren Tucker +Date: Wed Nov 1 13:11:31 2023 +1100 + + Put long-running test targets on hipri runners. + + Some of the selfhosted test targets take a long time to run for various + reasons, so label them for "libvirt-hipri" runners so that they can + start immediately. This should reduce the time to complete all tests. + +commit 7ddf27668f0e21233f08c0ab2fe9ee3fdd6ab1e2 +Author: djm@openbsd.org +Date: Wed Nov 1 00:29:46 2023 +0000 + + upstream: add some tests of forced commands overriding Subsystem + + directives + + OpenBSD-Regress-ID: eb48610282f6371672bdf2a8b5d2aa33cfbd322b + +commit fb06f9b5a065dfbbef5916fc4accc03c0bf026dd +Author: dtucker@openbsd.org +Date: Tue Oct 31 04:15:40 2023 +0000 + + upstream: Don't try to use sudo inside sshd log wrapper. + + We still need to check if we're using sudo since we don't want to chown + unecessarily, as on some platforms this causes an error which pollutes + stderr. We also don't want to unnecessarily invoke sudo, since it's + running in the context of the proxycommand, on *other* platforms it + may not be able to authenticate, and if we're using SUDO then it should + already be privileged. + + OpenBSD-Regress-ID: 70d58df7503db699de579a9479300e5f3735f4ee + +commit fc3cc33e88c242c704781c6c48087838f1dcfa2a +Author: dtucker@openbsd.org +Date: Tue Oct 31 02:58:45 2023 +0000 + + upstream: Only try to chmod logfile if we have sudo. If we don't have + + sudo then we won't need to chmod. + + OpenBSD-Regress-ID: dbad2f5ece839658ef8af3376cb1fb1cabe2e324 + +commit 3a506598fddd3f18f9095af3fe917f24cbdd32e0 +Author: djm@openbsd.org +Date: Mon Oct 30 23:00:25 2023 +0000 + + upstream: move PKCS#11 setup code to test-exec.sh so it can be reused + + elsewhere + + OpenBSD-Regress-ID: 1d29e6be40f994419795d9e660a8d07f538f0acb + +commit f82fa227a52661c37404a6d33bbabf14fed05db0 +Author: djm@openbsd.org +Date: Mon Oct 30 17:32:00 2023 +0000 + + upstream: tidy and refactor PKCS#11 setup code + + Replace the use of a perl script to delete the controlling TTY with a + SSH_ASKPASS script to directly load the PIN. + + Move PKCS#11 setup code to functions in anticipation of it being used + elsewhere in additional tests. + + Reduce stdout spam + + OpenBSD-Regress-ID: 07705c31de30bab9601a95daf1ee6bef821dd262 + +commit 3cf698c6d4ffa9be1da55672a3519e2135a6366a +Author: Darren Tucker +Date: Mon Oct 30 21:35:03 2023 +1100 + + Add obsd74 test VM and retire obsd69 and obsd70. + +commit 3e21d58a09894acb38dc69ed615d101131f473d0 +Author: Darren Tucker +Date: Mon Oct 30 18:34:12 2023 +1100 + + Add OpenSSL 3.3.0 as a known dev version. + +commit 917ba181c2cbdb250a443589ec732aa36fd51ffa +Author: Darren Tucker +Date: Mon Oct 30 13:32:03 2023 +1100 + + Restore nopasswd sudo rule on Mac OS X. + + This seems to be missing from some (but not all) github runners, so + restore it if it seems to be missing. + +commit c5698abad6d4ec98ca20bcaaabaeacd5e1ec3f4f +Author: Darren Tucker +Date: Mon Oct 30 13:26:52 2023 +1100 + + Don't exit early when setting up on Mac OS X. + + We probably need some of the other bits in there (specifically, setting + the perms on the home directory) so make it less of a special snowflake. + +commit 1d6a878ceba60b9dc14037dddc8f036070c0065f +Author: dtucker@openbsd.org +Date: Sun Oct 29 06:22:07 2023 +0000 + + upstream: Only try to chown logfiles that exist to prevent spurious + + errors. + + OpenBSD-Regress-ID: f1b20a476734e885078c481f1324c9ea03af991e + +commit e612376427a66f835e284f6b426d16d7c85301bc +Author: anton@openbsd.org +Date: Thu Oct 26 18:52:45 2023 +0000 + + upstream: make use of bsd.regress.mk in extra and interop targets; ok + + dtucker@ + + OpenBSD-Regress-ID: 7ea21b5f6fc4506165093b2123d88d20ff13a4f0 + +commit ea0039173957d0edcd6469b9614dcedb44dcb4f9 +Author: dtucker@openbsd.org +Date: Thu Oct 26 12:44:07 2023 +0000 + + upstream: Skip conch interop tests when not enabled instead of fatal. + + OpenBSD-Regress-ID: b0abf81c24ac6c21f367233663228ba16fa96a46 + +commit d220b9ed5494252b26b95f05be118472bc3ab5c0 +Author: dtucker@openbsd.org +Date: Wed Oct 25 05:38:08 2023 +0000 + + upstream: Import regenerated moduli. + + OpenBSD-Commit-ID: 95f5dd6107e8902b87dc5b005ef2b53f1ff378b8 + +commit a611e4db4009447a0151f31a44e235ca32ed4429 +Author: anton@openbsd.org +Date: Wed Oct 25 08:01:59 2023 +0000 + + upstream: ssh conch interop tests requires a controlling terminal; + + ok dtucker@ + + OpenBSD-Regress-ID: cbf2701bc347c2f19d907f113779c666f1ecae4a + +commit da951b5e08c167acb5d6e2eec6f146502f5d6ed8 +Author: anton@openbsd.org +Date: Mon Oct 23 11:30:49 2023 +0000 + + upstream: Use private key that is allowed by sshd defaults in conch + + interop tests. + + ok dtucker@ + + OpenBSD-Regress-ID: 3b7f65c8f409c328bcd4b704f60cb3d31746f045 + +commit 1ca166dbb3c0ce632b98869cd955f69320aa6fe8 +Author: Darren Tucker +Date: Fri Oct 20 20:43:00 2023 +1100 + + Install Dropbear for interop testing. + +commit f993bb58351c5cb71e61aede63805a34a6d4daea +Author: Darren Tucker +Date: Fri Oct 20 20:39:03 2023 +1100 + + Resync PuTTY and Conch path handling with upstream. + + Now that configure finds these for us we can remove these -portable + specific changes. + +commit ff85becd5f5f06a76efa45d30fb204a3c5e5215c +Author: Darren Tucker +Date: Fri Oct 20 20:35:46 2023 +1100 + + Have configure find PuTTY and Conch binaries. + + This will let us remove some -portable specific changes from + test-exec.sh. + +commit c54a50359b9cecddbf3ffcdc26efcb3cd6071ec1 +Author: dtucker@openbsd.org +Date: Fri Oct 20 07:37:07 2023 +0000 + + upstream: Allow overriding the locations of the Dropbear binaries + + similar to what we do for the PuTTY ones. + + OpenBSD-Regress-ID: 7de0e00518fb0c8fdc5f243b7f82f523c936049c + +commit fbaa707d455a61d0aef8ae65e02a25bac5351e5c +Author: dtucker@openbsd.org +Date: Fri Oct 20 06:56:45 2023 +0000 + + upstream: Add interop test with Dropbear. + + Right now this is only dbclient not the Dropbear server since it won't + currently run as a ProxyCommand. + + OpenBSD-Regress-ID: 8cb898c414fcdb252ca6328896b0687acdaee496 + +commit c2003d0dbdcdb61ca336c3f90c5c2b4a09c8e73f +Author: Fabio Pedretti +Date: Mon Oct 16 11:59:53 2023 +0200 + + Update openssl-devel dependency in RPM spec. + + Since openssh 9.4p1, openssl >= 1.1.1 is required, so + build with --without-openssl elsewhere. + According to https://repology.org/project/openssl/versions + openssl 1.1.1 is available on fedora >= 29 and rhel >= 8. + Successfully build tested, installed and run on rhel 6 + +commit 064e09cd632721c7e6889904e07767443ee23821 +Author: Fabio Pedretti +Date: Mon Oct 16 10:13:06 2023 +0200 + + Remove reference of dropped sshd.pam.old file + + The file was removed in openssh 8.8 + +commit 62db354b696b378a164b6e478cb6b0171dcb0c3d +Author: dtucker@openbsd.org +Date: Mon Oct 16 08:40:00 2023 +0000 + + upstream: Move declaration of "len" into the block where it's used. + + This lets us compile Portable with -Werror with when OpenSSL doesn't have + Ed25519 support. + + OpenBSD-Commit-ID: e02e4b4af351946562a7caee905da60eff16ba29 + +commit 6eee8c972d5901d10e80634a006b4e346b2c8c19 +Author: Damien Miller +Date: Fri Oct 13 15:15:05 2023 +1100 + + run t-extra regress tests + + This exposes the t-extra regress tests (including agent-pkcs11.sh) as + a new extra-tests target in the top level Makefile and runs them by + default. ok dtucker@ + +commit 637624dbbac13f2bc3c8ec5b15c9d627d07f2935 +Author: Darren Tucker +Date: Thu Oct 12 22:01:23 2023 +1100 + + Don't use make -j2. + + While we have 2 cores available on github runners, not using it means + that the most recent log message is the actual failure, rather than + having to search back through the log for it. + +commit 971e0cfcfd52ef1d73cf5244074c306a60006e89 +Author: Darren Tucker +Date: Thu Oct 12 16:23:05 2023 +1100 + + Correct arg order for ED255519 AC_LINK_IFELSE test. + +commit c616e64688b2a0c1b4daad69b056099be998d121 +Author: djm@openbsd.org +Date: Thu Oct 12 03:51:08 2023 +0000 + + upstream: typos and extra debug trace calls + + OpenBSD-Regress-ID: 98a2a6b9333743274359e3c0f0e65cf919a591d1 + +commit c49a3fbf10162128c67c59562348de2041188974 +Author: djm@openbsd.org +Date: Thu Oct 12 03:48:53 2023 +0000 + + upstream: ensure logs are owned by correct user; feedback/ok + + dtucker@ + + OpenBSD-Regress-ID: c3297af8f07717f1d400a5d34529962f1a76b5a3 + +commit 5ec0ed79ac074c3437b25f6cba8b8cf21c8d4587 +Author: djm@openbsd.org +Date: Thu Oct 12 03:36:32 2023 +0000 + + upstream: 64 %-expansion keys ought to be enough for anybody; ok + + dtucker (we just hit the previous limit in some cases) + + OpenBSD-Commit-ID: 84070f8001ec22ff5d669f836b62f206e08c5787 + +commit f59a94e22e46db2c23eddeb871aa9e8d93ab0016 +Author: djm@openbsd.org +Date: Thu Oct 12 02:48:43 2023 +0000 + + upstream: don't dereference NULL pointer when hashing jumphost + + OpenBSD-Commit-ID: 251c0263e1759a921341c7efe7f1d4c73e1c70f4 + +commit 281c79168edcc303abfd5bca983616eaa24c5f32 +Author: Damien Miller +Date: Thu Oct 12 13:20:01 2023 +1100 + + Solaris: prefer PRIV_XPOLICY to PRIV_LIMIT + + If the system support PRIV_XPOLICY and one is set, then don't + modify PRIV_LIMIT. bz2833, patch from Ron Jordan, ok dtucker@ + +commit 98fc34df837f3a3b79d2a111b96fe8a39adcab55 +Author: djm@openbsd.org +Date: Thu Oct 12 02:18:18 2023 +0000 + + upstream: add %j token that expands to the configured ProxyJump + + hostname (or the empty string if this option is not being used). bz3610, ok + dtucker + + OpenBSD-Commit-ID: ce9983f7efe6a178db90dc5c1698df025df5e339 + +commit 7f3180be8a85320b5d3221714b40c16e66881249 +Author: djm@openbsd.org +Date: Thu Oct 12 02:15:53 2023 +0000 + + upstream: release GSS OIDs only at end of authentication; bz2982, + + ok dtucker@ + + OpenBSD-Commit-ID: 0daa41e0525ae63cae4483519ecaa37ac485d94c + +commit a612b93de5d86e955bfb6e24278f621118eea500 +Author: djm@openbsd.org +Date: Thu Oct 12 02:12:53 2023 +0000 + + upstream: mask SIGINT/TERM/QUIT/HUP before checking quit_pending + + and use ppoll() to unmask them in the mainloop. Avoids race condition between + signaling ssh to exit and polling. bz3531; ok dtucker + + OpenBSD-Commit-ID: 5c14e1aabcddedb95cdf972283d9c0d5083229e7 + +commit 531b27a006116fe7aff325510aaa576f24844452 +Author: djm@openbsd.org +Date: Wed Oct 11 23:23:58 2023 +0000 + + upstream: sync usage() with ssh.1; spotted by kn@ + + OpenBSD-Commit-ID: 191a85639477dcb5fa1616d270d93b7c8d5c1dfd + +commit 64f7ca881b19be754425dca60d1590d306c9d1d0 +Author: djm@openbsd.org +Date: Wed Oct 11 23:14:33 2023 +0000 + + upstream: ssh -Q does not make sense with other command-line options, + + so give it its own line in the manpage + + OpenBSD-Commit-ID: 00a747f0655c12122bbb77c2796be0013c105361 + +commit a752a6c0e1001f93696d7025f0c867f0376e2ecf +Author: djm@openbsd.org +Date: Wed Oct 11 22:42:26 2023 +0000 + + upstream: add ChannelTimeout support to the client, mirroring the + + same option in the server. ok markus@ + + OpenBSD-Commit-ID: 55630b26f390ac063980cfe7ad8c54b03284ef02 + +commit 76e91e7238cdc5662bc818e2a48d466283840d23 +Author: djm@openbsd.org +Date: Wed Oct 11 22:41:05 2023 +0000 + + upstream: add support for reading ED25519 private keys in PEM PKCS8 + + format; ok markus@ tb@ + + OpenBSD-Commit-ID: 01b85c91757e6b057e9b23b8a23f96415c3c7174 + +commit fc77c8e352c0f44125425c05265e3a00c183d78a +Author: djm@openbsd.org +Date: Wed Oct 11 06:40:54 2023 +0000 + + upstream: mention "none" is a valid argument to IdentityFile; bz3080 + + OpenBSD-Commit-ID: 1b4fb590ef731099349a7d468b77f02b240ac926 + +commit c97520d23d1fe53d30725a2af25d2dddd6f2faff +Author: djm@openbsd.org +Date: Wed Oct 11 05:42:08 2023 +0000 + + upstream: in olde rcp/scp protocol mode, when rejecting a path from the + + server as not matching the glob that the client sent, log (at debug level) + the received pathname as well as the list of possible expected paths expanded + from the glob. bz2966 + + OpenBSD-Commit-ID: 0bd8db8a595334ca86bca8f36e23fc0395315765 + +commit 208c2b719879805983398160791d6a1ef9c2c3fc +Author: djm@openbsd.org +Date: Wed Oct 11 04:46:29 2023 +0000 + + upstream: s/%.100s/%s/ in SSH- banner construction as there's no + + reason to limit its size: the version string bring included is a compile time + constant going into an allocated banner string. + + OpenBSD-Commit-ID: 0ef73304b9bf3e534c60900cd84ab699f859ebcd + +commit 0354790826b97c41bbd171a965574e159b58d83e +Author: tb@openbsd.org +Date: Tue Oct 10 06:49:54 2023 +0000 + + upstream: Garbage collect cipher_get_keyiv_len() + + This is a compat20 leftover, unused since 2017. + + ok djm + + OpenBSD-Commit-ID: 91fa5497c9dc6883064624ac27813a567883fdce + +commit 8d29ee4115001a02641386ae394992c65ed279e0 +Author: djm@openbsd.org +Date: Tue Oct 10 03:57:45 2023 +0000 + + upstream: Reserve a range of "local extension" message numbers that + + OpenSSH promises not to use (comment change only) + + OpenBSD-Commit-ID: e61795b453d4892d2c99ce1039112c4a00250e03 + +commit 90b0d73d63a706e85f6431f05a62d2ce1b476472 +Author: djm@openbsd.org +Date: Fri Oct 6 03:32:15 2023 +0000 + + upstream: typo in error message + + OpenBSD-Regress-ID: 6a8edf0dc39941298e3780b147b10c0a600b4fee + +commit e84517f51532ec913d8fb01a8aab7307134774bb +Author: djm@openbsd.org +Date: Fri Oct 6 03:25:14 2023 +0000 + + upstream: Perform the softhsm2 setup as discrete steps rather than + + as a long shell pipeline. Makes it easier to figure out what has happened + when it breaks. + + OpenBSD-Regress-ID: b3f1292115fed65765d0a95414df16e27772d81c + +commit cb54becff4d776238e0e9072943ba0872260535d +Author: claudio@openbsd.org +Date: Sun Sep 24 08:14:13 2023 +0000 + + upstream: REGRESS_FAIL_EARLY defaults to yes now. So no need to + + overload the value here anymore. OK tb@ bluhm@ + + OpenBSD-Regress-ID: f063330f1bebbcd373100afccebc91a965b14496 + +commit f01f5137ceba65baf34ceac5a298c12ac01b1fef +Author: jmc@openbsd.org +Date: Wed Oct 4 05:42:10 2023 +0000 + + upstream: spelling fix; + + OpenBSD-Commit-ID: 493f95121567e5ab0d9dd1150f873b5535ca0195 + +commit 80a2f64b8c1d27383cc83d182b73920d1e6a91f1 +Author: Damien Miller +Date: Wed Oct 4 15:34:10 2023 +1100 + + crank version numbers + +commit f65f187b105d9b5c12fd750a211397d08c17c6d4 +Author: djm@openbsd.org +Date: Wed Oct 4 04:04:09 2023 +0000 + + upstream: openssh-9.5 + + OpenBSD-Commit-ID: 5e0af680480bd3b6f5560cf840ad032d48fd6b16 + +commit ffe27e54a4bb18d5d3bbd3f4cc93a41b8d94dfd2 +Author: djm@openbsd.org +Date: Wed Oct 4 04:03:50 2023 +0000 + + upstream: add some cautionary text about % token expansion and + + shell metacharacters; based on report from vinci AT protonmail.ch + + OpenBSD-Commit-ID: aa1450a54fcee2f153ef70368d90edb1e7019113 + +commit 60ec3d54fd1ebfe2dda75893fa1e870b8dffbb0d +Author: djm@openbsd.org +Date: Tue Oct 3 23:56:10 2023 +0000 + + upstream: fix link to agent draft; spotted by Jann Horn + + OpenBSD-Commit-ID: ff5bda21a83ec013db683e282256a85201d2dc4b + +commit 12e2d4b13f6f63ce2de13cbfcc9e4d0d4b4ab231 +Author: Damien Miller +Date: Wed Oct 4 10:54:04 2023 +1100 + + use portable provider allowlist path in manpage + + spotted by Jann Horn + +commit 6c2c6ffde75df95fd838039850d3dd3d84956d87 +Author: deraadt@openbsd.org +Date: Tue Sep 19 20:37:07 2023 +0000 + + upstream: typo; from Jim Spath + + OpenBSD-Commit-ID: 2f5fba917b5d4fcf93d9e0b0756c7f63189e228e + +commit b6b49130a0089b297245ee39e769231d7c763014 +Author: djm@openbsd.org +Date: Sun Sep 10 23:12:32 2023 +0000 + + upstream: rename remote_glob() -> sftp_glob() to match other API + + OpenBSD-Commit-ID: d9dfb3708d824ec02970a84d96cf5937e0887229 + +commit 21b79af6c8d2357c822c84cef3fbdb8001ed263b +Author: djm@openbsd.org +Date: Sun Sep 10 03:51:55 2023 +0000 + + upstream: typo in comment + + OpenBSD-Commit-ID: 69285e0ce962a7c6b0ab5f17a293c60a0a360a18 + +commit 41232d25532b4d2ef6c5db62efc0cf50a79d26ca +Author: Darren Tucker +Date: Sun Sep 10 15:45:38 2023 +1000 + + Use zero-call-used-regs=used with Apple compilers. + + Apple's versions of clang have version numbers that do not match the + corresponding upstream clang versions. Unfortunately, they do still + have the clang-15 zero-call-used-regs=all bug, so for now use the value + that doesn't result in segfaults. We could allowlist future versions + that are known to work. bz#3584 (and probably also our github CI + failures). + +commit 90ccc5918ea505bf156c31148b6b59a1bf5d6dc6 +Author: djm@openbsd.org +Date: Sun Sep 10 03:25:53 2023 +0000 + + upstream: randomise keystroke obfuscation intervals and average + + interval rate. ok dtucker@ + + OpenBSD-Commit-ID: 05f61d051ab418fcfc4857ff306e420037502382 + +commit bd1b9e52f5fa94d87223c90905c5fdc1a7c32aa6 +Author: djm@openbsd.org +Date: Fri Sep 8 06:34:24 2023 +0000 + + upstream: fix sizeof(*ptr) instead sizeof(ptr) in realloc (pointer here + + is char**, so harmless); spotted in CID 416964 + + OpenBSD-Commit-ID: c61caa4a5a667ee20bb1042098861e6c72c69002 + +commit c4f966482983e18601eec70a1563115de836616f +Author: djm@openbsd.org +Date: Fri Sep 8 06:10:57 2023 +0000 + + upstream: regress test recursive remote-remote directories copies where + + the directory contains a symlink to another directory. + + also remove errant `set -x` that snuck in at some point + + OpenBSD-Regress-ID: 1c94a48bdbd633ef2285954ee257725cd7bc456f + +commit 5e1dfe5014ebc194641678303e22ab3bba15f4e5 +Author: djm@openbsd.org +Date: Fri Sep 8 06:10:02 2023 +0000 + + upstream: fix recursive remote-remote copies of directories that + + contain symlinks to other directories (similar to bz3611) + + OpenBSD-Commit-ID: 7e19d2ae09b4f941bf8eecc3955c9120171da37f + +commit 7c0ce2bf98b303b6ad91493ee3247d96c18ba1f6 +Author: djm@openbsd.org +Date: Fri Sep 8 05:50:57 2023 +0000 + + upstream: regress test for recursive copies of directories containing + + symlinks to other directories. bz3611, ok dtucker@ + + OpenBSD-Regress-ID: eaa4c29cc5cddff4e72a16bcce14aeb1ecfc94b9 + +commit 2de990142a83bf60ef694378b8598706bc654b08 +Author: djm@openbsd.org +Date: Fri Sep 8 05:56:13 2023 +0000 + + upstream: the sftp code was one of my first contributions to + + OpenSSH and it shows - the function names are terrible. + + Rename do_blah() to sftp_blah() to make them less so. + + Completely mechanical except for sftp_stat() and sftp_lstat() which + change from returning a pointer to a static variable (error-prone) to + taking a pointer to a caller-provided receiver. + + OpenBSD-Commit-ID: eb54d6a72d0bbba4d623e2175cf5cc4c75dc2ba4 + +commit 249d8bd0472b53e3a2a0e138b4c030a31e83346a +Author: djm@openbsd.org +Date: Fri Sep 8 05:50:12 2023 +0000 + + upstream: fix scp in SFTP mode recursive upload and download of + + directories that contain symlinks to other directories. In scp mode, the + links would be followed, but in SFTP mode they were not. bz3611, ok dtucker@ + + OpenBSD-Commit-ID: 9760fda668eaa94a992250d7670dfbc62a45197c + +commit 0e1f4401c466fa4fdaea81b6dadc8dd1fc4cf0af +Author: djm@openbsd.org +Date: Wed Sep 6 23:36:09 2023 +0000 + + upstream: regression test for override of subsystem in match blocks + + OpenBSD-Regress-ID: 5f8135da3bfda71067084c048d717b0e8793e87c + +commit 8a1450c62035e834d8a79a5d0d1c904236f9dcfe +Author: djm@openbsd.org +Date: Wed Sep 6 23:35:35 2023 +0000 + + upstream: allow override of Sybsystem directives in sshd Match + + blocks + + OpenBSD-Commit-ID: 3911d18a826a2d2fe7e4519075cf3e57af439722 + +commit 6e52826e2a74d077147a82ead8d4fbd5b54f4e3b +Author: djm@openbsd.org +Date: Wed Sep 6 23:26:37 2023 +0000 + + upstream: allocate the subsystems array as necessary and remove the + + fixed limit of subsystems. Saves a few kb of memory in the server and makes + it more like the other options. + + OpenBSD-Commit-ID: e683dfca6bdcbc3cc339bb6c6517c0c4736a547f + +commit e19069c9fac4c111d6496b19c7f7db43b4f07b4f +Author: djm@openbsd.org +Date: Wed Sep 6 23:23:53 2023 +0000 + + upstream: preserve quoting of Subsystem commands and arguments. + + This may change behaviour of exotic configurations, but the most common + subsystem configuration (sftp-server) is unlikely to be affected. + + OpenBSD-Commit-ID: 8ffa296aeca981de5b0945242ce75aa6dee479bf + +commit 52dfe3c72d98503d8b7c6f64fc7e19d685636c0b +Author: djm@openbsd.org +Date: Wed Sep 6 23:21:36 2023 +0000 + + upstream: downgrade duplicate Subsystem directives from being a + + fatal error to being a debug message to match behaviour with just about all + other directives. + + OpenBSD-Commit-ID: fc90ed2cc0c18d4eb8e33d2c5e98d25f282588ce + +commit 1ee0a16e07b6f0847ff463d7b5221c4bf1876e25 +Author: djm@openbsd.org +Date: Wed Sep 6 23:18:15 2023 +0000 + + upstream: handle cr+lf (instead of just cr) in sshsig signature + + files + + OpenBSD-Commit-ID: 647460a212b916540016d066568816507375fd7f + +commit e1c284d60a928bcdd60bc575c6f9604663502770 +Author: job@openbsd.org +Date: Mon Sep 4 10:29:58 2023 +0000 + + upstream: Generate Ed25519 keys when invoked without arguments + + Ed25519 public keys are very convenient due to their small size. + OpenSSH has supported Ed25519 since version 6.5 (January 2014). + + OK djm@ markus@ sthen@ deraadt@ + + OpenBSD-Commit-ID: f498beaad19c8cdcc357381a60df4a9c69858b3f + +commit 694150ad92765574ff82a18f4e86322bd3231e68 +Author: djm@openbsd.org +Date: Mon Sep 4 00:08:14 2023 +0000 + + upstream: trigger keystroke timing obfucation only if the channels + + layer enqueud some data in the last poll() cycle; this avoids triggering the + obfuscatior for non-channels data like ClientAlive probes and also fixes a + related problem were the obfucations would be triggered on fully quiescent + connections. + + Based on / tested by naddy@ + + OpenBSD-Commit-ID: d98f32dc62d7663ff4660e4556e184032a0db123 + +commit b5fd97896b59a3a46245cf438cc8b16c795d9f74 +Author: djm@openbsd.org +Date: Mon Sep 4 00:04:02 2023 +0000 + + upstream: avoid bogus "obfuscate_keystroke_timing: stopping ..." + + debug messages when keystroke timing obfuscation was never started; spotted + by naddy@ + + OpenBSD-Commit-ID: 5c270d35f7d2974db5c1646e9c64188f9393be31 + +commit ccf7d913db34e49b7a6db1b8331bd402004c840d +Author: djm@openbsd.org +Date: Mon Sep 4 00:01:46 2023 +0000 + + upstream: make channel_output_poll() return a flag indicating + + whether channel data was enqueued. Will be used to improve keystroke timing + obfuscation. Problem spotted by / tested by naddy@ + + OpenBSD-Commit-ID: f9776c7b0065ba7c3bbe50431fd3b629f44314d0 + +commit 43254b326ac6e2131dbd750f9464dc62c14bd5a7 +Author: djm@openbsd.org +Date: Sun Sep 3 23:59:32 2023 +0000 + + upstream: set interactive mode for ControlPersist sessions if they + + originally requested a tty; enables keystroke timing obfuscation for most + ControlPersist sessions. Spotted by naddy@ + + OpenBSD-Commit-ID: 72783a26254202e2f3f41a2818a19956fe49a772 + +commit ff3eda68ceb2e2bb8f48e3faceb96076c3e85c20 +Author: Darren Tucker +Date: Thu Aug 31 23:02:35 2023 +1000 + + Set LLONG_MAX for C89 test. + + If we don't have LLONG_MAX, configure will figure out that it can get it + by setting -std=gnu99, at which point we won't be testing C89 any more. + To avoid this, feed it in via CFLAGS. + +commit f98031773db361424d59e3301aa92aacf423d920 +Author: djm@openbsd.org +Date: Tue Aug 29 02:50:10 2023 +0000 + + upstream: make PerSourceMaxStartups first-match-wins; ok dtucker@ + + OpenBSD-Commit-ID: dac0c24cb709e3c595b8b4f422a0355dc5a3b4e7 + +commit cfa66857db90cd908de131e0041a50ffc17c7df8 +Author: djm@openbsd.org +Date: Mon Aug 28 09:52:09 2023 +0000 + + upstream: descriptive text shouldn't be under .Cm + + OpenBSD-Commit-ID: b1afaeb456a52bc8a58f4f9f8b2f9fa8f6bf651b + +commit 01dbf3d46651b7d6ddf5e45d233839bbfffaeaec +Author: djm@openbsd.org +Date: Mon Aug 28 09:48:11 2023 +0000 + + upstream: limit artificial login delay to a reasonable maximum (5s) + + and don't delay at all for the "none" authentication mechanism. Patch by + Dmitry Belyavskiy in bz3602 with polish/ok dtucker@ + + OpenBSD-Commit-ID: 85b364676dd84cf1de0e98fc2fbdcb1a844ce515 + +commit 528da5b9d7c5da01ed7a73ff21c722e1b5326006 +Author: jmc@openbsd.org +Date: Mon Aug 28 05:32:28 2023 +0000 + + upstream: add spacing for punctuation when macro args; + + OpenBSD-Commit-ID: e80343c16ce0420b2aec98701527cf90371bd0db + +commit 3867361ca691d0956ef7d5fb8181cf554a91d84a +Author: djm@openbsd.org +Date: Mon Aug 28 04:06:52 2023 +0000 + + upstream: explicit long long type in timing calculations (doesn't + + matter, since the range is pre-clamped) + + OpenBSD-Commit-ID: f786ed902d04a5b8ecc581d068fea1a79aa772de + +commit 7603ba71264e7fa938325c37eca993e2fa61272f +Author: djm@openbsd.org +Date: Mon Aug 28 03:31:16 2023 +0000 + + upstream: Add keystroke timing obfuscation to the client. + + This attempts to hide inter-keystroke timings by sending interactive + traffic at fixed intervals (default: every 20ms) when there is only a + small amount of data being sent. It also sends fake "chaff" keystrokes + for a random interval after the last real keystroke. These are + controlled by a new ssh_config ObscureKeystrokeTiming keyword/ + + feedback/ok markus@ + + OpenBSD-Commit-ID: 02231ddd4f442212820976068c34a36e3c1b15be + +commit dce6d80d2ed3cad2c516082682d5f6ca877ef714 +Author: djm@openbsd.org +Date: Mon Aug 28 03:28:43 2023 +0000 + + upstream: Introduce a transport-level ping facility + + This adds a pair of SSH transport protocol messages SSH2_MSG_PING/PONG + to implement a ping capability. These messages use numbers in the "local + extensions" number space and are advertised using a "ping@openssh.com" + ext-info message with a string version number of "0". + + ok markus@ + + OpenBSD-Commit-ID: b6b3c4cb2084c62f85a8dc67cf74954015eb547f + +commit d2d247938b38b928f8a6e1a47a330c5584d3a358 +Author: tobhe@openbsd.org +Date: Mon Aug 21 21:16:18 2023 +0000 + + upstream: Log errors in kex_exchange_identification() with level + + verbose instead of error to reduce preauth log spam. All of those get logged + with a more generic error message by sshpkt_fatal(). + + feedback from sthen@ + ok djm@ + + OpenBSD-Commit-ID: bd47dab4695b134a44c379f0e9a39eed33047809 + +commit 9d7193a8359639801193ad661a59d1ae4dc3d302 +Author: djm@openbsd.org +Date: Mon Aug 21 04:59:54 2023 +0000 + + upstream: correct math for ClientAliveInterval that caused the + + probes to be sent less frequently than configured; from Dawid Majchrzak + + OpenBSD-Commit-ID: 641153e7c05117436ddfc58267aa267ca8b80038 + +commit 3c6ab63b383b0b7630da175941e01de9db32a256 +Author: Darren Tucker +Date: Fri Aug 25 14:48:02 2023 +1000 + + Include Portable version in sshd version string. + + bz#3608, ok djm@ + +commit 17fa6cd10a26e193bb6f65d21264d2fe553bcd87 +Author: Darren Tucker +Date: Mon Aug 21 19:47:58 2023 +1000 + + obsd-arm64 host is real hardware... + + so put in the correct config location. + +commit 598ca75c85acaaacee5ef954251e489cc20d7be9 +Author: Darren Tucker +Date: Mon Aug 21 18:38:36 2023 +1000 + + Add OpenBSD ARM64 test host. + +commit 1acac79bfbe207e8db639e8043524962037c8feb +Author: Darren Tucker +Date: Mon Aug 21 18:05:26 2023 +1000 + + Add test for zlib development branch. + +commit 84efebf352fc700e9040c8065707c63caedd36a3 +Author: djm@openbsd.org +Date: Mon Aug 21 04:36:46 2023 +0000 + + upstream: want stdlib.h for free(3) + + OpenBSD-Commit-ID: 743af3c6e3ce5e6cecd051668f0327a01f44af29 + +commit cb4ed12ffc332d1f72d054ed92655b5f1c38f621 +Author: Darren Tucker +Date: Sat Aug 19 07:39:08 2023 +1000 + + Fix zlib version check for 1.3 and future version. + + bz#3604. + +commit 25b75e21f16bccdaa472ea1889b293c9bd51a87b +Author: Darren Tucker +Date: Mon Aug 14 11:10:08 2023 +1000 + + Add 9.4 branch to CI status page. + +commit 803e22eabd3ba75485eedd8b7b44d6ace79f2052 +Author: djm@openbsd.org +Date: Fri Aug 18 01:37:41 2023 +0000 + + upstream: fix regression in OpenSSH 9.4 (mux.c r1.99) that caused + + multiplexed sessions to ignore SIGINT under some circumstances. Reported by / + feedback naddy@, ok dtucker@ + + OpenBSD-Commit-ID: 4d5c6c894664f50149153fd4764f21f43e7d7e5a + +commit e706bca324a70f68dadfd0ec69edfdd486eed23a +Author: djm@openbsd.org +Date: Wed Aug 16 16:14:11 2023 +0000 + + upstream: defence-in-depth MaxAuthTries check in monitor; ok markus + + OpenBSD-Commit-ID: 65a4225dc708e2dae71315adf93677edace46c21 + +commit d1ab7eb90474df656d5e9935bae6df0bd000d343 +Author: djm@openbsd.org +Date: Mon Aug 14 03:37:00 2023 +0000 + + upstream: add message number of SSH2_MSG_NEWCOMPRESS defined in RFC8308 + + OpenBSD-Commit-ID: 6c984171c96ed67effd7b5092f3d3975d55d6028 + +commit fa8da52934cb7dff6f660a143276bdb28bb9bbe1 +Author: Darren Tucker +Date: Sun Aug 13 15:01:27 2023 +1000 + + Add obsd72 and obsd73 test targets. + +commit f9f18006678d2eac8b0c5a5dddf17ab7c50d1e9f +Author: djm@openbsd.org +Date: Thu Aug 10 23:05:48 2023 +0000 + + upstream: better debug logging of sessions' exit status + + OpenBSD-Commit-ID: 82237567fcd4098797cbdd17efa6ade08e1a36b0 + +commit a8c57bcb077f0cfdffcf9f23866bf73bb93e185c +Author: naddy@openbsd.org +Date: Thu Aug 10 14:37:32 2023 +0000 + + upstream: drop a wayward comma, ok jmc@ + + OpenBSD-Commit-ID: 5c11fbb9592a29b37bbf36f66df50db9d38182c6 + +commit e962f9b318a238db1becc53c2bf79dd3a49095b4 +Author: Damien Miller +Date: Thu Aug 10 11:10:22 2023 +1000 + + depend + +commit 0fcb60bf83130dfa428bc4422b3a3ac20fb528af +Author: Damien Miller +Date: Thu Aug 10 11:05:42 2023 +1000 + + update versions in RPM specs + +commit d0cee4298491314f09afa1c4383a66d913150b26 +Author: Damien Miller +Date: Thu Aug 10 11:05:14 2023 +1000 + + update version in README + +commit 78b4dc6684f4d35943b46b24ee645edfdb9974f5 +Author: djm@openbsd.org +Date: Thu Aug 10 01:01:07 2023 +0000 + + upstream: openssh-9.4 + + OpenBSD-Commit-ID: 71fc1e01a4c4ea061b252bd399cda7be757e6e35 + +commit 58ca4f0aa8c4306ac0a629c9a85fb1efaf4ff092 +Author: Darren Tucker +Date: Thu Aug 10 11:30:24 2023 +1000 + + Only include unistd.h once. + +commit 3961ed02dc578517a9d2535128cff5c3a5460d28 +Author: Damien Miller +Date: Thu Aug 10 09:08:49 2023 +1000 + + wrap poll.h include in HAVE_POLL_H + +commit e535fbe2af893046c28adfcd787c1fdbae36a24a +Author: dtucker@openbsd.org +Date: Fri Aug 4 06:32:40 2023 +0000 + + upstream: Apply ConnectTimeout to multiplexing local socket + + connections. If the multiplex socket exists but the connection times out, + ssh will fall back to a direct connection the same way it would if the socket + did not exist at all. ok djm@ + + OpenBSD-Commit-ID: 2fbe1a36d4a24b98531b2d298a6557c8285dc1b4 + +commit 9d92e7b24848fcc605945f7c2e3460c7c31832ce +Author: Darren Tucker +Date: Thu Aug 3 19:35:33 2023 +1000 + + Fix RNG seeding for OpenSSL w/out self seeding. + + When sshd is built with an OpenSSL that does not self-seed, it would + fail in the preauth privsep process while handling a new connection. + Sanity checked by djm@ + +commit f70010d9b0b3e7e95de8aa0b961e1d74362cfb5d +Author: djm@openbsd.org +Date: Wed Aug 2 23:04:38 2023 +0000 + + upstream: CheckHostIP has defaulted to 'no' for a while; make the + + commented- out config option match. From Ed Maste + + OpenBSD-Commit-ID: e66e934c45a9077cb1d51fc4f8d3df4505db58d9 + +commit c88a8788f9865d02b986d00405b9f0be65ad0b5a +Author: dtucker@openbsd.org +Date: Tue Aug 1 08:15:04 2023 +0000 + + upstream: remove unnecessary if statement. + + github PR#422 from eyalasulin999, ok djm@ + + OpenBSD-Commit-ID: 2b6b0dde4407e039f58f86c8d2ff584a8205ea55 + +commit 77b8b865cd5a8c79a47605c0c5b2bacf4692c4d5 +Author: jmc@openbsd.org +Date: Fri Jul 28 05:42:36 2023 +0000 + + upstream: %C is a callable macro in mdoc(7) + + so, as we do for %D, escape it; + + OpenBSD-Commit-ID: 538cfcddbbb59dc3a8739604319491dcb8e0c0c9 + +commit e0f91aa9c2fbfc951e9ced7e1305455fc614d3f2 +Author: djm@openbsd.org +Date: Fri Jul 28 05:33:15 2023 +0000 + + upstream: don't need to start a command here; use ssh -N instead. + + Fixes failure on cygwin spotted by Darren + + OpenBSD-Regress-ID: ff678a8cc69160a3b862733d935ec4a383f93cfb + +commit f446a44f30bc680e0d026a4204844b02646c1c2d +Author: djm@openbsd.org +Date: Wed May 17 05:52:01 2023 +0000 + + upstream: add LTESTS_FROM variable to allow skipping of tests up to + + a specific point. e.g. "make LTESTS_FROM=t-sftp" will only run the sftp.sh + test and subsequent ones. ok dtucker@ + + OpenBSD-Regress-ID: 07f653de731def074b29293db946042706fcead3 + +commit 8eb8899d612440a9b608bee7f916081d3d0b7812 +Author: djm@openbsd.org +Date: Fri May 12 06:37:42 2023 +0000 + + upstream: test ChrootDirectory in Match block + + OpenBSD-Regress-ID: a6150262f39065939f025e546af2a346ffe674c1 + +commit e43f43d3f19516222e9a143468ea0dc1b3ab67b6 +Author: djm@openbsd.org +Date: Fri May 12 06:36:27 2023 +0000 + + upstream: better error messages + + OpenBSD-Regress-ID: 55e4186604e80259496d841e690ea2090981bc7a + +commit 6958f00acf3b9e0b3730f7287e69996bcf3ceda4 +Author: djm@openbsd.org +Date: Thu Jul 27 22:26:49 2023 +0000 + + upstream: don't incorrectly truncate logged strings retrieved from + + PKCS#11 modules; based on GHPR406 by Jakub Jelen; ok markus + + OpenBSD-Commit-ID: 7ed1082f23a13b38c373008f856fd301d50012f9 + +commit d1ffde6b55170cd4b9a72bfd9a3f17508e6cf714 +Author: djm@openbsd.org +Date: Thu Jul 27 22:25:17 2023 +0000 + + upstream: make sshd_config AuthorizedPrincipalsCommand and + + AuthorizedKeysCommand accept the %D (routing domain) and a new %C (connection + address/port 4-tuple) as expansion sequences; ok markus + + OpenBSD-Commit-ID: ee9a48bf1a74c4ace71b69de69cfdaa2a7388565 + +commit 999a2886ca1844a7a74b905e5f2c8c701f9838cd +Author: djm@openbsd.org +Date: Thu Jul 27 22:23:05 2023 +0000 + + upstream: increase default KDF work-factor for OpenSSH format + + private keys from 16 to 24; { feedback ok } x { deraadt markus } + + OpenBSD-Commit-ID: a3afb1383f8ff0a49613d449f02395d9e8d4a9ec + +commit 0fa803a1dd1c7b546c166000e23a869cf6c4ec10 +Author: Darren Tucker +Date: Thu Jul 27 02:25:09 2023 +1000 + + Prefer OpenSSL's SHA256 in sk-dummy.so + + Previously sk-dummy.so used libc's (or compat's) SHA256 since it may be + built without OpenSSL. In many cases, however, including both libc's + and OpenSSL's headers together caused conflicting definitions. + + We tried working around this (on OpenSSL <1.1 you could define + OPENSSL_NO_SHA, NetBSD had USE_LIBC_SHA2, various #define hacks) with + varying levels of success. Since OpenSSL >=1.1 removed OPENSSL_NO_SHA + and including most OpenSSL headers would bring sha.h in, even if it + wasn't used directly this was a constant hassle. + + Admit defeat and use OpenSSL's SHA256 unless we aren't using OpenSSL at + all. ok djm@ + +commit 36cdb5dbf55c99c0faad06066f56a7c341258c1f +Author: Darren Tucker +Date: Thu Jul 27 10:29:44 2023 +1000 + + Retire dfly58 test VM. Add dfly64. + +commit 2d34205dab08ede9b0676efa57647fc49e6decbe +Author: djm@openbsd.org +Date: Wed Jul 26 23:06:00 2023 +0000 + + upstream: make ssh -f (fork after authentication) work properly in + + multiplexed cases (inc. ControlPersist). bz3589 bz3589 Based on patches by + Peter Chubb; ok dtucker@ + + OpenBSD-Commit-ID: a7a2976a54b93e6767dc846b85647e6ec26969ac + +commit 076aeda86a7ee9be8fd2f0181ec7b9729a6ceb37 +Author: naddy@openbsd.org +Date: Sun Jul 23 20:04:45 2023 +0000 + + upstream: man page typos; ok jmc@ + + OpenBSD-Commit-ID: e6ddfef94b0eb867ad88abe07cedc8ed581c07f0 + +commit 135e7d5fe31f700e6dfc61ce914970c5ee7175ba +Author: jmc@openbsd.org +Date: Thu Jul 20 05:43:39 2023 +0000 + + upstream: tweak the allow-remote-pkcs11 text; + + OpenBSD-Commit-ID: bc965460a89edf76865b7279b45cf9cbdebd558a + +commit 5f83342b61d1f76c141de608ed2bd293990416bd +Author: Darren Tucker +Date: Tue Jul 25 13:00:22 2023 +1000 + + Handle a couple more OpenSSL no-ecc cases. + + ok djm@ + +commit edc2ef4e418e514c99701451fae4428ec04ce538 +Author: Damien Miller +Date: Thu Jul 20 12:53:44 2023 +1000 + + depend + +commit 51fda734e0d3c2df256fc03e8b060c4305be6e59 +Author: Damien Miller +Date: Thu Jul 20 12:53:21 2023 +1000 + + Bring back OPENSSL_HAS_ECC to ssh-pkcs11-client + +commit 099cdf59ce1e72f55d421c8445bf6321b3004755 +Author: djm@openbsd.org +Date: Wed Jul 19 14:03:45 2023 +0000 + + upstream: Separate ssh-pkcs11-helpers for each p11 module + + Make ssh-pkcs11-client start an independent helper for each provider, + providing better isolation between modules and reliability if a single + module misbehaves. + + This also implements reference counting of PKCS#11-hosted keys, + allowing ssh-pkcs11-helper subprocesses to be automatically reaped + when no remaining keys reference them. This fixes some bugs we have + that make PKCS11 keys unusable after they have been deleted, e.g. + https://bugzilla.mindrot.org/show_bug.cgi?id=3125 + + ok markus@ + + OpenBSD-Commit-ID: 0ce188b14fe271ab0568f4500070d96c5657244e + +commit 29ef8a04866ca14688d5b7fed7b8b9deab851f77 +Author: djm@openbsd.org +Date: Wed Jul 19 14:02:27 2023 +0000 + + upstream: Ensure FIDO/PKCS11 libraries contain expected symbols + + This checks via nlist(3) that candidate provider libraries contain one + of the symbols that we will require prior to dlopen(), which can cause + a number of side effects, including execution of constructors. + + Feedback deraadt; ok markus + + OpenBSD-Commit-ID: 1508a5fbd74e329e69a55b56c453c292029aefbe + +commit 1f2731f5d7a8f8a8385c6031667ed29072c0d92a +Author: djm@openbsd.org +Date: Wed Jul 19 13:56:33 2023 +0000 + + upstream: Disallow remote addition of FIDO/PKCS11 provider + + libraries to ssh-agent by default. + + The old behaviour of allowing remote clients from loading providers + can be restored using `ssh-agent -O allow-remote-pkcs11`. + + Detection of local/remote clients requires a ssh(1) that supports + the `session-bind@openssh.com` extension. Forwarding access to a + ssh-agent socket using non-OpenSSH tools may circumvent this control. + + ok markus@ + + OpenBSD-Commit-ID: 4c2bdf79b214ae7e60cc8c39a45501344fa7bd7c + +commit 892506b13654301f69f9545f48213fc210e5c5cc +Author: djm@openbsd.org +Date: Wed Jul 19 13:55:53 2023 +0000 + + upstream: terminate process if requested to load a PKCS#11 provider + + that isn't a PKCS#11 provider; from / ok markus@ + + OpenBSD-Commit-ID: 39532cf18b115881bb4cfaee32084497aadfa05c + +commit f3f56df8ec476b2de6cbdbdfdb77a2a61087829d +Author: Damien Miller +Date: Wed Jul 19 12:07:18 2023 +1000 + + agent_fuzz doesn't want stdint.h conditionalised + +commit 750911fd31d307a767cc86e3bfa90bbbb77b1a25 +Author: Damien Miller +Date: Tue Jul 18 15:41:12 2023 +1000 + + conditionalise stdint.h inclusion on HAVE_STDINT_H + + fixes build on AIX5 at least + +commit ff047504fa6e008c4092f8929881816b8993bea0 +Author: Damien Miller +Date: Tue Jul 18 15:30:45 2023 +1000 + + conditionalise match localnetwork on ifaddrs.h + + Fixes build breakage on platforms that lack getifaddrs() + +commit b87b03282e466ca2927954ce93f5dbf0bfdc68f6 +Author: djm@openbsd.org +Date: Mon Jul 17 06:16:33 2023 +0000 + + upstream: missing match localnetwork negation check + + OpenBSD-Commit-ID: 9a08ed8dae27d3f38cf280f1b28d4e0ff41a737a + +commit 6d6e185ba29ef4274164b77eab4dc763907f8821 +Author: jmc@openbsd.org +Date: Mon Jul 17 05:41:53 2023 +0000 + + upstream: - add -P to usage() - sync the arg name to -J in usage() + + with that in ssh.1 - reformat usage() to match what "man ssh" does on 80width + + OpenBSD-Commit-ID: 5235dd7aa42e5bf90ae54579d519f92fc107036e + +commit f1a9898283a0638667b587ee4a950afd61ab51b0 +Author: jmc@openbsd.org +Date: Mon Jul 17 05:38:10 2023 +0000 + + upstream: -P before -p in SYNOPSIS; + + OpenBSD-Commit-ID: 535f5257c779e26c6a662a038d241b017f8cab7c + +commit eef4d7e873568e1c84c36bb4034e2c3378250a61 +Author: jsg@openbsd.org +Date: Mon Jul 17 05:36:14 2023 +0000 + + upstream: configuation -> configuration + + OpenBSD-Commit-ID: 4776ced33b780f1db0b2902faec99312f26a726b + +commit dc1dbe94cf6532bd546a3373ad436404f8850e5f +Author: djm@openbsd.org +Date: Mon Jul 17 05:26:38 2023 +0000 + + upstream: move other RCSIDs to before their respective license blocks + + too no code change + + OpenBSD-Commit-ID: ef5bf46b57726e4260a63b032b0b5ac3b4fe9cd4 + +commit ebe11044681caff78834ca6b78311ad19c1860b8 +Author: djm@openbsd.org +Date: Mon Jul 17 05:22:30 2023 +0000 + + upstream: Move RCSID to before license block and away from #includes, + + where it caused merge conflict in -portable for each commit :( + + OpenBSD-Commit-ID: 756ebac963df3245258b962e88150ebab9d5fc20 + +commit 05c08e5f628de3ecf6f7ea20947735bcfa3201e0 +Author: djm@openbsd.org +Date: Mon Jul 17 05:20:15 2023 +0000 + + upstream: return SSH_ERR_KRL_BAD_MAGIC when a KRL doesn't contain a + + valid magic number and not SSH_ERR_MESSAGE_INCOMPLETE; the former is needed + to fall back to text revocation lists in some cases; fixes t-cert-hostkey. + + OpenBSD-Commit-ID: 5c670a6c0f027e99b7774ef29f18ba088549c7e1 + +commit c6fad2c3d19b74f0bd0af1ef040fc74f3a1d9ebb +Author: Damien Miller +Date: Mon Jul 17 14:56:14 2023 +1000 + + avoid AF_LINK on platforms that don't define it + +commit 919bc3d3b712c920de1ae6be5ac6561c98886d7e +Author: djm@openbsd.org +Date: Mon Jul 17 04:08:31 2023 +0000 + + upstream: Add support for configuration tags to ssh(1). + + This adds a ssh_config(5) "Tag" directive and corresponding + "Match tag" predicate that may be used to select blocks of + configuration similar to the pf.conf(5) keywords of the same + name. + + ok markus + + OpenBSD-Commit-ID: dc08358e70e702b59ac3e591827e5a96141b06a3 + +commit 3071d85a47061c1bdaf11a0ac233b501ecba862c +Author: djm@openbsd.org +Date: Mon Jul 17 04:04:36 2023 +0000 + + upstream: add a "match localnetwork" predicate. + + This allows matching on the addresses of available network interfaces + and may be used to vary the effective client configuration based on + network location (e.g. to use a ProxyJump when not on a particular + network). + + ok markus@ + + OpenBSD-Commit-ID: cffb6ff9a3803abfc52b5cad0aa190c5e424c139 + +commit beec17bb311365b75a0a5941418d4b96df7d7888 +Author: djm@openbsd.org +Date: Mon Jul 17 04:01:10 2023 +0000 + + upstream: remove vestigal support for KRL signatures + + When the KRL format was originally defined, it included support for + signing of KRL objects. However, the code to sign KRLs and verify KRL + signatues was never completed in OpenSSH. + + Now, some years later, we have SSHSIG support in ssh-keygen that is + more general, well tested and actually works. So this removes the + semi-finished KRL signing/verification support from OpenSSH and + refactors the remaining code to realise the benefit - primarily, we + no longer need to perform multiple parsing passes over KRL objects. + + ok markus@ + + OpenBSD-Commit-ID: 517437bab3d8180f695c775410c052340e038804 + +commit 449566f64c21b4578d5c0c431badd0328adc53ed +Author: djm@openbsd.org +Date: Mon Jul 17 03:57:21 2023 +0000 + + upstream: Support for KRL extensions. + + This defines wire formats for optional KRL extensions and implements + parsing of the new submessages. No actual extensions are supported at + this point. + + ok markus + + OpenBSD-Commit-ID: ae2fcde9a22a9ba7f765bd4f36b3f5901d8c3fa7 + +commit 18ea857770e84825a3a6238bb37f54864487b59f +Author: dtucker@openbsd.org +Date: Fri Jul 14 07:44:21 2023 +0000 + + upstream: Include stdint.h for SIZE_MAX. Fixes OPENSSL=no build. + + OpenBSD-Commit-ID: e7c31034a5434f2ead3579b13a7892960651e6b0 + +commit 20b768fcd13effe0f2d3619661b6c8592c773553 +Author: Darren Tucker +Date: Fri Jul 14 17:07:32 2023 +1000 + + Fix typo in declaration of nmesg. + +commit 4b94d09542e36ebde2eb9ad89bc68431609932de +Author: Damien Miller +Date: Fri Jul 14 15:34:47 2023 +1000 + + portable-specific int overflow defence-in-depth + + These too are unreachable, but we want the code to be safe regardless of + context. Reported by Yair Mizrahi @ JFrog + +commit 2ee48adb9fc8692e8d6ac679dcc9f35e89ad68f0 +Author: djm@openbsd.org +Date: Fri Jul 14 05:31:44 2023 +0000 + + upstream: add defence-in-depth checks for some unreachable integer + + overflows reported by Yair Mizrahi @ JFrog; feedback/ok millert@ + + OpenBSD-Commit-ID: 52af085f4e7ef9f9d8423d8c1840a6a88bda90bd + +commit 4b43bc358ae6f6b19a973679246dc5172f6ac41b +Author: djm@openbsd.org +Date: Mon Jul 10 04:51:26 2023 +0000 + + upstream: misplaced debug message + + OpenBSD-Commit-ID: d0f12af0a5067a756aa707bc39a83fa6f58bf7e5 + +commit 8c7203bcee4c4f98a22487b4631fe068b992099b +Author: Damien Miller +Date: Wed Jul 12 11:41:19 2023 +1000 + + replace deprecate selinux matchpathcon function + + This function is apparently deprecated. Documentation on what is the + supposed replacement is is non-existent, so this follows the approach + glibc used https://sourceware.org/git/?p=glibc.git;a=patch;h=f278835f59 + + ok dtucker@ + +commit 7e8800f5d701efffa39ccb63ca1e095ea777c31a +Author: dtucker@openbsd.org +Date: Thu Jul 6 22:17:59 2023 +0000 + + upstream: minleft and maxsign are u_int so cast appropriately. Prompted + + by github PR#410, ok deraadt. + + OpenBSD-Commit-ID: 0514cd51db3ec60239966622a0d3495b15406ddd + +commit 94842bfe9b09fc93189c6ed0dc9bbebc1d44a426 +Author: dlg@openbsd.org +Date: Tue Jul 4 03:59:21 2023 +0000 + + upstream: add support for unix domain sockets to ssh -W + + ok djm@ dtucker@ + + OpenBSD-Commit-ID: 3e6d47567b895c7c28855c7bd614e106c987a6d8 + +commit a95fc5eed09a0238fb127b6c50e8498432b79dae +Author: David Seifert +Date: Fri May 12 14:06:01 2023 +0200 + + gss-serv.c: `MAXHOSTNAMELEN` -> `HOST_NAME_MAX` + + `MAXHOSTNAMELEN` is not defined in POSIX, which breaks on musl: + https://pubs.opengroup.org/onlinepubs/9699919799/functions/gethostname.html + + Bug: https://bugs.gentoo.org/834044 + +commit 8a6cd08850f576e7527c52a1b086cae82fab290e +Author: Darren Tucker +Date: Fri Jun 23 09:49:02 2023 +1000 + + Update runner OS version for hardenedmalloc test. + + Hardenedmalloc dropped support for "legacy glibc" versions in their + 64dad0a69 so use a newer Ubuntu version for the runner for that test. + +commit cfca6f17e64baed6822bb927ed9f372ce64d9c5b +Author: Damien Miller +Date: Thu Jun 22 15:04:03 2023 +1000 + + handle sysconf(SC_OPEN_MAX) returning > INT_MAX; + + bz3581; ok dtucker + +commit c1c2ca1365b3f7b626683690bd2c68265f6d8ffd +Author: djm@openbsd.org +Date: Wed Jun 21 05:10:26 2023 +0000 + + upstream: better validate CASignatureAlgorithms in ssh_config and + + sshd_config. + + Previously this directive would accept certificate algorithm names, but + these were unusable in practice as OpenSSH does not support CA chains. + + part of bz3577; ok dtucker@ + + OpenBSD-Commit-ID: a992d410c8a78ec982701bc3f91043dbdb359912 + +commit 4e73cd0f4ab3e5b576c56cac9732da62c8fc0565 +Author: djm@openbsd.org +Date: Wed Jun 21 05:08:32 2023 +0000 + + upstream: make `ssh -Q CASignatureAlgorithms` only list signature + + algorithms that are valid for CA signing. Previous behaviour was to list all + signing algorithms, including certificate algorithms (OpenSSH certificates do + not support CA chains). part of bz3577; ok dtucker@ + + OpenBSD-Commit-ID: 99c2b072dbac0f44fd1f2269e3ff6c1b5d7d3e59 + +commit a69062f1695ac9c3c3dea29d3044c72aaa6af0ea +Author: djm@openbsd.org +Date: Wed Jun 21 05:06:04 2023 +0000 + + upstream: handle rlimits > INT_MAX (rlim_t is u64); ok dtucker + + bz3581 + + OpenBSD-Commit-ID: 31cf59c041becc0e5ccb0a77106f812c4cd1cd74 + +commit 8d33f2aa6bb895a7f85a47189913639086347b75 +Author: djm@openbsd.org +Date: Tue Jun 20 23:59:33 2023 +0000 + + upstream: prepare for support for connecting to unix domain sockets + + using ssh -W by explicitly decoding PORT_STREAMLOCAL (a negative number) from + the u32 that's passed over the multiplexing socket; previously code would + just cast, which is UB. + + OpenBSD-Commit-ID: e5ac5f40d354096c51e8c118a5c1b2d2b7a31384 + +commit b4ac435b4e67f8eb5932d8f59eb5b3cf7dc38df0 +Author: djm@openbsd.org +Date: Tue Jun 20 00:05:09 2023 +0000 + + upstream: reset comment=NULL for each key in do_fingerprint(); + + fixes "no comment" not showing on when running `ssh-keygen -l` on multiple + keys where one has a comment and other following keys do not. Patch from + Markus Kuhn via GHPR407, bz3580 + + OpenBSD-Commit-ID: 3cce84456fdcd67dc6b84e369f92c6686d111d9b + +commit b53a809a549dcd4fbde554c6aa283e597b15ea33 +Author: millert@openbsd.org +Date: Mon Jun 5 13:24:36 2023 +0000 + + upstream: Store timeouts as int, not u_int as they are limited to + + INT_MAX. Fixes sign compare warnings systems with 32-bit time_t due to type + promotion. OK djm@ + + OpenBSD-Commit-ID: 48081e9ad35705c5f1705711704a4c2ff94e87b7 + +commit 2709809fd616a0991dc18e3a58dea10fb383c3f0 +Author: Philip Hands +Date: Wed May 24 19:41:14 2023 +0200 + + fixup! if -s & -p specified, mention 'sftp -P' on + + success + + SSH-Copy-ID-Upstream: 32686e7c65b4fa2846e474d3315102dfa0f043b0 + +commit 204e0bf05161b7641500d7ab266c21217412379f +Author: Darren Tucker +Date: Tue Aug 3 21:25:48 2021 +1000 + + Make ssh-copy-id(1) consistent with OpenSSH. + + This makes the ssh-copy-id man page more consistent with the rest of the + OpenSSH man pages: + - new sentence, new line + - no sentences >80 + - N.B. -> NB + - zap unused .Pp + - zap trailing whitespace + + Report from Debian via mindrot bz#3331, diff from jmc at openbsd.org. + + SSH-Copy-ID-Upstream: d8974cfb6242316460ed22a1ccc662800a50c5d3 + +commit 9de79df66d1430d290fab670bb4b18612875e518 +Author: Philip Hands +Date: Wed May 24 11:45:43 2023 +0200 + + if -s & -p specified, mention 'sftp -P' on success + + This was inspired by this: + https://github.com/openssh/openssh-portable/pull/321 + but I thought that it was better to not do the sed patching. + + BTW the reason one can get away with using $SSH_OPTS throughout, despite + the lowercase -p in there, even if sftp is in use, is that the sftp call + is using the already-established ssh master connection, so the port was + passed to the earlier ssh. + + SSH-Copy-ID-Upstream: 1c124d9bfafdbe28a00b683367ebf5750ce12eb2 + +commit 801cda54c00e0f4e7d89345a90874c8d05dc233a +Author: Philip Hands +Date: Tue May 23 23:07:11 2023 +0200 + + drop whitespace + + SSH-Copy-ID-Upstream: e604fae1cdee35c18055d35dcec530cf12ef00ad + +commit 288482f53613f3e74544eb92deeb24f7c7f1f371 +Author: Philip Hands +Date: Tue May 23 20:52:13 2023 +0200 + + make -x also apply to the target script + + SSH-Copy-ID-Upstream: 3c4214704f427bd0654adf9b0fc079253db21cf4 + +commit b79e7b88ed44f0e4339f0ff35c96c78a92175a8d +Author: Philip Hands +Date: Tue May 23 16:46:42 2023 +0200 + + add -t option to specify the target path + + Allow the default target path (.ssh/authorized_files) to be over-riden + + This was inspired by this MR from Panagiotis Cheilaris + + https://gitlab.com/phil_hands/ssh-copy-id/-/merge_requests/8 + + SSH-Copy-ID-Upstream: a942a0e076874adb6d8b2f0fb76d6c7918190fcd + +commit 914f4ad138714c471ba72fb6d5496b6235320edd +Author: Carlos Rodríguez Gili +Date: Tue Apr 20 19:23:57 2021 +0200 + + Fix test error for /bin/sh on Solaris 10 and older + + On Solaris 10 and older targets /bin/sh is not POSIX-compliant. + Test -z `...` fails with error 'sh: test: argument expected'. + Using quotes around backticks fixes this and doesn't break + POSIX compatibility. + + SSH-Copy-ID-Upstream: 98394072a3f985b2650c1e8eab2fef84e38cc065 + +commit bd382dca316c721aed1e45edcf4c4e0f6374afb0 +Author: Jakub Jelen +Date: Tue Mar 2 21:34:05 2021 +0000 + + Remove outdated comment + + The commit b068122 removed the code dropping the trailing colon, but the comment stayed leaving the code confusing for future readers + + SSH-Copy-ID-Upstream: 930d39f238117cd53810240ec989d0356aa1c1f6 + +commit bdcaf7939029433635d63aade8f9ac762aca2bbe +Author: Darren Tucker +Date: Wed May 10 18:50:46 2023 +1000 + + Special case OpenWrt instead of Dropbear. + + OpenWrt overrides the location of authorized_keys for root. Currently we + assume that all Dropbear installations behave this way, which is not the + case. Check for OpenWrt and root user before using that location instead + of assuming that for all Dropbear servers. Prompted by Github PR#250. + + SSH-Copy-ID-Upstream: 0e1f5d443a9967483c33945793107ae3f3e4af2d + +commit cf84498f67abe93f813a296167b406a0db7b288e +Author: Philip Hands +Date: Thu May 18 18:20:55 2023 +0200 + + ssh-copy-id: add -x option (for debugging) + + This option causes the ssh-copy-id to run with set -x + + SSH-Copy-ID-Upstream: a0ee367ea8c0a29c8b4515245e408d2d349e7844 + +commit b4a1efdcb88f03394c08e7f68ed4e11676830002 +Author: Philip Hands +Date: Thu May 18 17:14:41 2023 +0200 + + update copyright notices + + SSH-Copy-ID-Upstream: c284ed33b361814ea48ff68cbd01ca525b2bf117 + +commit fcd78e31cdd45a7e69ccfe6d8a3b1037dc1de290 +Author: djm@openbsd.org +Date: Wed May 24 23:01:06 2023 +0000 + + upstream: fix AuthorizedPrincipalsCommand when AuthorizedKeysCommand + + appears previously in configuration. Reported by John Meyers in bz3574 ok + dtucker@ + + OpenBSD-Commit-ID: 1c92e4517284386703936e1d3abaa36cfacf1951 + +commit 5ec5504f1d328d5bfa64280cd617c3efec4f78f3 +Author: dtucker@openbsd.org +Date: Wed May 10 10:04:20 2023 +0000 + + upstream: Remove unused prototypes for ssh1 RSA functions. + + From lengyijun via github PR#396. + + OpenBSD-Commit-ID: 379a5afa8b7a0f3cba0c8a9bcceb4e5e33a5c1ef + +commit fbf362b3891ae4b36052d1b39f37fc618b41c476 +Author: Darren Tucker +Date: Tue May 9 19:26:56 2023 +1000 + + main(void) to prevent unused variable warning. + +commit baf854c8bb0a6d0af5c696c801e631a48dabbaba +Author: Darren Tucker +Date: Tue May 9 19:25:45 2023 +1000 + + Remove warning pragma since clang doesn't like it. + +commit 5fbb7a1349fbbb48ccb1b8cafff2c1854370d87d +Author: Darren Tucker +Date: Tue May 9 17:13:33 2023 +1000 + + Suppress warning for snprintf truncation test. + +commit 47742c513e4e045ecc985c6483fc5c8b050acda2 +Author: Darren Tucker +Date: Tue May 9 17:12:50 2023 +1000 + + Update OpenSSL compat test for 3.x. + +commit 86ad25d455a2313126125540e61e0f9314283f88 +Author: Darren Tucker +Date: Mon May 8 20:23:08 2023 +1000 + + Add macos13 PAM test target. + +commit 77cca2c4b13bc6e5f389565583b6202b0d1bccc2 +Author: Darren Tucker +Date: Mon May 8 20:14:46 2023 +1000 + + Skip agent-peereid test on macos13. + + sudo -S nobody doesn't work on the github runners (probably a + permission issue) so skip that test. + +commit b356b8e91678ea295bcf44df5248c3fbf499fdcf +Author: Darren Tucker +Date: Mon May 8 20:14:28 2023 +1000 + + Include config.guess in debug output. + +commit b7afd8a4ecaca8afd3179b55e9db79c0ff210237 +Author: Darren Tucker +Date: Mon May 8 20:12:59 2023 +1000 + + Handle OpenSSL >=3 ABI compatibility. + + Beyond OpenSSL 3.0, the ABI compatibility guarantees are wider (only + major must match instead of major and minor in earlier versions). + bz#3548, ok djm@ + +commit 0e9e2663eb2c6e9c3e10d15d70418312ae67e542 +Author: dtucker@openbsd.org +Date: Mon May 1 08:57:29 2023 +0000 + + upstream: Import regenerated moduli. + + OpenBSD-Commit-ID: 3d5f811cfcaed8cc4a97e1db49ac61bdf118113c + +commit d9687f49682e1e93383fc15ab2018850b2ef38c3 +Author: Darren Tucker +Date: Mon May 1 11:45:14 2023 +1000 + + Add macos-13 test target. + + Also flatten OS list for clarity. + +commit aacfd6767497b8fa6d41ecdd3f8e265d1e9ef1f6 +Author: djm@openbsd.org +Date: Sun Apr 30 22:54:22 2023 +0000 + + upstream: adjust ftruncate() logic to handle servers that reorder + + requests. + + sftp/scp will ftruncate the destination file after a transfer completes, + to deal with the case where a longer destination file already existed. + We tracked the highest contiguous block transferred to deal with this + case, but our naive tracking doesn't deal with servers that reorder + requests - a misfeature strictly permitted by the protocol but seldom + implemented. + + Adjust the logic to ftruncate() at the highest absolute block received + when the transfer is successful. feedback deraadt@ ok markus@ + + prompted by https://github.com/openssh/openssh-portable/commit/9b733#commitcomment-110679778 + + OpenBSD-Commit-ID: 4af7fac75958ad8507b4fea58706f3ff0cfddb1b + +commit c8eb3941758615c8284a48fff47872db926da63c +Author: djm@openbsd.org +Date: Wed Apr 26 01:36:03 2023 +0000 + + upstream: Check for ProxyJump=none in CanonicalizeHostname logic. + + Previously ssh would incorrectly refuse to canonicalise the hostname + if ProxyJump was explicitly set to "none" when CanonicalizeHostname=yes + + bz3567; ok dtucker + + OpenBSD-Commit-ID: 80a58e43c3a32f97361282f756ec8d3f37989efd + +commit ac383f3a5c6f529a2e8a5bc44af79a08c7da294e +Author: jsg@openbsd.org +Date: Wed Apr 12 14:22:04 2023 +0000 + + upstream: remove duplicate signal.h include + + OpenBSD-Commit-ID: 30c0a34d74d91ddd0e6992525da70d3293392f70 + +commit 740dafa20f3f3d325f6f5d44e990b8c8a6d3d816 +Author: jsg@openbsd.org +Date: Wed Apr 12 08:53:54 2023 +0000 + + upstream: fix double words ok dtucker@ + + OpenBSD-Commit-ID: 44d3223902fbce5276422bdc8063ab72a4078489 + +commit 6452f89577ec4f22440c31b8e19b061d1a7c4b2a +Author: Darren Tucker +Date: Tue Apr 11 16:49:19 2023 +1000 + + Test against LibreSSL 3.7.2. diff --git a/authfile.c b/authfile.c index 5b8dccd149f2..6fc53fe495e3 100644 --- a/authfile.c +++ b/authfile.c @@ -333,6 +333,7 @@ sshkey_load_private_cert(int type, const char *filename, const char *passphrase, #endif /* WITH_OPENSSL */ case KEY_ED25519: case KEY_MLDSA44_ED25519: + CASE_KEY_OQS: case KEY_UNSPEC: break; default: diff --git a/config.h.in b/config.h.in index 009b53c649cf..8b49956337bf 100644 --- a/config.h.in +++ b/config.h.in @@ -2056,6 +2056,9 @@ /* use libcrypto for cryptography */ #undef WITH_OPENSSL +/* use LibOQS for post-quantum and hybrid key exchange and authentication */ +#undef WITH_OQS + /* Define if you want SELinux support. */ #undef WITH_SELINUX diff --git a/configure b/configure index 9d19f474c9f0..86bceeda1f9d 100755 --- a/configure +++ b/configure @@ -814,6 +814,7 @@ with_pam with_pam_service with_privsep_user with_sandbox +with_liboqs_dir with_selinux with_kerberos5 with_privsep_path @@ -1524,6 +1525,7 @@ Optional Packages: --with-pam-service=name Specify PAM service name --with-privsep-user=user Specify non-privileged user for privilege separation --with-sandbox=style Specify privilege separation sandbox (no, capsicum, darwin, rlimit, seccomp_filter) + --with-liboqs-dir=PATH Specify path to LibOQS installation --with-selinux Enable SELinux support --with-kerberos5=PATH Enable Kerberos 5 support --with-privsep-path=xxx Path for privilege separation chroot (default=/var/empty) @@ -21308,6 +21310,126 @@ else as_fn_error $? "unsupported --with-sandbox" "$LINENO" 5 fi +# Check for LibOQS +with_liboqs=no + +# Check whether --with-liboqs-dir was given. +if test ${with_liboqs_dir+y} +then : + withval=$with_liboqs_dir; + if test "x$withval" != "xno" ; then + with_liboqs=yes + case "$withval" in + # Relative paths + ./*|../*) withval="`pwd`/$withval" + esac + if test -d "$withval/lib"; then + if test -n "${need_dash_r}"; then + LDFLAGS="-L${withval}/lib -R${withval}/lib ${LDFLAGS}" + else + LDFLAGS="-L${withval}/lib ${LDFLAGS}" + fi + elif test -d "$withval/lib64"; then + if test -n "${need_dash_r}"; then + LDFLAGS="-L${withval}/lib64 -R${withval}/lib64 ${LDFLAGS}" + else + LDFLAGS="-L${withval}/lib64 ${LDFLAGS}" + fi + else + if test -n "${need_dash_r}"; then + LDFLAGS="-L${withval} -R${withval} ${LDFLAGS}" + else + LDFLAGS="-L${withval} ${LDFLAGS}" + fi + fi + if test -d "$withval/include"; then + CPPFLAGS="-I${withval}/include ${CPPFLAGS}" + else + CPPFLAGS="-I${withval} ${CPPFLAGS}" + fi + fi + + +fi + + +if test "x$with_liboqs" = "xyes" ; then + +printf "%s\n" "#define WITH_OQS 1" >>confdefs.h + + LIBS="-loqs -lcrypto $LIBS" + ac_fn_c_check_header_compile "$LINENO" "oqs/kem.h" "ac_cv_header_oqs_kem_h" "$ac_includes_default" +if test "x$ac_cv_header_oqs_kem_h" = xyes +then : + +else $as_nop + as_fn_error $? "*** LibOQS headers missing - please install first or check config.log ***" "$LINENO" 5 +fi + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + + char *alg = OQS_KEM_alg_identifier(0); + if (alg == NULL) { + return 1; + } + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + +else $as_nop + + as_fn_error $? "*** Can't find LibOQS library (see config.log for details) ***" "$LINENO" 5 + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + ac_fn_c_check_header_compile "$LINENO" "oqs/sig.h" "ac_cv_header_oqs_sig_h" "$ac_includes_default" +if test "x$ac_cv_header_oqs_sig_h" = xyes +then : + +else $as_nop + as_fn_error $? "*** LibOQS headers missing - please install first or check config.log ***" "$LINENO" 5 +fi + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ + + char *alg = OQS_SIG_alg_identifier(0); + if (alg == NULL) { + return 1; + } + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + +else $as_nop + + as_fn_error $? "*** Can't find LibOQS library (see config.log for details) ***" "$LINENO" 5 + + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + fi + # Cheap hack to ensure NEWS-OS libraries are arranged right. if test ! -z "$SONY" ; then LIBS="$LIBS -liberty"; diff --git a/defines.h b/defines.h index 634db453e579..14fa0849ee0f 100644 --- a/defines.h +++ b/defines.h @@ -995,9 +995,11 @@ struct winsize { * so only enable if the compiler supports them. */ #if defined(VARIABLE_LENGTH_ARRAYS) && defined(VARIABLE_DECLARATION_AFTER_CODE) -# define USE_SNTRUP761X25519 1 -/* The ML-KEM768 and ML-DSA implementations also uses C89 features */ -# define USE_MLKEM768X25519 1 +// OQS Note: Disabled upstream SNTRUP761X25519 support. +# define USE_SNTRUP761X25519 0 +// OQS Note: Disabled upstream MLKEM768X25519 support. +# define USE_MLKEM768X25519 0 +// OQS Note: Enabled upstream MLDSA44x25519 support. # define USE_MLDSA 1 #endif diff --git a/pathnames.h b/pathnames.h index 2f0b9f4f66d2..7d17e6d6f788 100644 --- a/pathnames.h +++ b/pathnames.h @@ -40,6 +40,32 @@ #define _PATH_HOST_RSA_KEY_FILE SSHDIR "/ssh_host_rsa_key" #define _PATH_HOST_ED25519_KEY_FILE SSHDIR "/ssh_host_ed25519_key" #define _PATH_HOST_MLDSA44_ED25519_KEY_FILE SSHDIR "/ssh_host_mldsa44_ed25519_key" +///// OQS_TEMPLATE_FRAGMENT_ADD_KEY_FILE_PATHS_START +#define _PATH_HOST_FALCON_512_KEY_FILE SSHDIR "/ssh_host_falcon512_key" +#define _PATH_HOST_RSA3072_FALCON_512_KEY_FILE SSHDIR "/ssh_host_rsa3072_falcon512_key" +#define _PATH_HOST_ECDSA_NISTP256_FALCON_512_KEY_FILE SSHDIR "/ssh_host_ecdsa_nistp256_falcon512_key" +#define _PATH_HOST_FALCON_1024_KEY_FILE SSHDIR "/ssh_host_falcon1024_key" +#define _PATH_HOST_ECDSA_NISTP521_FALCON_1024_KEY_FILE SSHDIR "/ssh_host_ecdsa_nistp521_falcon1024_key" +#define _PATH_HOST_SLH_DSA_PURE_SHA2_128F_KEY_FILE SSHDIR "/ssh_host_slhdsapuresha2128f_key" +#define _PATH_HOST_RSA3072_SLH_DSA_PURE_SHA2_128F_KEY_FILE SSHDIR "/ssh_host_rsa3072_slhdsapuresha2128f_key" +#define _PATH_HOST_ECDSA_NISTP256_SLH_DSA_PURE_SHA2_128F_KEY_FILE SSHDIR "/ssh_host_ecdsa_nistp256_slhdsapuresha2128f_key" +#define _PATH_HOST_SLH_DSA_PURE_SHA2_256F_KEY_FILE SSHDIR "/ssh_host_slhdsapuresha2256f_key" +#define _PATH_HOST_ECDSA_NISTP521_SLH_DSA_PURE_SHA2_256F_KEY_FILE SSHDIR "/ssh_host_ecdsa_nistp521_slhdsapuresha2256f_key" +#define _PATH_HOST_ML_DSA_44_KEY_FILE SSHDIR "/ssh_host_mldsa44_key" +#define _PATH_HOST_RSA3072_ML_DSA_44_KEY_FILE SSHDIR "/ssh_host_rsa3072_mldsa44_key" +#define _PATH_HOST_ECDSA_NISTP256_ML_DSA_44_KEY_FILE SSHDIR "/ssh_host_ecdsa_nistp256_mldsa44_key" +#define _PATH_HOST_ML_DSA_65_KEY_FILE SSHDIR "/ssh_host_mldsa65_key" +#define _PATH_HOST_ECDSA_NISTP384_ML_DSA_65_KEY_FILE SSHDIR "/ssh_host_ecdsa_nistp384_mldsa65_key" +#define _PATH_HOST_ML_DSA_87_KEY_FILE SSHDIR "/ssh_host_mldsa87_key" +#define _PATH_HOST_ECDSA_NISTP521_ML_DSA_87_KEY_FILE SSHDIR "/ssh_host_ecdsa_nistp521_mldsa87_key" +#define _PATH_HOST_MAYO_2_KEY_FILE SSHDIR "/ssh_host_mayo2_key" +#define _PATH_HOST_RSA3072_MAYO_2_KEY_FILE SSHDIR "/ssh_host_rsa3072_mayo2_key" +#define _PATH_HOST_ECDSA_NISTP256_MAYO_2_KEY_FILE SSHDIR "/ssh_host_ecdsa_nistp256_mayo2_key" +#define _PATH_HOST_MAYO_3_KEY_FILE SSHDIR "/ssh_host_mayo3_key" +#define _PATH_HOST_ECDSA_NISTP384_MAYO_3_KEY_FILE SSHDIR "/ssh_host_ecdsa_nistp384_mayo3_key" +#define _PATH_HOST_MAYO_5_KEY_FILE SSHDIR "/ssh_host_mayo5_key" +#define _PATH_HOST_ECDSA_NISTP521_MAYO_5_KEY_FILE SSHDIR "/ssh_host_ecdsa_nistp521_mayo5_key" +///// OQS_TEMPLATE_FRAGMENT_ADD_KEY_FILE_PATHS_END #define _PATH_DH_MODULI SSHDIR "/moduli" #ifndef _PATH_SSH_PROGRAM @@ -92,6 +118,32 @@ #define _PATH_SSH_CLIENT_ID_ECDSA_SK _PATH_SSH_USER_DIR "/id_ecdsa_sk" #define _PATH_SSH_CLIENT_ID_ED25519_SK _PATH_SSH_USER_DIR "/id_ed25519_sk" #define _PATH_SSH_CLIENT_ID_MLDSA44_ED25519 _PATH_SSH_USER_DIR "/id_mldsa44_ed25519" +///// OQS_TEMPLATE_FRAGMENT_ADD_ID_FILE_PATHS_START +#define _PATH_SSH_CLIENT_ID_FALCON_512 _PATH_SSH_USER_DIR "/id_falcon512" +#define _PATH_SSH_CLIENT_ID_RSA3072_FALCON_512 _PATH_SSH_USER_DIR "/id_rsa3072_falcon512" +#define _PATH_SSH_CLIENT_ID_ECDSA_NISTP256_FALCON_512 _PATH_SSH_USER_DIR "/id_ecdsa_nistp256_falcon512" +#define _PATH_SSH_CLIENT_ID_FALCON_1024 _PATH_SSH_USER_DIR "/id_falcon1024" +#define _PATH_SSH_CLIENT_ID_ECDSA_NISTP521_FALCON_1024 _PATH_SSH_USER_DIR "/id_ecdsa_nistp521_falcon1024" +#define _PATH_SSH_CLIENT_ID_SLH_DSA_PURE_SHA2_128F _PATH_SSH_USER_DIR "/id_slhdsapuresha2128f" +#define _PATH_SSH_CLIENT_ID_RSA3072_SLH_DSA_PURE_SHA2_128F _PATH_SSH_USER_DIR "/id_rsa3072_slhdsapuresha2128f" +#define _PATH_SSH_CLIENT_ID_ECDSA_NISTP256_SLH_DSA_PURE_SHA2_128F _PATH_SSH_USER_DIR "/id_ecdsa_nistp256_slhdsapuresha2128f" +#define _PATH_SSH_CLIENT_ID_SLH_DSA_PURE_SHA2_256F _PATH_SSH_USER_DIR "/id_slhdsapuresha2256f" +#define _PATH_SSH_CLIENT_ID_ECDSA_NISTP521_SLH_DSA_PURE_SHA2_256F _PATH_SSH_USER_DIR "/id_ecdsa_nistp521_slhdsapuresha2256f" +#define _PATH_SSH_CLIENT_ID_ML_DSA_44 _PATH_SSH_USER_DIR "/id_mldsa44" +#define _PATH_SSH_CLIENT_ID_RSA3072_ML_DSA_44 _PATH_SSH_USER_DIR "/id_rsa3072_mldsa44" +#define _PATH_SSH_CLIENT_ID_ECDSA_NISTP256_ML_DSA_44 _PATH_SSH_USER_DIR "/id_ecdsa_nistp256_mldsa44" +#define _PATH_SSH_CLIENT_ID_ML_DSA_65 _PATH_SSH_USER_DIR "/id_mldsa65" +#define _PATH_SSH_CLIENT_ID_ECDSA_NISTP384_ML_DSA_65 _PATH_SSH_USER_DIR "/id_ecdsa_nistp384_mldsa65" +#define _PATH_SSH_CLIENT_ID_ML_DSA_87 _PATH_SSH_USER_DIR "/id_mldsa87" +#define _PATH_SSH_CLIENT_ID_ECDSA_NISTP521_ML_DSA_87 _PATH_SSH_USER_DIR "/id_ecdsa_nistp521_mldsa87" +#define _PATH_SSH_CLIENT_ID_MAYO_2 _PATH_SSH_USER_DIR "/id_mayo2" +#define _PATH_SSH_CLIENT_ID_RSA3072_MAYO_2 _PATH_SSH_USER_DIR "/id_rsa3072_mayo2" +#define _PATH_SSH_CLIENT_ID_ECDSA_NISTP256_MAYO_2 _PATH_SSH_USER_DIR "/id_ecdsa_nistp256_mayo2" +#define _PATH_SSH_CLIENT_ID_MAYO_3 _PATH_SSH_USER_DIR "/id_mayo3" +#define _PATH_SSH_CLIENT_ID_ECDSA_NISTP384_MAYO_3 _PATH_SSH_USER_DIR "/id_ecdsa_nistp384_mayo3" +#define _PATH_SSH_CLIENT_ID_MAYO_5 _PATH_SSH_USER_DIR "/id_mayo5" +#define _PATH_SSH_CLIENT_ID_ECDSA_NISTP521_MAYO_5 _PATH_SSH_USER_DIR "/id_ecdsa_nistp521_mayo5" +///// OQS_TEMPLATE_FRAGMENT_ADD_ID_FILE_PATHS_END /* * Configuration file in user's home directory. This file need not be diff --git a/servconf.c b/servconf.c index 9b443bea0673..453993141bc7 100644 --- a/servconf.c +++ b/servconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: servconf.c,v 1.451 2026/07/07 01:00:22 djm Exp $ */ +/* $OpenBSD: servconf.c,v 1.450 2026/06/29 08:59:31 djm Exp $ */ /* * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland * All rights reserved @@ -321,6 +321,60 @@ fill_default_server_options(ServerOptions *options) _PATH_HOST_ED25519_KEY_FILE, 0); servconf_add_hostkey("[default]", 0, options, _PATH_HOST_MLDSA44_ED25519_KEY_FILE, 0); +///// OQS_TEMPLATE_FRAGMENT_SERVER_ADD_HOSTKEYS_START + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_FALCON_512_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_FALCON_1024_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_SLH_DSA_PURE_SHA2_128F_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_SLH_DSA_PURE_SHA2_256F_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_ML_DSA_44_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_ML_DSA_65_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_ML_DSA_87_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_MAYO_2_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_MAYO_3_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_MAYO_5_KEY_FILE, 0); +#ifdef WITH_OPENSSL + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_RSA3072_FALCON_512_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_RSA3072_SLH_DSA_PURE_SHA2_128F_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_RSA3072_ML_DSA_44_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_RSA3072_MAYO_2_KEY_FILE, 0); +#ifdef OPENSSL_HAS_ECC + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_ECDSA_NISTP256_FALCON_512_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_ECDSA_NISTP521_FALCON_1024_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_ECDSA_NISTP256_SLH_DSA_PURE_SHA2_128F_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_ECDSA_NISTP521_SLH_DSA_PURE_SHA2_256F_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_ECDSA_NISTP256_ML_DSA_44_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_ECDSA_NISTP384_ML_DSA_65_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_ECDSA_NISTP521_ML_DSA_87_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_ECDSA_NISTP256_MAYO_2_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_ECDSA_NISTP384_MAYO_3_KEY_FILE, 0); + servconf_add_hostkey("[default]", 0, options, + _PATH_HOST_ECDSA_NISTP521_MAYO_5_KEY_FILE, 0); +#endif /* OPENSSL_HAS_ECC */ +#endif /* WITH_OPENSSL */ +///// OQS_TEMPLATE_FRAGMENT_SERVER_ADD_HOSTKEYS_END } /* No certificates by default */ if (options->num_ports == 0) @@ -1433,19 +1487,19 @@ process_server_config_line_depth(ServerOptions *options, char *line, #endif /* KRB5 */ #ifdef GSSAPI - case sGSSAPIAuthentication: + case sGssAuthentication: intptr = &options->gss_authentication; goto parse_flag; - case sGSSAPICleanupCredentials: + case sGssCleanupCreds: intptr = &options->gss_cleanup_creds; goto parse_flag; - case sGSSAPIDelegateCredentials: + case sGssDelegateCreds: intptr = &options->gss_deleg_creds; goto parse_flag; - case sGSSAPIStrictAcceptorCheck: + case sGssStrictAcceptor: intptr = &options->gss_strict_acceptor; goto parse_flag; #endif /* GSSAPI */ @@ -4215,10 +4269,10 @@ dump_config(ServerOptions *o) # endif #endif #ifdef GSSAPI - dump_cfg_fmtint(sGSSAPIAuthentication, o->gss_authentication); - dump_cfg_fmtint(sGSSAPICleanupCredentials, o->gss_cleanup_creds); - dump_cfg_fmtint(sGSSAPIDelegateCredentials, o->gss_deleg_creds); - dump_cfg_fmtint(sGSSAPIStrictAcceptorCheck, o->gss_strict_acceptor); + dump_cfg_fmtint(sGssAuthentication, o->gss_authentication); + dump_cfg_fmtint(sGssCleanupCreds, o->gss_cleanup_creds); + dump_cfg_fmtint(sGssDelegateCreds, o->gss_deleg_creds); + dump_cfg_fmtint(sGssStrictAcceptor, o->gss_strict_acceptor); #endif dump_cfg_fmtint(sPasswordAuthentication, o->password_authentication); dump_cfg_fmtint(sKbdInteractiveAuthentication, diff --git a/servconf.h b/servconf.h index 3648e2be1af0..9e64e4673743 100644 --- a/servconf.h +++ b/servconf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: servconf.h,v 1.179 2026/07/07 01:00:22 djm Exp $ */ +/* $OpenBSD: servconf.h,v 1.177 2026/05/31 11:30:50 djm Exp $ */ /* * Author: Tatu Ylonen @@ -273,11 +273,11 @@ SSHCONF_ALIAS(KeepAlive, TCPKeepAlive, SSHCFG_GLOBAL) #ifdef USE_PAM #define SSHD_CONFIG_ENTRIES_PAM \ SSHCONF_INTFLAG(use_pam, UsePAM, SSHCFG_GLOBAL, 0, SSHCFG_COPY_NONE) \ -SSHCONF_STRING(pam_service_name, PAMServiceName, SSHCFG_ALL, SSHCFG_COPY_NONE) +SSHCONF_STRING(pam_service_name, PAMServiceName, SSHCFG_GLOBAL, SSHCFG_COPY_NONE) #else #define SSHD_CONFIG_ENTRIES_PAM \ SSHCONF_UNSUPPORTED_INT(use_pam, UsePAM, SSHCFG_GLOBAL) \ -SSHCONF_UNSUPPORTED_STRING(pam_service_name, PAMServiceName, SSHCFG_ALL) +SSHCONF_UNSUPPORTED_STRING(pam_service_name, PAMServiceName, SSHCFG_GLOBAL) #endif #ifdef DISABLE_LASTLOG @@ -314,16 +314,16 @@ SSHCONF_UNSUPPORTED_INT(kerberos_get_afs_token, KerberosGetAFSToken, SSHCFG_GLOB #ifdef GSSAPI #define SSHD_CONFIG_ENTRIES_GSS \ -SSHCONF_INTFLAG(gss_authentication, GSSAPIAuthentication, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ -SSHCONF_INTFLAG(gss_cleanup_creds, GSSAPICleanupCredentials, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ -SSHCONF_INTFLAG(gss_deleg_creds, GSSAPIDelegateCredentials, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ -SSHCONF_INTFLAG(gss_strict_acceptor, GSSAPIStrictAcceptorCheck, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) +SSHCONF_INTFLAG(gss_authentication, GssAuthentication, SSHCFG_ALL, 0, SSHCFG_COPY_MATCH) \ +SSHCONF_INTFLAG(gss_cleanup_creds, GssCleanupCreds, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(gss_deleg_creds, GssDelegateCreds, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) \ +SSHCONF_INTFLAG(gss_strict_acceptor, GssStrictAcceptor, SSHCFG_GLOBAL, 1, SSHCFG_COPY_NONE) #else /* GSSAPI */ #define SSHD_CONFIG_ENTRIES_GSS \ -SSHCONF_UNSUPPORTED_INT(gss_authentication, GSSAPIAuthentication, SSHCFG_ALL) \ -SSHCONF_UNSUPPORTED_INT(gss_cleanup_creds, GSSAPICleanupCredentials, SSHCFG_GLOBAL) \ -SSHCONF_UNSUPPORTED_INT(gss_deleg_creds, GSSAPIDelegateCredentials, SSHCFG_GLOBAL) \ -SSHCONF_UNSUPPORTED_INT(gss_strict_acceptor, GSSAPIStrictAcceptorCheck, SSHCFG_GLOBAL) +SSHCONF_UNSUPPORTED_INT(gss_authentication, GssAuthentication, SSHCFG_ALL) \ +SSHCONF_UNSUPPORTED_INT(gss_cleanup_creds, GssCleanupCreds, SSHCFG_GLOBAL) \ +SSHCONF_UNSUPPORTED_INT(gss_deleg_creds, GssDelegateCreds, SSHCFG_GLOBAL) \ +SSHCONF_UNSUPPORTED_INT(gss_strict_acceptor, GssStrictAcceptor, SSHCFG_GLOBAL) #endif /* GSSAPI */ #define SSHD_CONFIG_ENTRIES \ diff --git a/ssh-keygen.c b/ssh-keygen.c index bc3c3a2b2fdf..36080b2f2171 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -315,6 +315,84 @@ ask_filename(struct passwd *pw, const char *prompt) case KEY_MLDSA44_ED25519_CERT: name = _PATH_SSH_CLIENT_ID_MLDSA44_ED25519; break; +///// OQS_TEMPLATE_FRAGMENT_HANDLE_ID_FILES_START + case KEY_FALCON_512: + name = _PATH_SSH_CLIENT_ID_FALCON_512; + break; + case KEY_FALCON_1024: + name = _PATH_SSH_CLIENT_ID_FALCON_1024; + break; + case KEY_SLH_DSA_PURE_SHA2_128F: + name = _PATH_SSH_CLIENT_ID_SLH_DSA_PURE_SHA2_128F; + break; + case KEY_SLH_DSA_PURE_SHA2_256F: + name = _PATH_SSH_CLIENT_ID_SLH_DSA_PURE_SHA2_256F; + break; + case KEY_ML_DSA_44: + name = _PATH_SSH_CLIENT_ID_ML_DSA_44; + break; + case KEY_ML_DSA_65: + name = _PATH_SSH_CLIENT_ID_ML_DSA_65; + break; + case KEY_ML_DSA_87: + name = _PATH_SSH_CLIENT_ID_ML_DSA_87; + break; + case KEY_MAYO_2: + name = _PATH_SSH_CLIENT_ID_MAYO_2; + break; + case KEY_MAYO_3: + name = _PATH_SSH_CLIENT_ID_MAYO_3; + break; + case KEY_MAYO_5: + name = _PATH_SSH_CLIENT_ID_MAYO_5; + break; +#ifdef WITH_OPENSSL + case KEY_RSA3072_FALCON_512: + name = _PATH_SSH_CLIENT_ID_RSA3072_FALCON_512; + break; + case KEY_RSA3072_SLH_DSA_PURE_SHA2_128F: + name = _PATH_SSH_CLIENT_ID_RSA3072_SLH_DSA_PURE_SHA2_128F; + break; + case KEY_RSA3072_ML_DSA_44: + name = _PATH_SSH_CLIENT_ID_RSA3072_ML_DSA_44; + break; + case KEY_RSA3072_MAYO_2: + name = _PATH_SSH_CLIENT_ID_RSA3072_MAYO_2; + break; +#ifdef OPENSSL_HAS_ECC + case KEY_ECDSA_NISTP256_FALCON_512: + name = _PATH_SSH_CLIENT_ID_ECDSA_NISTP256_FALCON_512; + break; + case KEY_ECDSA_NISTP521_FALCON_1024: + name = _PATH_SSH_CLIENT_ID_ECDSA_NISTP521_FALCON_1024; + break; + case KEY_ECDSA_NISTP256_SLH_DSA_PURE_SHA2_128F: + name = _PATH_SSH_CLIENT_ID_ECDSA_NISTP256_SLH_DSA_PURE_SHA2_128F; + break; + case KEY_ECDSA_NISTP521_SLH_DSA_PURE_SHA2_256F: + name = _PATH_SSH_CLIENT_ID_ECDSA_NISTP521_SLH_DSA_PURE_SHA2_256F; + break; + case KEY_ECDSA_NISTP256_ML_DSA_44: + name = _PATH_SSH_CLIENT_ID_ECDSA_NISTP256_ML_DSA_44; + break; + case KEY_ECDSA_NISTP384_ML_DSA_65: + name = _PATH_SSH_CLIENT_ID_ECDSA_NISTP384_ML_DSA_65; + break; + case KEY_ECDSA_NISTP521_ML_DSA_87: + name = _PATH_SSH_CLIENT_ID_ECDSA_NISTP521_ML_DSA_87; + break; + case KEY_ECDSA_NISTP256_MAYO_2: + name = _PATH_SSH_CLIENT_ID_ECDSA_NISTP256_MAYO_2; + break; + case KEY_ECDSA_NISTP384_MAYO_3: + name = _PATH_SSH_CLIENT_ID_ECDSA_NISTP384_MAYO_3; + break; + case KEY_ECDSA_NISTP521_MAYO_5: + name = _PATH_SSH_CLIENT_ID_ECDSA_NISTP521_MAYO_5; + break; +#endif /* OPENSSL_HAS_ECC */ +#endif /* WITH_OPENSSL */ +///// OQS_TEMPLATE_FRAGMENT_HANDLE_ID_FILES_END default: fatal("bad key type"); } @@ -1061,6 +1139,36 @@ do_gen_all_hostkeys(struct passwd *pw) { "mldsa44-ed25519", "MLDSA44-ED25519", _PATH_HOST_MLDSA44_ED25519_KEY_FILE }, #endif +///// OQS_TEMPLATE_FRAGMENT_DEFINE_KEY_TYPES_START + { "falcon512", "FALCON_512", _PATH_HOST_FALCON_512_KEY_FILE }, + { "falcon1024", "FALCON_1024", _PATH_HOST_FALCON_1024_KEY_FILE }, + { "slhdsapuresha2128f", "SLH_DSA_PURE_SHA2_128F", _PATH_HOST_SLH_DSA_PURE_SHA2_128F_KEY_FILE }, + { "slhdsapuresha2256f", "SLH_DSA_PURE_SHA2_256F", _PATH_HOST_SLH_DSA_PURE_SHA2_256F_KEY_FILE }, + { "mldsa-44", "ML_DSA_44", _PATH_HOST_ML_DSA_44_KEY_FILE }, + { "mldsa-65", "ML_DSA_65", _PATH_HOST_ML_DSA_65_KEY_FILE }, + { "mldsa-87", "ML_DSA_87", _PATH_HOST_ML_DSA_87_KEY_FILE }, + { "mayo2", "MAYO_2", _PATH_HOST_MAYO_2_KEY_FILE }, + { "mayo3", "MAYO_3", _PATH_HOST_MAYO_3_KEY_FILE }, + { "mayo5", "MAYO_5", _PATH_HOST_MAYO_5_KEY_FILE }, +#ifdef WITH_OPENSSL + { "rsa3072_falcon512", "RSA3072_FALCON_512", _PATH_HOST_RSA3072_FALCON_512_KEY_FILE }, + { "rsa3072_slhdsapuresha2128f", "RSA3072_SLH_DSA_PURE_SHA2_128F", _PATH_HOST_RSA3072_SLH_DSA_PURE_SHA2_128F_KEY_FILE }, + { "rsa3072_mldsa-44", "RSA3072_ML_DSA_44", _PATH_HOST_RSA3072_ML_DSA_44_KEY_FILE }, + { "rsa3072_mayo2", "RSA3072_MAYO_2", _PATH_HOST_RSA3072_MAYO_2_KEY_FILE }, +#ifdef OPENSSL_HAS_ECC + { "ecdsa_nistp256_falcon512", "ECDSA_NISTP256_FALCON_512", _PATH_HOST_ECDSA_NISTP256_FALCON_512_KEY_FILE }, + { "ecdsa_nistp521_falcon1024", "ECDSA_NISTP521_FALCON_1024", _PATH_HOST_ECDSA_NISTP521_FALCON_1024_KEY_FILE }, + { "ecdsa_nistp256_slhdsapuresha2128f", "ECDSA_NISTP256_SLH_DSA_PURE_SHA2_128F", _PATH_HOST_ECDSA_NISTP256_SLH_DSA_PURE_SHA2_128F_KEY_FILE }, + { "ecdsa_nistp521_slhdsapuresha2256f", "ECDSA_NISTP521_SLH_DSA_PURE_SHA2_256F", _PATH_HOST_ECDSA_NISTP521_SLH_DSA_PURE_SHA2_256F_KEY_FILE }, + { "ecdsa_nistp256_mldsa-44", "ECDSA_NISTP256_ML_DSA_44", _PATH_HOST_ECDSA_NISTP256_ML_DSA_44_KEY_FILE }, + { "ecdsa_nistp384_mldsa-65", "ECDSA_NISTP384_ML_DSA_65", _PATH_HOST_ECDSA_NISTP384_ML_DSA_65_KEY_FILE }, + { "ecdsa_nistp521_mldsa-87", "ECDSA_NISTP521_ML_DSA_87", _PATH_HOST_ECDSA_NISTP521_ML_DSA_87_KEY_FILE }, + { "ecdsa_nistp256_mayo2", "ECDSA_NISTP256_MAYO_2", _PATH_HOST_ECDSA_NISTP256_MAYO_2_KEY_FILE }, + { "ecdsa_nistp384_mayo3", "ECDSA_NISTP384_MAYO_3", _PATH_HOST_ECDSA_NISTP384_MAYO_3_KEY_FILE }, + { "ecdsa_nistp521_mayo5", "ECDSA_NISTP521_MAYO_5", _PATH_HOST_ECDSA_NISTP521_MAYO_5_KEY_FILE }, +#endif /* OPENSSL_HAS_ECC */ +#endif /* WITH_OPENSSL */ +///// OQS_TEMPLATE_FRAGMENT_DEFINE_KEY_TYPES_END { NULL, NULL, NULL } }; @@ -3316,7 +3424,9 @@ usage(void) fprintf(stderr, "usage: ssh-keygen [-q] [-a rounds] [-b bits] [-C comment] [-f output_keyfile]\n" " [-m format] [-N new_passphrase] [-O option]\n" - " [-t ecdsa|ecdsa-sk|ed25519|ed25519-sk|mldsa44-ed25519|rsa]\n" + " [-t ecdsa|ecdsa-sk|ed25519|ed25519-sk|mldsa44-ed25519|rsa" + " |\n OQS-fork added algorithms (see README.md)" + " ]\n" " [-w provider] [-Z cipher]\n" " ssh-keygen -p [-a rounds] [-f keyfile] [-m format] [-N new_passphrase]\n" " [-P old_passphrase] [-Z cipher]\n" diff --git a/ssh-keyscan.c b/ssh-keyscan.c index 6e7681a35905..2ab24340cc98 100644 --- a/ssh-keyscan.c +++ b/ssh-keyscan.c @@ -66,12 +66,64 @@ int ssh_port = SSH_DEFAULT_PORT; #define KT_ECDSA_SK (1<<4) #define KT_ED25519_SK (1<<5) #define KT_MLDSA44_ED25519 (1<<6) - +///// OQS_TEMPLATE_FRAGMENT_ASSIGN_KT_MASKS_START +#define KT_FALCON_512 ((uint64_t)1<<7) +#define KT_RSA3072_FALCON_512 ((uint64_t)1<<8) +#define KT_ECDSA_NISTP256_FALCON_512 ((uint64_t)1<<9) +#define KT_FALCON_1024 ((uint64_t)1<<10) +#define KT_ECDSA_NISTP521_FALCON_1024 ((uint64_t)1<<11) +#define KT_SLH_DSA_PURE_SHA2_128F ((uint64_t)1<<12) +#define KT_RSA3072_SLH_DSA_PURE_SHA2_128F ((uint64_t)1<<13) +#define KT_ECDSA_NISTP256_SLH_DSA_PURE_SHA2_128F ((uint64_t)1<<14) +#define KT_SLH_DSA_PURE_SHA2_256F ((uint64_t)1<<15) +#define KT_ECDSA_NISTP521_SLH_DSA_PURE_SHA2_256F ((uint64_t)1<<16) +#define KT_ML_DSA_44 ((uint64_t)1<<17) +#define KT_RSA3072_ML_DSA_44 ((uint64_t)1<<18) +#define KT_ECDSA_NISTP256_ML_DSA_44 ((uint64_t)1<<19) +#define KT_ML_DSA_65 ((uint64_t)1<<20) +#define KT_ECDSA_NISTP384_ML_DSA_65 ((uint64_t)1<<21) +#define KT_ML_DSA_87 ((uint64_t)1<<22) +#define KT_ECDSA_NISTP521_ML_DSA_87 ((uint64_t)1<<23) +#define KT_MAYO_2 ((uint64_t)1<<24) +#define KT_RSA3072_MAYO_2 ((uint64_t)1<<25) +#define KT_ECDSA_NISTP256_MAYO_2 ((uint64_t)1<<26) +#define KT_MAYO_3 ((uint64_t)1<<27) +#define KT_ECDSA_NISTP384_MAYO_3 ((uint64_t)1<<28) +#define KT_MAYO_5 ((uint64_t)1<<29) +#define KT_ECDSA_NISTP521_MAYO_5 ((uint64_t)1<<30) +#define KT_MAX ((uint64_t)1<<30) +///// OQS_TEMPLATE_FRAGMENT_ASSIGN_KT_MASKS_END #define KT_MIN KT_RSA #define KT_MAX KT_MLDSA44_ED25519 int get_cert = 0; -int get_keytypes = KT_RSA|KT_ECDSA|KT_ED25519|KT_ECDSA_SK|KT_ED25519_SK|KT_MLDSA44_ED25519; +uint64_t get_keytypes = KT_RSA|KT_ECDSA|KT_ED25519|KT_ECDSA_SK|KT_ED25519_SK|KT_MLDSA44_ED25519|\ +///// OQS_TEMPLATE_FRAGMENT_ADD_KEYTYPES_START + KT_FALCON_512 | \ + KT_RSA3072_FALCON_512 | \ + KT_ECDSA_NISTP256_FALCON_512 | \ + KT_FALCON_1024 | \ + KT_ECDSA_NISTP521_FALCON_1024 | \ + KT_SLH_DSA_PURE_SHA2_128F | \ + KT_RSA3072_SLH_DSA_PURE_SHA2_128F | \ + KT_ECDSA_NISTP256_SLH_DSA_PURE_SHA2_128F | \ + KT_SLH_DSA_PURE_SHA2_256F | \ + KT_ECDSA_NISTP521_SLH_DSA_PURE_SHA2_256F | \ + KT_ML_DSA_44 | \ + KT_RSA3072_ML_DSA_44 | \ + KT_ECDSA_NISTP256_ML_DSA_44 | \ + KT_ML_DSA_65 | \ + KT_ECDSA_NISTP384_ML_DSA_65 | \ + KT_ML_DSA_87 | \ + KT_ECDSA_NISTP521_ML_DSA_87 | \ + KT_MAYO_2 | \ + KT_RSA3072_MAYO_2 | \ + KT_ECDSA_NISTP256_MAYO_2 | \ + KT_MAYO_3 | \ + KT_ECDSA_NISTP384_MAYO_3 | \ + KT_MAYO_5 | \ + KT_ECDSA_NISTP521_MAYO_5; +///// OQS_TEMPLATE_FRAGMENT_ADD_KEYTYPES_END int hash_hosts = 0; /* Hash hostname on output */ @@ -897,6 +949,80 @@ main(int argc, char **argv) case KEY_MLDSA44_ED25519: get_keytypes |= KT_MLDSA44_ED25519; break; +///// OQS_TEMPLATE_FRAGMENT_ADD_TO_GET_KEYTYPES_START + case KEY_FALCON_512: + get_keytypes |= KT_FALCON_512; + break; + case KEY_RSA3072_FALCON_512: + get_keytypes |= KT_RSA3072_FALCON_512; + break; + case KEY_ECDSA_NISTP256_FALCON_512: + get_keytypes |= KT_ECDSA_NISTP256_FALCON_512; + break; + case KEY_FALCON_1024: + get_keytypes |= KT_FALCON_1024; + break; + case KEY_ECDSA_NISTP521_FALCON_1024: + get_keytypes |= KT_ECDSA_NISTP521_FALCON_1024; + break; + case KEY_SLH_DSA_PURE_SHA2_128F: + get_keytypes |= KT_SLH_DSA_PURE_SHA2_128F; + break; + case KEY_RSA3072_SLH_DSA_PURE_SHA2_128F: + get_keytypes |= KT_RSA3072_SLH_DSA_PURE_SHA2_128F; + break; + case KEY_ECDSA_NISTP256_SLH_DSA_PURE_SHA2_128F: + get_keytypes |= KT_ECDSA_NISTP256_SLH_DSA_PURE_SHA2_128F; + break; + case KEY_SLH_DSA_PURE_SHA2_256F: + get_keytypes |= KT_SLH_DSA_PURE_SHA2_256F; + break; + case KEY_ECDSA_NISTP521_SLH_DSA_PURE_SHA2_256F: + get_keytypes |= KT_ECDSA_NISTP521_SLH_DSA_PURE_SHA2_256F; + break; + case KEY_ML_DSA_44: + get_keytypes |= KT_ML_DSA_44; + break; + case KEY_RSA3072_ML_DSA_44: + get_keytypes |= KT_RSA3072_ML_DSA_44; + break; + case KEY_ECDSA_NISTP256_ML_DSA_44: + get_keytypes |= KT_ECDSA_NISTP256_ML_DSA_44; + break; + case KEY_ML_DSA_65: + get_keytypes |= KT_ML_DSA_65; + break; + case KEY_ECDSA_NISTP384_ML_DSA_65: + get_keytypes |= KT_ECDSA_NISTP384_ML_DSA_65; + break; + case KEY_ML_DSA_87: + get_keytypes |= KT_ML_DSA_87; + break; + case KEY_ECDSA_NISTP521_ML_DSA_87: + get_keytypes |= KT_ECDSA_NISTP521_ML_DSA_87; + break; + case KEY_MAYO_2: + get_keytypes |= KT_MAYO_2; + break; + case KEY_RSA3072_MAYO_2: + get_keytypes |= KT_RSA3072_MAYO_2; + break; + case KEY_ECDSA_NISTP256_MAYO_2: + get_keytypes |= KT_ECDSA_NISTP256_MAYO_2; + break; + case KEY_MAYO_3: + get_keytypes |= KT_MAYO_3; + break; + case KEY_ECDSA_NISTP384_MAYO_3: + get_keytypes |= KT_ECDSA_NISTP384_MAYO_3; + break; + case KEY_MAYO_5: + get_keytypes |= KT_MAYO_5; + break; + case KEY_ECDSA_NISTP521_MAYO_5: + get_keytypes |= KT_ECDSA_NISTP521_MAYO_5; + break; +///// OQS_TEMPLATE_FRAGMENT_ADD_TO_GET_KEYTYPES_END case KEY_UNSPEC: default: fatal("Unknown key type \"%s\"", tname); diff --git a/ssh-keysign.c b/ssh-keysign.c index b0e521a6ba4d..61d56e13fb46 100644 --- a/ssh-keysign.c +++ b/ssh-keysign.c @@ -206,7 +206,32 @@ main(int argc, char **argv) key_fd[i++] = open(_PATH_HOST_ED25519_KEY_FILE, O_RDONLY); key_fd[i++] = open(_PATH_HOST_RSA_KEY_FILE, O_RDONLY); key_fd[i++] = open(_PATH_HOST_MLDSA44_ED25519_KEY_FILE, O_RDONLY); - +///// OQS_TEMPLATE_FRAGMENT_OPEN_KEY_FILES_START + key_fd[i++] = open(_PATH_HOST_FALCON_512_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_RSA3072_FALCON_512_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_ECDSA_NISTP256_FALCON_512_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_FALCON_1024_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_ECDSA_NISTP521_FALCON_1024_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_SLH_DSA_PURE_SHA2_128F_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_RSA3072_SLH_DSA_PURE_SHA2_128F_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_ECDSA_NISTP256_SLH_DSA_PURE_SHA2_128F_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_SLH_DSA_PURE_SHA2_256F_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_ECDSA_NISTP521_SLH_DSA_PURE_SHA2_256F_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_ML_DSA_44_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_RSA3072_ML_DSA_44_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_ECDSA_NISTP256_ML_DSA_44_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_ML_DSA_65_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_ECDSA_NISTP384_ML_DSA_65_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_ML_DSA_87_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_ECDSA_NISTP521_ML_DSA_87_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_MAYO_2_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_RSA3072_MAYO_2_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_ECDSA_NISTP256_MAYO_2_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_MAYO_3_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_ECDSA_NISTP384_MAYO_3_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_MAYO_5_KEY_FILE, O_RDONLY); + key_fd[i++] = open(_PATH_HOST_ECDSA_NISTP521_MAYO_5_KEY_FILE, O_RDONLY); +///// OQS_TEMPLATE_FRAGMENT_OPEN_KEY_FILES_END if ((pw = getpwuid(getuid())) == NULL) fatal("getpwuid failed"); pw = pwcopy(pw); diff --git a/ssh.c b/ssh.c index 6ba4c3b4d944..28b6b3d3edc3 100644 --- a/ssh.c +++ b/ssh.c @@ -1727,6 +1727,32 @@ main(int ac, char **av) L_PUBKEY(_PATH_HOST_ED25519_KEY_FILE, 5); L_PUBKEY(_PATH_HOST_RSA_KEY_FILE, 6); L_PUBKEY(_PATH_HOST_MLDSA44_ED25519_KEY_FILE, 7); +///// OQS_TEMPLATE_FRAGMENT_LOAD_PUBKEYS_START + L_PUBKEY(_PATH_HOST_FALCON_512_KEY_FILE, 10); + L_PUBKEY(_PATH_HOST_RSA3072_FALCON_512_KEY_FILE, 11); + L_PUBKEY(_PATH_HOST_ECDSA_NISTP256_FALCON_512_KEY_FILE, 12); + L_PUBKEY(_PATH_HOST_FALCON_1024_KEY_FILE, 13); + L_PUBKEY(_PATH_HOST_ECDSA_NISTP521_FALCON_1024_KEY_FILE, 14); + L_PUBKEY(_PATH_HOST_SLH_DSA_PURE_SHA2_128F_KEY_FILE, 15); + L_PUBKEY(_PATH_HOST_RSA3072_SLH_DSA_PURE_SHA2_128F_KEY_FILE, 16); + L_PUBKEY(_PATH_HOST_ECDSA_NISTP256_SLH_DSA_PURE_SHA2_128F_KEY_FILE, 17); + L_PUBKEY(_PATH_HOST_SLH_DSA_PURE_SHA2_256F_KEY_FILE, 18); + L_PUBKEY(_PATH_HOST_ECDSA_NISTP521_SLH_DSA_PURE_SHA2_256F_KEY_FILE, 19); + L_PUBKEY(_PATH_HOST_ML_DSA_44_KEY_FILE, 20); + L_PUBKEY(_PATH_HOST_RSA3072_ML_DSA_44_KEY_FILE, 21); + L_PUBKEY(_PATH_HOST_ECDSA_NISTP256_ML_DSA_44_KEY_FILE, 22); + L_PUBKEY(_PATH_HOST_ML_DSA_65_KEY_FILE, 23); + L_PUBKEY(_PATH_HOST_ECDSA_NISTP384_ML_DSA_65_KEY_FILE, 24); + L_PUBKEY(_PATH_HOST_ML_DSA_87_KEY_FILE, 25); + L_PUBKEY(_PATH_HOST_ECDSA_NISTP521_ML_DSA_87_KEY_FILE, 26); + L_PUBKEY(_PATH_HOST_MAYO_2_KEY_FILE, 27); + L_PUBKEY(_PATH_HOST_RSA3072_MAYO_2_KEY_FILE, 28); + L_PUBKEY(_PATH_HOST_ECDSA_NISTP256_MAYO_2_KEY_FILE, 29); + L_PUBKEY(_PATH_HOST_MAYO_3_KEY_FILE, 30); + L_PUBKEY(_PATH_HOST_ECDSA_NISTP384_MAYO_3_KEY_FILE, 31); + L_PUBKEY(_PATH_HOST_MAYO_5_KEY_FILE, 32); + L_PUBKEY(_PATH_HOST_ECDSA_NISTP521_MAYO_5_KEY_FILE, 33); +///// OQS_TEMPLATE_FRAGMENT_LOAD_PUBKEYS_END if (loaded == 0) debug("HostbasedAuthentication enabled but no " "local public host keys could be loaded."); diff --git a/sshconnect2.c b/sshconnect2.c index 7d1192fcc204..dc734b369754 100644 --- a/sshconnect2.c +++ b/sshconnect2.c @@ -1340,12 +1340,14 @@ identity_sign(struct identity *id, u_char **sigp, size_t *lenp, } goto out; } - - /* - * PKCS#11 tokens may not support all signature algorithms, - * so check what we get back. - */ - if (id->key != NULL && (id->key->flags & SSHKEY_FLAG_EXT) != 0 && + // OQS-TODO: for now, our hybrid sig fail that test. Need to fix our formatting + // or update the test + if (!oqs_utils_is_hybrid(sign_key->type)) { + /* + * PKCS#11 tokens may not support all signature algorithms, + * so check what we get back. + */ + if (id->key != NULL && (id->key->flags & SSHKEY_FLAG_EXT) != 0 && (r = sshkey_check_sigtype(*sigp, *lenp, alg)) != 0) { debug_fr(r, "sshkey_check_sigtype"); goto out; diff --git a/sshkey.c b/sshkey.c index 7f56a4f1ff27..605541084e69 100644 --- a/sshkey.c +++ b/sshkey.c @@ -3477,6 +3477,7 @@ sshkey_private_to_fileblob(struct sshkey *key, struct sshbuf *blob, CASE_KEY_HYBRID: #endif /* WITH_OPENSSL */ case KEY_MLDSA44_ED25519: + CASE_KEY_OQS: return sshkey_private_to_blob2(key, blob, passphrase, comment, openssh_format_cipher, openssh_format_rounds); default: diff --git a/sshkey.h b/sshkey.h index 20cd57a2a21a..98c68c5f27a3 100644 --- a/sshkey.h +++ b/sshkey.h @@ -73,6 +73,32 @@ enum sshkey_types { KEY_ED25519_SK_CERT, KEY_MLDSA44_ED25519, KEY_MLDSA44_ED25519_CERT, +///// OQS_TEMPLATE_FRAGMENT_ENUMERATE_KEYTYPES_START + KEY_FALCON_512, + KEY_RSA3072_FALCON_512, + KEY_ECDSA_NISTP256_FALCON_512, + KEY_FALCON_1024, + KEY_ECDSA_NISTP521_FALCON_1024, + KEY_SLH_DSA_PURE_SHA2_128F, + KEY_RSA3072_SLH_DSA_PURE_SHA2_128F, + KEY_ECDSA_NISTP256_SLH_DSA_PURE_SHA2_128F, + KEY_SLH_DSA_PURE_SHA2_256F, + KEY_ECDSA_NISTP521_SLH_DSA_PURE_SHA2_256F, + KEY_ML_DSA_44, + KEY_RSA3072_ML_DSA_44, + KEY_ECDSA_NISTP256_ML_DSA_44, + KEY_ML_DSA_65, + KEY_ECDSA_NISTP384_ML_DSA_65, + KEY_ML_DSA_87, + KEY_ECDSA_NISTP521_ML_DSA_87, + KEY_MAYO_2, + KEY_RSA3072_MAYO_2, + KEY_ECDSA_NISTP256_MAYO_2, + KEY_MAYO_3, + KEY_ECDSA_NISTP384_MAYO_3, + KEY_MAYO_5, + KEY_ECDSA_NISTP521_MAYO_5, +///// OQS_TEMPLATE_FRAGMENT_ENUMERATE_KEYTYPES_END KEY_UNSPEC }; @@ -133,6 +159,10 @@ struct sshkey { /* KEY_MLDSA44_ED25519 */ u_char *mldsa_ed25519_sk; u_char *mldsa_ed25519_pk; + u_char *oqs_sk; /* post-quantum secret key */ + size_t oqs_sk_len; /* post-quantum secret length */ + u_char *oqs_pk; /* post-quantum public key */ + size_t oqs_pk_len; /* post-quantum public length */ /* KEY_ECDSA_SK and KEY_ED25519_SK */ char *sk_application; uint8_t sk_flags; diff --git a/version.h b/version.h index e277c32f364f..0f63303e37b3 100644 --- a/version.h +++ b/version.h @@ -1,6 +1,6 @@ /* $OpenBSD: version.h,v 1.109 2026/07/06 07:54:26 djm Exp $ */ -#define SSH_VERSION "OpenSSH_10.4" +#define SSH_VERSION "OpenSSH_10.4-2026-08_" #define SSH_PORTABLE "p1" #define SSH_RELEASE SSH_VERSION SSH_PORTABLE ", Open Quantum Safe 2026-05" From 1ef3c3a809a5a88d30edadf1ba8e47e859c80061 Mon Sep 17 00:00:00 2001 From: Andrew Younkers Date: Mon, 10 Aug 2026 14:59:39 -0400 Subject: [PATCH 193/196] update readme to include OpenSSH 'ssh-mldsa44-ed25519' implementation Signed-off-by: Andrew Younkers --- README.md | 1 + version.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7ef6cf09d1f8..da8a255cfc9f 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,7 @@ The following hybrid algorithms are supported; they combine a quantum-safe algor - if `` has L1 security, then the fork provides the methods `rsa3072-` and `ecdsa-nistp256-`, which combine `` with RSA3072 and with ECDSA using NIST's P256 curve respectively. - if `` has L3 security, the fork provides the method `ecdsa-nistp384-`, which combines `` with ECDSA using NIST's P384 curve. - if `` has L5 security, the fork provides the method `ecdsa-nistp521-`, which combines `` with ECDSA using NIST's P521 curve. +- NOTE: OpenSSH has added support for the `ssh-mldsa44-ed25519` hybrid signature algorithm in v10.4p1, which is supported in this fork alognside OQS digital signature algorithms. Algorithms which involve ML-DSA use a liboqs API name for the final ML-DSA implementation which is currently (August 13th, 2024) aliased to ML-DSA-IPD. When the final implementation for ML-DSA becomes available, the alias will also be updated to the standardized ML-DSA implementation. diff --git a/version.h b/version.h index 0f63303e37b3..d47b8356886d 100644 --- a/version.h +++ b/version.h @@ -3,4 +3,4 @@ #define SSH_VERSION "OpenSSH_10.4-2026-08_" #define SSH_PORTABLE "p1" -#define SSH_RELEASE SSH_VERSION SSH_PORTABLE ", Open Quantum Safe 2026-05" +#define SSH_RELEASE SSH_VERSION SSH_PORTABLE ", Open Quantum Safe 2026-08" From 11d631a5317d4f950ce76bc9957ea53275c3cab4 Mon Sep 17 00:00:00 2001 From: Andrew Younkers Date: Mon, 10 Aug 2026 15:22:38 -0400 Subject: [PATCH 194/196] address regression failures Signed-off-by: Andrew Younkers --- oqs-template/ssh-keyscan.c/assign_kt_masks.fragment | 1 - ssh-keyscan.c | 1 - 2 files changed, 2 deletions(-) diff --git a/oqs-template/ssh-keyscan.c/assign_kt_masks.fragment b/oqs-template/ssh-keyscan.c/assign_kt_masks.fragment index 4a92fc31bbce..9038234cce84 100644 --- a/oqs-template/ssh-keyscan.c/assign_kt_masks.fragment +++ b/oqs-template/ssh-keyscan.c/assign_kt_masks.fragment @@ -8,4 +8,3 @@ {%- endfor %} {%- endfor %} #define KT_MAX ((uint64_t)1<<{{ count.val }}) - diff --git a/ssh-keyscan.c b/ssh-keyscan.c index 2ab24340cc98..2d493d610739 100644 --- a/ssh-keyscan.c +++ b/ssh-keyscan.c @@ -94,7 +94,6 @@ int ssh_port = SSH_DEFAULT_PORT; #define KT_MAX ((uint64_t)1<<30) ///// OQS_TEMPLATE_FRAGMENT_ASSIGN_KT_MASKS_END #define KT_MIN KT_RSA -#define KT_MAX KT_MLDSA44_ED25519 int get_cert = 0; uint64_t get_keytypes = KT_RSA|KT_ECDSA|KT_ED25519|KT_ECDSA_SK|KT_ED25519_SK|KT_MLDSA44_ED25519|\ From 5e43328deabbd731cfcaf63c4f65892fbf75918f Mon Sep 17 00:00:00 2001 From: Andrew Younkers Date: Mon, 10 Aug 2026 16:03:33 -0400 Subject: [PATCH 195/196] bring in applicable openssh changes to vm.yml Signed-off-by: Andrew Younkers --- .github/workflows/vm.yml | 25 ++++++++++++++++--------- oqs-test/run_tests.sh | 2 +- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index 0fa2d34f883f..b763ebb14e83 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -68,7 +68,6 @@ jobs: fail-fast: false matrix: target: - - "12.4" - "13.5" - "14.4" - "15.0" @@ -105,7 +104,7 @@ jobs: sudo -u builder env VMCI=true WITH_OPENSSL=true bash ./oqs-scripts/build_openssh.sh - name: Run tests documented to pass shell: freebsd {0} - run: cd $GITHUB_WORKSPACE && sudo -u builder bash ./oqs-test/run_tests.sh + run: cd $GITHUB_WORKSPACE && sudo -u builder env SKIP_LTESTS=scp3 bash ./oqs-test/run_tests.sh - name: Ensure we have the ssh and sshd syntax right once for each algorithm shell: freebsd {0} run: cd $GITHUB_WORKSPACE && sudo -u builder python3 oqs-test/try_connection.py doone @@ -166,8 +165,7 @@ jobs: run: | cd $GITHUB_WORKSPACE /sbin/chown -R builder . - sed 's/SKIPPED_DUE_TO_CERTIFIED_KEYS}"/SKIPPED_DUE_TO_CERTIFIED_KEYS} ssh-tty"/' \ - ./oqs-test/run_tests.sh | sudo -u builder bash + sudo -u builder env SKIP_LTESTS=ssh-tty bash ./oqs-test/run_tests.sh - name: Ensure we have the ssh and sshd syntax right once for each algorithm shell: netbsd {0} run: | @@ -198,7 +196,7 @@ jobs: prepare: | set -x pfexec pkg refresh - pfexec pkg install autoconf automake bash build-essential cmake git ninja runtime/python-311 + pfexec pkg install autoconf automake bash build-essential cmake git ninja runtime/python-313 useradd -m builder sed -e "s/^root.*ALL$/root ALL=(ALL) NOPASSWD: ALL/" /etc/sudoers >>/tmp/sudoers mv /tmp/sudoers /etc/sudoers @@ -299,8 +297,7 @@ jobs: run: | cd $GITHUB_WORKSPACE chown -R builder . - sed 's/SKIPPED_DUE_TO_CERTIFIED_KEYS}"/SKIPPED_DUE_TO_CERTIFIED_KEYS} ssh-tty"/' \ - ./oqs-test/run_tests.sh | doas -u builder bash + doas -u builder env SKIP_LTESTS=ssh-tty bash ./oqs-test/run_tests.sh - name: Ensure we have the ssh and sshd syntax right once for each algorithm shell: openbsd {0} run: | @@ -396,8 +393,7 @@ jobs: run: | cd $GITHUB_WORKSPACE chown -R builder . - sed 's/SKIPPED_DUE_TO_CERTIFIED_KEYS}"/SKIPPED_DUE_TO_CERTIFIED_KEYS} ssh-tty"/' \ - ./oqs-test/run_tests.sh | doas -u builder bash + doas -u builder env SKIP_LTESTS=ssh-tty bash ./oqs-test/run_tests.sh - name: Ensure we have the ssh and sshd syntax right once for each algorithm shell: openbsd {0} run: | @@ -427,7 +423,18 @@ jobs: usesh: true prepare: | set -x + packages="" + command -v autoconf >/dev/null 2>&1 || packages="$packages autoconf" + command -v automake >/dev/null 2>&1 || packages="$packages automake" + command -v git >/dev/null 2>&1 || packages="$packages git" + command -v ninja >/dev/null 2>&1 || packages="$packages ninja" + command -v python3.11 >/dev/null 2>&1 || packages="$packages runtime/python-311" + [ -z "$packages" ] || pkg install --no-backup-be --accept $packages id -u builder >/dev/null 2>&1 || useradd -m builder + openssl rand -base64 9 >$GITHUB_WORKSPACE/regress/password + chown builder $GITHUB_WORKSPACE/regress/password + pw=$(tr -d '\n' <$GITHUB_WORKSPACE/regress/password | openssl passwd -6 -stdin) + passwd -p "$pw" builder sed -e "s/^root.*ALL$/root ALL=(ALL) NOPASSWD: ALL/" /etc/sudoers >>/tmp/sudoers mv /tmp/sudoers /etc/sudoers echo "builder ALL=(ALL) NOPASSWD: ALL" >/etc/sudoers.d/builder diff --git a/oqs-test/run_tests.sh b/oqs-test/run_tests.sh index 30e9481f9dd6..d5186f12c859 100755 --- a/oqs-test/run_tests.sh +++ b/oqs-test/run_tests.sh @@ -18,4 +18,4 @@ SKIPPED_DUE_TO_CERTIFIED_KEYS="agent \ cert-userkey \ cert-file \ sshsig" -make tests -e SKIP_LTESTS="${INVESTIGATE_FURTHER} ${SKIPPED_DUE_TO_CERTIFIED_KEYS}" +make tests -e SKIP_LTESTS="${SKIP_LTESTS} ${INVESTIGATE_FURTHER} ${SKIPPED_DUE_TO_CERTIFIED_KEYS}" From 31f2cc056d0b98f5f735078110ddc29318a23a54 Mon Sep 17 00:00:00 2001 From: Andrew Younkers Date: Tue, 25 Aug 2026 15:54:25 -0400 Subject: [PATCH 196/196] Prefer OpenSSH implementations of supported hybrid KEX algorithms This commit addresses PR comments in #198. The changes here are to remove OQS implementations and generation of sntrup761x25519-sha512@openssh.com and mlkem768x25519-sha256 in favor of the upstream OpenSSH's implementaion of these algorithms. Signed-off-by: Andrew Younkers --- README.md | 8 +- defines.h | 10 +-- kex-names.c | 12 ++- kex.h | 29 ++++--- kexgen.c | 42 +++++----- kexoqsx25519.c | 82 ------------------- monitor.c | 4 +- myproposal.h | 7 +- .../README.md/list_all_hybrid_kexs.fragment | 2 +- oqs-template/generate.yml | 10 +-- .../ssh-keyscan.c/assign_kt_masks.fragment | 2 +- oqs-test/try_connection.py | 5 +- regress/unittests/kex/test_kex.c | 8 ++ ssh-keyscan.c | 4 +- ssh_api.c | 8 +- sshconnect2.c | 4 +- sshd-auth.c | 4 +- 17 files changed, 87 insertions(+), 154 deletions(-) diff --git a/README.md b/README.md index da8a255cfc9f..9e14afb7a7ad 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Both liboqs and this fork are part of the **Open Quantum Safe (OQS) project**, w ## Status -This fork is currently based on OpenSSH version **10.2** (Git tag V_10_2_P1); release notes can be found [here](RELEASE.md). **IT IS AT AN EXPERIMENTAL STAGE**, and has not received the same level of auditing and analysis that OpenSSH has received. See the [Limitations and Security](#limitations-and-security) section below for more information. +This fork is currently based on OpenSSH version **10.4** (Git tag V_10_4_P1); release notes can be found [here](RELEASE.md). **IT IS AT AN EXPERIMENTAL STAGE**, and has not received the same level of auditing and analysis that OpenSSH has received. See the [Limitations and Security](#limitations-and-security) section below for more information. **WE DO NOT RECOMMEND RELYING ON THIS FORK TO PROTECT SENSITIVE DATA.** @@ -54,7 +54,7 @@ We realize some parties may want to deploy quantum-safe cryptography prior to th ### PQ Offered in OpenSSH -While current versions of (mainline) OpenSSH provide two PQ KEMs, sntrup761x25519-sha512 and mlkem768x25519-sha256, this may not be sufficient for an individual or an organization's use-case. Currently, OpenSSH does not offer a PQ digital signature algorithm or any pure PQ KEM algorithms. These may be needed for compliance efforts or other use-cases. +While current versions of (mainline) OpenSSH provide two PQ KEMs, sntrup761x25519-sha512 and mlkem768x25519-sha256, and one hybrid PQ signature algorithm, ssh-mldsa44-ed25519, this may not be sufficient for an individual or an organization's use-case. Currently, OpenSSH does not offer any pure PQ KEM or signature algorithms. These may be needed for compliance efforts or other use-cases. In such cases, this fork provides a valuable reference and an implementation for interoperability testing. This allows implementors to have a common third-party to test against to help ensure that different implementors will be able to interoperate as the PQ landscape matures in SSH communication. @@ -84,8 +84,7 @@ The following hybrid algorithms are made available (dependent on the associated - **FrodoKEM**: `ecdh-nistp256-frodokem-640-aesr2-sha256@openquantumsafe.org` `x25519-frodokem-640-aesr2-sha256@openquantumsafe.org` `ecdh-nistp384-frodokem-976-aesr2-sha384@openquantumsafe.org` `ecdh-nistp521-frodokem-1344-aesr2-sha512@openquantumsafe.org` `ecdh-nistp256-frodokem-640-shaker2-sha256@openquantumsafe.org` `x25519-frodokem-640-shaker2-sha256@openquantumsafe.org` `ecdh-nistp384-frodokem-976-shaker2-sha384@openquantumsafe.org` `ecdh-nistp521-frodokem-1344-shaker2-sha512@openquantumsafe.org` - **HQC**: `ecdh-nistp256-hqc-128r3-sha256@openquantumsafe.org` `x25519-hqc-128r3-sha256@openquantumsafe.org` `ecdh-nistp384-hqc-192r3-sha384@openquantumsafe.org` `ecdh-nistp521-hqc-256r3-sha512@openquantumsafe.org` - **Kyber**: `ecdh-nistp256-kyber-512r3-sha256-d00@openquantumsafe.org` `x25519-kyber-512r3-sha256-d00@amazon.com` `ecdh-nistp384-kyber-768r3-sha384-d00@openquantumsafe.org` `ecdh-nistp521-kyber-1024r3-sha512-d00@openquantumsafe.org` -- **ML-KEM**: `ecdh-nistp256-ml-kem-512-sha256@openquantumsafe.org` `x25519-ml-kem-512-sha256@openquantumsafe.org` `mlkem768nistp256-sha256` `mlkem768x25519-sha256` `mlkem1024nistp384-sha384` -- **NTRU-Prime**: `sntrup761x25519-sha512@openssh.com` +- **ML-KEM**: `ecdh-nistp256-ml-kem-512-sha256@openquantumsafe.org` `x25519-ml-kem-512-sha256@openquantumsafe.org` `mlkem768nistp256-sha256` `mlkem1024nistp384-sha384` Note that algorithms marked with a dagger (†) have large stack usage and may cause failures when run on threads or in constrained environments. For example, McEliece require building `oqs-openssh` with a large(r) stack provision than is default: Adding `LDFLAGS="-Wl,--stack,20000000"` to [the `./configure` command below](#step-2-build-the-fork) is required to allow cygwin-based testing to pass. @@ -110,7 +109,6 @@ The following hybrid algorithms are supported; they combine a quantum-safe algor - if `` has L1 security, then the fork provides the methods `rsa3072-` and `ecdsa-nistp256-`, which combine `` with RSA3072 and with ECDSA using NIST's P256 curve respectively. - if `` has L3 security, the fork provides the method `ecdsa-nistp384-`, which combines `` with ECDSA using NIST's P384 curve. - if `` has L5 security, the fork provides the method `ecdsa-nistp521-`, which combines `` with ECDSA using NIST's P521 curve. -- NOTE: OpenSSH has added support for the `ssh-mldsa44-ed25519` hybrid signature algorithm in v10.4p1, which is supported in this fork alognside OQS digital signature algorithms. Algorithms which involve ML-DSA use a liboqs API name for the final ML-DSA implementation which is currently (August 13th, 2024) aliased to ML-DSA-IPD. When the final implementation for ML-DSA becomes available, the alias will also be updated to the standardized ML-DSA implementation. diff --git a/defines.h b/defines.h index 14fa0849ee0f..2b761a397903 100644 --- a/defines.h +++ b/defines.h @@ -995,11 +995,11 @@ struct winsize { * so only enable if the compiler supports them. */ #if defined(VARIABLE_LENGTH_ARRAYS) && defined(VARIABLE_DECLARATION_AFTER_CODE) -// OQS Note: Disabled upstream SNTRUP761X25519 support. -# define USE_SNTRUP761X25519 0 -// OQS Note: Disabled upstream MLKEM768X25519 support. -# define USE_MLKEM768X25519 0 -// OQS Note: Enabled upstream MLDSA44x25519 support. +// OQS Note: Prefer OpenSSH SNTRUP761X25519 support. +# define USE_SNTRUP761X25519 1 +// OQS Note: Prefer OpenSSH MLKEM768X25519 support. +# define USE_MLKEM768X25519 1 +// OQS Note: Prefer OpenSSH MLDSA44x25519 support. # define USE_MLDSA 1 #endif diff --git a/kex-names.c b/kex-names.c index 512debee0879..469e6a99a366 100644 --- a/kex-names.c +++ b/kex-names.c @@ -75,6 +75,16 @@ static const struct kexalg kexalgs[] = { #if defined(HAVE_EVP_SHA256) || !defined(WITH_OPENSSL) { KEX_CURVE25519_SHA256, KEX_C25519_SHA256, 0, SSH_DIGEST_SHA256, KEX_NOT_PQ }, { KEX_CURVE25519_SHA256_OLD, KEX_C25519_SHA256, 0, SSH_DIGEST_SHA256, KEX_NOT_PQ }, +#ifdef USE_SNTRUP761X25519 + { KEX_SNTRUP761X25519_SHA512, KEX_KEM_SNTRUP761X25519_SHA512, 0, + SSH_DIGEST_SHA512, KEX_IS_PQ }, + { KEX_SNTRUP761X25519_SHA512_OLD, KEX_KEM_SNTRUP761X25519_SHA512, 0, + SSH_DIGEST_SHA512, KEX_IS_PQ }, +#endif +#ifdef USE_MLKEM768X25519 + { KEX_MLKEM768X25519_SHA256, KEX_KEM_MLKEM768X25519_SHA256, 0, + SSH_DIGEST_SHA256, KEX_IS_PQ }, +#endif #endif /* HAVE_EVP_SHA256 || !WITH_OPENSSL */ ///// OQS_TEMPLATE_FRAGMENT_ADD_KEX_ALGS_START @@ -109,10 +119,8 @@ static const struct kexalg kexalgs[] = { { KEX_ML_KEM_512_SHA256, KEX_KEM_ML_KEM_512_SHA256, 0, SSH_DIGEST_SHA256, KEX_IS_PQ }, { KEX_ML_KEM_512_X25519_SHA256, KEX_KEM_ML_KEM_512_X25519_SHA256, 0, SSH_DIGEST_SHA256, KEX_IS_PQ }, { KEX_ML_KEM_768_SHA256, KEX_KEM_ML_KEM_768_SHA256, 0, SSH_DIGEST_SHA256, KEX_IS_PQ }, - { KEX_ML_KEM_768_X25519_SHA256, KEX_KEM_ML_KEM_768_X25519_SHA256, 0, SSH_DIGEST_SHA256, KEX_IS_PQ }, { KEX_ML_KEM_1024_SHA384, KEX_KEM_ML_KEM_1024_SHA384, 0, SSH_DIGEST_SHA384, KEX_IS_PQ }, { KEX_NTRUPRIME_SNTRUP761_SHA512, KEX_KEM_NTRUPRIME_SNTRUP761_SHA512, 0, SSH_DIGEST_SHA512, KEX_IS_PQ }, - { KEX_NTRUPRIME_SNTRUP761_X25519_SHA512, KEX_KEM_NTRUPRIME_SNTRUP761_X25519_SHA512, 0, SSH_DIGEST_SHA512, KEX_IS_PQ }, #ifdef OPENSSL_HAS_ECC { KEX_FRODOKEM_640_AES_ECDH_NISTP256_SHA256, KEX_KEM_FRODOKEM_640_AES_ECDH_NISTP256_SHA256, NID_X9_62_prime256v1, SSH_DIGEST_SHA256, KEX_IS_PQ }, { KEX_FRODOKEM_976_AES_ECDH_NISTP384_SHA384, KEX_KEM_FRODOKEM_976_AES_ECDH_NISTP384_SHA384, NID_secp384r1, SSH_DIGEST_SHA384, KEX_IS_PQ }, diff --git a/kex.h b/kex.h index dcf6ff3aec37..0d40a5d73059 100644 --- a/kex.h +++ b/kex.h @@ -63,6 +63,9 @@ #define KEX_ECDH_SHA2_NISTP521 "ecdh-sha2-nistp521" #define KEX_CURVE25519_SHA256 "curve25519-sha256" #define KEX_CURVE25519_SHA256_OLD "curve25519-sha256@libssh.org" +#define KEX_SNTRUP761X25519_SHA512 "sntrup761x25519-sha512" +#define KEX_SNTRUP761X25519_SHA512_OLD "sntrup761x25519-sha512@openssh.com" +#define KEX_MLKEM768X25519_SHA256 "mlkem768x25519-sha256" ///// OQS_TEMPLATE_FRAGMENT_DEFINE_KEX_PRETTY_NAMES_START #define KEX_FRODOKEM_640_AES_SHA256 "frodokem-640-aes-sha256" #define KEX_FRODOKEM_640_AES_X25519_SHA256 "x25519-frodokem-640-aesr2-sha256@openquantumsafe.org" @@ -95,10 +98,8 @@ #define KEX_ML_KEM_512_SHA256 "mlkem512-sha256" #define KEX_ML_KEM_512_X25519_SHA256 "x25519-ml-kem-512-sha256@openquantumsafe.org" #define KEX_ML_KEM_768_SHA256 "mlkem768-sha256" -#define KEX_ML_KEM_768_X25519_SHA256 "mlkem768x25519-sha256" #define KEX_ML_KEM_1024_SHA384 "mlkem1024-sha384" #define KEX_NTRUPRIME_SNTRUP761_SHA512 "sntrup761-sha512" -#define KEX_NTRUPRIME_SNTRUP761_X25519_SHA512 "sntrup761x25519-sha512@openssh.com" #ifdef WITH_OPENSSL #ifdef OPENSSL_HAS_ECC #define KEX_FRODOKEM_640_AES_ECDH_NISTP256_SHA256 "ecdh-nistp256-frodokem-640-aesr2-sha256@openquantumsafe.org" @@ -165,6 +166,8 @@ enum kex_exchange { KEX_DH_GEX_SHA256, KEX_ECDH_SHA2, KEX_C25519_SHA256, + KEX_KEM_SNTRUP761X25519_SHA512, + KEX_KEM_MLKEM768X25519_SHA256, ///// OQS_TEMPLATE_FRAGMENT_ADD_KEX_ENUMS_START KEX_KEM_FRODOKEM_640_AES_SHA256, KEX_KEM_FRODOKEM_640_AES_X25519_SHA256, @@ -197,10 +200,8 @@ enum kex_exchange { KEX_KEM_ML_KEM_512_SHA256, KEX_KEM_ML_KEM_512_X25519_SHA256, KEX_KEM_ML_KEM_768_SHA256, - KEX_KEM_ML_KEM_768_X25519_SHA256, KEX_KEM_ML_KEM_1024_SHA384, KEX_KEM_NTRUPRIME_SNTRUP761_SHA512, - KEX_KEM_NTRUPRIME_SNTRUP761_X25519_SHA512, #ifdef WITH_OPENSSL #ifdef OPENSSL_HAS_ECC KEX_KEM_FRODOKEM_640_AES_ECDH_NISTP256_SHA256, @@ -379,6 +380,18 @@ int kex_c25519_enc(struct kex *, const struct sshbuf *, struct sshbuf **, struct sshbuf **); int kex_c25519_dec(struct kex *, const struct sshbuf *, struct sshbuf **); +int kex_kem_sntrup761x25519_keypair(struct kex *); +int kex_kem_sntrup761x25519_enc(struct kex *, const struct sshbuf *, + struct sshbuf **, struct sshbuf **); +int kex_kem_sntrup761x25519_dec(struct kex *, const struct sshbuf *, + struct sshbuf **); + +int kex_kem_mlkem768x25519_keypair(struct kex *); +int kex_kem_mlkem768x25519_enc(struct kex *, const struct sshbuf *, + struct sshbuf **, struct sshbuf **); +int kex_kem_mlkem768x25519_dec(struct kex *, const struct sshbuf *, + struct sshbuf **); + ///// OQS_TEMPLATE_FRAGMENT_DECLARE_KEX_PROTOTYPES_START /* frodokem_640_aes prototypes */ int kex_kem_frodokem_640_aes_keypair(struct kex *); @@ -504,10 +517,6 @@ int kex_kem_ml_kem_512_x25519_dec(struct kex *, const struct sshbuf *, struct s int kex_kem_ml_kem_768_keypair(struct kex *); int kex_kem_ml_kem_768_enc(struct kex *, const struct sshbuf *, struct sshbuf **, struct sshbuf **); int kex_kem_ml_kem_768_dec(struct kex *, const struct sshbuf *, struct sshbuf **); -/* ml_kem_768_x25519 prototypes */ -int kex_kem_ml_kem_768_x25519_keypair(struct kex *); -int kex_kem_ml_kem_768_x25519_enc(struct kex *, const struct sshbuf *, struct sshbuf **, struct sshbuf **); -int kex_kem_ml_kem_768_x25519_dec(struct kex *, const struct sshbuf *, struct sshbuf **); /* ml_kem_1024 prototypes */ int kex_kem_ml_kem_1024_keypair(struct kex *); int kex_kem_ml_kem_1024_enc(struct kex *, const struct sshbuf *, struct sshbuf **, struct sshbuf **); @@ -516,10 +525,6 @@ int kex_kem_ml_kem_1024_dec(struct kex *, const struct sshbuf *, struct sshbuf int kex_kem_ntruprime_sntrup761_keypair(struct kex *); int kex_kem_ntruprime_sntrup761_enc(struct kex *, const struct sshbuf *, struct sshbuf **, struct sshbuf **); int kex_kem_ntruprime_sntrup761_dec(struct kex *, const struct sshbuf *, struct sshbuf **); -/* ntruprime_sntrup761_x25519 prototypes */ -int kex_kem_ntruprime_sntrup761_x25519_keypair(struct kex *); -int kex_kem_ntruprime_sntrup761_x25519_enc(struct kex *, const struct sshbuf *, struct sshbuf **, struct sshbuf **); -int kex_kem_ntruprime_sntrup761_x25519_dec(struct kex *, const struct sshbuf *, struct sshbuf **); #ifdef WITH_OPENSSL #ifdef OPENSSL_HAS_ECC /* frodokem_640_aes_nistp256 prototypes */ diff --git a/kexgen.c b/kexgen.c index 1877b3341546..06a791a697dd 100644 --- a/kexgen.c +++ b/kexgen.c @@ -118,6 +118,12 @@ kex_gen_client(struct ssh *ssh) case KEX_C25519_SHA256: r = kex_c25519_keypair(kex); break; + case KEX_KEM_SNTRUP761X25519_SHA512: + r = kex_kem_sntrup761x25519_keypair(kex); + break; + case KEX_KEM_MLKEM768X25519_SHA256: + r = kex_kem_mlkem768x25519_keypair(kex); + break; ///// OQS_TEMPLATE_FRAGMENT_ADD_CLIENT_SWITCH_CASES_START case KEX_KEM_FRODOKEM_640_AES_SHA256: r = kex_kem_frodokem_640_aes_keypair(kex); @@ -212,18 +218,12 @@ kex_gen_client(struct ssh *ssh) case KEX_KEM_ML_KEM_768_SHA256: r = kex_kem_ml_kem_768_keypair(kex); break; - case KEX_KEM_ML_KEM_768_X25519_SHA256: - r = kex_kem_ml_kem_768_x25519_keypair(kex); - break; case KEX_KEM_ML_KEM_1024_SHA384: r = kex_kem_ml_kem_1024_keypair(kex); break; case KEX_KEM_NTRUPRIME_SNTRUP761_SHA512: r = kex_kem_ntruprime_sntrup761_keypair(kex); break; - case KEX_KEM_NTRUPRIME_SNTRUP761_X25519_SHA512: - r = kex_kem_ntruprime_sntrup761_x25519_keypair(kex); - break; #ifdef WITH_OPENSSL #ifdef OPENSSL_HAS_ECC case KEX_KEM_FRODOKEM_640_AES_ECDH_NISTP256_SHA256: @@ -372,6 +372,14 @@ input_kex_gen_reply(int type, uint32_t seq, struct ssh *ssh) case KEX_C25519_SHA256: r = kex_c25519_dec(kex, server_blob, &shared_secret); break; + case KEX_KEM_SNTRUP761X25519_SHA512: + r = kex_kem_sntrup761x25519_dec(kex, server_blob, + &shared_secret); + break; + case KEX_KEM_MLKEM768X25519_SHA256: + r = kex_kem_mlkem768x25519_dec(kex, server_blob, + &shared_secret); + break; ///// OQS_TEMPLATE_FRAGMENT_ADD_REPLY_SWITCH_CASES_START case KEX_KEM_FRODOKEM_640_AES_SHA256: r = kex_kem_frodokem_640_aes_dec(kex, server_blob, &shared_secret); @@ -466,18 +474,12 @@ input_kex_gen_reply(int type, uint32_t seq, struct ssh *ssh) case KEX_KEM_ML_KEM_768_SHA256: r = kex_kem_ml_kem_768_dec(kex, server_blob, &shared_secret); break; - case KEX_KEM_ML_KEM_768_X25519_SHA256: - r = kex_kem_ml_kem_768_x25519_dec(kex, server_blob, &shared_secret); - break; case KEX_KEM_ML_KEM_1024_SHA384: r = kex_kem_ml_kem_1024_dec(kex, server_blob, &shared_secret); break; case KEX_KEM_NTRUPRIME_SNTRUP761_SHA512: r = kex_kem_ntruprime_sntrup761_dec(kex, server_blob, &shared_secret); break; - case KEX_KEM_NTRUPRIME_SNTRUP761_X25519_SHA512: - r = kex_kem_ntruprime_sntrup761_x25519_dec(kex, server_blob, &shared_secret); - break; #ifdef WITH_OPENSSL #ifdef OPENSSL_HAS_ECC case KEX_KEM_FRODOKEM_640_AES_ECDH_NISTP256_SHA256: @@ -680,6 +682,14 @@ input_kex_gen_init(int type, uint32_t seq, struct ssh *ssh) r = kex_c25519_enc(kex, client_pubkey, &server_pubkey, &shared_secret); break; + case KEX_KEM_SNTRUP761X25519_SHA512: + r = kex_kem_sntrup761x25519_enc(kex, client_pubkey, + &server_pubkey, &shared_secret); + break; + case KEX_KEM_MLKEM768X25519_SHA256: + r = kex_kem_mlkem768x25519_enc(kex, client_pubkey, + &server_pubkey, &shared_secret); + break; ///// OQS_TEMPLATE_FRAGMENT_ADD_INIT_SWITCH_CASES_START case KEX_KEM_FRODOKEM_640_AES_SHA256: r = kex_kem_frodokem_640_aes_enc(kex, client_pubkey, @@ -805,10 +815,6 @@ input_kex_gen_init(int type, uint32_t seq, struct ssh *ssh) r = kex_kem_ml_kem_768_enc(kex, client_pubkey, &server_pubkey, &shared_secret); break; - case KEX_KEM_ML_KEM_768_X25519_SHA256: - r = kex_kem_ml_kem_768_x25519_enc(kex, client_pubkey, - &server_pubkey, &shared_secret); - break; case KEX_KEM_ML_KEM_1024_SHA384: r = kex_kem_ml_kem_1024_enc(kex, client_pubkey, &server_pubkey, &shared_secret); @@ -817,10 +823,6 @@ input_kex_gen_init(int type, uint32_t seq, struct ssh *ssh) r = kex_kem_ntruprime_sntrup761_enc(kex, client_pubkey, &server_pubkey, &shared_secret); break; - case KEX_KEM_NTRUPRIME_SNTRUP761_X25519_SHA512: - r = kex_kem_ntruprime_sntrup761_x25519_enc(kex, client_pubkey, - &server_pubkey, &shared_secret); - break; #ifdef WITH_OPENSSL #ifdef OPENSSL_HAS_ECC case KEX_KEM_FRODOKEM_640_AES_ECDH_NISTP256_SHA256: diff --git a/kexoqsx25519.c b/kexoqsx25519.c index 471ab596f4f1..505f424e6a64 100644 --- a/kexoqsx25519.c +++ b/kexoqsx25519.c @@ -499,86 +499,4 @@ int kex_kem_ml_kem_512_x25519_dec(struct kex *kex, OQS_KEM_free(kem); return r; } -/*--------------------------------------------------------------- - * ML_KEM_768_X25519 METHODS - *--------------------------------------------------------------- - */ -int kex_kem_ml_kem_768_x25519_keypair(struct kex *kex) -{ - OQS_KEM *kem = OQS_KEM_new(OQS_KEM_alg_ml_kem_768); - if (kem == NULL) { - return SSH_ERR_ALLOC_FAIL; - } - int r = kex_kem_generic_with_x25519_keypair(kem, kex); - OQS_KEM_free(kem); - return r; -} - -int kex_kem_ml_kem_768_x25519_enc(struct kex *kex, - const struct sshbuf *client_blob, - struct sshbuf **server_blobp, - struct sshbuf **shared_secretp) -{ - OQS_KEM *kem = OQS_KEM_new(OQS_KEM_alg_ml_kem_768); - if (kem == NULL) { - return SSH_ERR_ALLOC_FAIL; - } - int r = kex_kem_generic_with_x25519_enc(kem, kex, client_blob, server_blobp, shared_secretp); - OQS_KEM_free(kem); - return r; -} - -int kex_kem_ml_kem_768_x25519_dec(struct kex *kex, - const struct sshbuf *server_blobp, - struct sshbuf **shared_secretp) -{ - OQS_KEM *kem = OQS_KEM_new(OQS_KEM_alg_ml_kem_768); - if (kem == NULL) { - return SSH_ERR_ALLOC_FAIL; - } - int r = kex_kem_generic_with_x25519_dec(kem, kex, server_blobp, shared_secretp); - OQS_KEM_free(kem); - return r; -} -/*--------------------------------------------------------------- - * NTRUPRIME_SNTRUP761_X25519 METHODS - *--------------------------------------------------------------- - */ -int kex_kem_ntruprime_sntrup761_x25519_keypair(struct kex *kex) -{ - OQS_KEM *kem = OQS_KEM_new(OQS_KEM_alg_ntruprime_sntrup761); - if (kem == NULL) { - return SSH_ERR_ALLOC_FAIL; - } - int r = kex_kem_generic_with_x25519_keypair(kem, kex); - OQS_KEM_free(kem); - return r; -} - -int kex_kem_ntruprime_sntrup761_x25519_enc(struct kex *kex, - const struct sshbuf *client_blob, - struct sshbuf **server_blobp, - struct sshbuf **shared_secretp) -{ - OQS_KEM *kem = OQS_KEM_new(OQS_KEM_alg_ntruprime_sntrup761); - if (kem == NULL) { - return SSH_ERR_ALLOC_FAIL; - } - int r = kex_kem_generic_with_x25519_enc(kem, kex, client_blob, server_blobp, shared_secretp); - OQS_KEM_free(kem); - return r; -} - -int kex_kem_ntruprime_sntrup761_x25519_dec(struct kex *kex, - const struct sshbuf *server_blobp, - struct sshbuf **shared_secretp) -{ - OQS_KEM *kem = OQS_KEM_new(OQS_KEM_alg_ntruprime_sntrup761); - if (kem == NULL) { - return SSH_ERR_ALLOC_FAIL; - } - int r = kex_kem_generic_with_x25519_dec(kem, kex, server_blobp, shared_secretp); - OQS_KEM_free(kem); - return r; -} ///// OQS_TEMPLATE_FRAGMENT_DEFINE_KEX_WITH_X25519_METHODS_END diff --git a/monitor.c b/monitor.c index 2787879c5973..dccd72a73940 100644 --- a/monitor.c +++ b/monitor.c @@ -1868,6 +1868,8 @@ monitor_apply_keystate(struct ssh *ssh, struct monitor *pmonitor) # endif #endif /* WITH_OPENSSL */ kex->kex[KEX_C25519_SHA256] = kex_gen_server; + kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_server; + kex->kex[KEX_KEM_MLKEM768X25519_SHA256] = kex_gen_server; ///// OQS_TEMPLATE_FRAGMENT_APPLY_KEYSTATE_START kex->kex[KEX_KEM_FRODOKEM_640_AES_SHA256] = kex_gen_server; kex->kex[KEX_KEM_FRODOKEM_640_AES_X25519_SHA256] = kex_gen_server; @@ -1900,10 +1902,8 @@ monitor_apply_keystate(struct ssh *ssh, struct monitor *pmonitor) kex->kex[KEX_KEM_ML_KEM_512_SHA256] = kex_gen_server; kex->kex[KEX_KEM_ML_KEM_512_X25519_SHA256] = kex_gen_server; kex->kex[KEX_KEM_ML_KEM_768_SHA256] = kex_gen_server; - kex->kex[KEX_KEM_ML_KEM_768_X25519_SHA256] = kex_gen_server; kex->kex[KEX_KEM_ML_KEM_1024_SHA384] = kex_gen_server; kex->kex[KEX_KEM_NTRUPRIME_SNTRUP761_SHA512] = kex_gen_server; - kex->kex[KEX_KEM_NTRUPRIME_SNTRUP761_X25519_SHA512] = kex_gen_server; #ifdef WITH_OPENSSL #ifdef OPENSSL_HAS_ECC kex->kex[KEX_KEM_FRODOKEM_640_AES_ECDH_NISTP256_SHA256] = kex_gen_server; diff --git a/myproposal.h b/myproposal.h index d0bcc37d2347..16cd2f568164 100644 --- a/myproposal.h +++ b/myproposal.h @@ -37,6 +37,9 @@ "diffie-hellman-group16-sha512," \ "diffie-hellman-group18-sha512," \ "diffie-hellman-group14-sha256," \ + "mlkem768x25519-sha256," \ + "sntrup761x25519-sha512," \ + "sntrup761x25519-sha512@openssh.com," \ /*/// OQS_TEMPLATE_FRAGMENT_ADD_SERVER_KEXS_START */ \ "frodokem-640-aes-sha256," \ "ecdh-nistp256-frodokem-640-aesr2-sha256@openquantumsafe.org," \ @@ -93,11 +96,9 @@ "x25519-ml-kem-512-sha256@openquantumsafe.org," \ "mlkem768-sha256," \ "mlkem768nistp256-sha256," \ - "mlkem768x25519-sha256," \ "mlkem1024-sha384," \ "mlkem1024nistp384-sha384," \ - "sntrup761-sha512," \ - "sntrup761x25519-sha512@openssh.com" + "sntrup761-sha512" /*/// OQS_TEMPLATE_FRAGMENT_ADD_SERVER_KEXS_END */ #define KEX_CLIENT_KEX KEX_SERVER_KEX diff --git a/oqs-template/README.md/list_all_hybrid_kexs.fragment b/oqs-template/README.md/list_all_hybrid_kexs.fragment index 86780fa59aa8..097ce54b1a34 100644 --- a/oqs-template/README.md/list_all_hybrid_kexs.fragment +++ b/oqs-template/README.md/list_all_hybrid_kexs.fragment @@ -1,4 +1,4 @@ -{%- for family, kexs in (config['kexs'] | selectattr("family") | groupby('family')) %} +{%- for family, kexs in (config['kexs'] | selectattr("mix_with") | groupby('family')) %} - **{{ family }}**: {%- for kex in kexs %}{% for curve in kex['mix_with'] %} `{{ curve['pretty_name'] }}`{% endfor %}{% endfor %} {%- endfor %} diff --git a/oqs-template/generate.yml b/oqs-template/generate.yml index 992e67750cc1..0cff2fa1d6e1 100644 --- a/oqs-template/generate.yml +++ b/oqs-template/generate.yml @@ -329,10 +329,6 @@ kexs: name: 'nistp256' openssl_nid: 'NID_X9_62_prime256v1' pretty_name: 'mlkem768nistp256-sha256' - - - name: 'x25519' - x25519: true - pretty_name: 'mlkem768x25519-sha256' - family: 'ML-KEM' name: 'ml_kem_1024' @@ -350,11 +346,7 @@ kexs: enable: true hash: 'sha512' pretty_name: 'sntrup761-sha512' - mix_with: - - - name: 'x25519' - x25519: true - pretty_name: 'sntrup761x25519-sha512@openssh.com' + mix_with: [] sigs: - diff --git a/oqs-template/ssh-keyscan.c/assign_kt_masks.fragment b/oqs-template/ssh-keyscan.c/assign_kt_masks.fragment index 9038234cce84..383e2d498569 100644 --- a/oqs-template/ssh-keyscan.c/assign_kt_masks.fragment +++ b/oqs-template/ssh-keyscan.c/assign_kt_masks.fragment @@ -7,4 +7,4 @@ #define KT_{{ alg['name']|upper }}_{{ sig['name']|upper }} ((uint64_t)1<<{{ count.val }}) {%- endfor %} {%- endfor %} -#define KT_MAX ((uint64_t)1<<{{ count.val }}) +#define KT_MAX ((uint64_t)1<<{{ count.val }}){{ '\n' }} diff --git a/oqs-test/try_connection.py b/oqs-test/try_connection.py index d139932f5612..f988079d8c6a 100644 --- a/oqs-test/try_connection.py +++ b/oqs-test/try_connection.py @@ -12,6 +12,9 @@ # Requires make tests LTESTS="" to be run first kexs = [ + "mlkem768x25519-sha256", + "sntrup761x25519-sha512", + "sntrup761x25519-sha512@openssh.com", ##### OQS_TEMPLATE_FRAGMENT_LIST_ALL_KEXS_START "frodokem-640-aes-sha256", "ecdh-nistp256-frodokem-640-aesr2-sha256@openquantumsafe.org", @@ -68,11 +71,9 @@ "x25519-ml-kem-512-sha256@openquantumsafe.org", "mlkem768-sha256", "mlkem768nistp256-sha256", - "mlkem768x25519-sha256", "mlkem1024-sha384", "mlkem1024nistp384-sha384", "sntrup761-sha512", - "sntrup761x25519-sha512@openssh.com", ##### OQS_TEMPLATE_FRAGMENT_LIST_ALL_KEXS_END ] diff --git a/regress/unittests/kex/test_kex.c b/regress/unittests/kex/test_kex.c index c89f384613ee..16c2f2dff975 100644 --- a/regress/unittests/kex/test_kex.c +++ b/regress/unittests/kex/test_kex.c @@ -168,6 +168,8 @@ do_kex_with_key(char *kex, char *cipher, char *mac, #endif /* OPENSSL_HAS_ECC */ #endif /* WITH_OPENSSL */ server2->kex->kex[KEX_C25519_SHA256] = kex_gen_server; + server2->kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_server; + server2->kex->kex[KEX_KEM_MLKEM768X25519_SHA256] = kex_gen_server; server2->kex->load_host_public_key = server->kex->load_host_public_key; server2->kex->load_host_private_key = server->kex->load_host_private_key; server2->kex->sign = server->kex->sign; @@ -243,5 +245,11 @@ kex_tests(void) do_kex("diffie-hellman-group16-sha512"); do_kex("diffie-hellman-group18-sha512"); } +# ifdef USE_MLKEM768X25519 + do_kex("mlkem768x25519-sha256"); +# endif /* USE_MLKEM768X25519 */ +# ifdef USE_SNTRUP761X25519 + do_kex("sntrup761x25519-sha512"); +# endif /* USE_SNTRUP761X25519 */ #endif /* WITH_OPENSSL */ } diff --git a/ssh-keyscan.c b/ssh-keyscan.c index 2d493d610739..21d602ca9405 100644 --- a/ssh-keyscan.c +++ b/ssh-keyscan.c @@ -425,6 +425,8 @@ keygrab_ssh2(con *c) # endif #endif c->c_ssh->kex->kex[KEX_C25519_SHA256] = kex_gen_client; + c->c_ssh->kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_client; + c->c_ssh->kex->kex[KEX_KEM_MLKEM768X25519_SHA256] = kex_gen_client; ///// OQS_TEMPLATE_FRAGMENT_ASSIGN_KEX_GEN_CLIENT_START c->c_ssh->kex->kex[KEX_KEM_FRODOKEM_640_AES_SHA256] = kex_gen_client; c->c_ssh->kex->kex[KEX_KEM_FRODOKEM_640_AES_X25519_SHA256] = kex_gen_client; @@ -457,10 +459,8 @@ keygrab_ssh2(con *c) c->c_ssh->kex->kex[KEX_KEM_ML_KEM_512_SHA256] = kex_gen_client; c->c_ssh->kex->kex[KEX_KEM_ML_KEM_512_X25519_SHA256] = kex_gen_client; c->c_ssh->kex->kex[KEX_KEM_ML_KEM_768_SHA256] = kex_gen_client; - c->c_ssh->kex->kex[KEX_KEM_ML_KEM_768_X25519_SHA256] = kex_gen_client; c->c_ssh->kex->kex[KEX_KEM_ML_KEM_1024_SHA384] = kex_gen_client; c->c_ssh->kex->kex[KEX_KEM_NTRUPRIME_SNTRUP761_SHA512] = kex_gen_client; - c->c_ssh->kex->kex[KEX_KEM_NTRUPRIME_SNTRUP761_X25519_SHA512] = kex_gen_client; #ifdef WITH_OPENSSL #ifdef OPENSSL_HAS_ECC c->c_ssh->kex->kex[KEX_KEM_FRODOKEM_640_AES_ECDH_NISTP256_SHA256] = kex_gen_client; diff --git a/ssh_api.c b/ssh_api.c index 137ae7339e82..ab903ed2bb0d 100644 --- a/ssh_api.c +++ b/ssh_api.c @@ -134,6 +134,8 @@ ssh_init(struct ssh **sshp, int is_server, struct kex_params *kex_params) # endif #endif /* WITH_OPENSSL */ ssh->kex->kex[KEX_C25519_SHA256] = kex_gen_server; + ssh->kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_server; + ssh->kex->kex[KEX_KEM_MLKEM768X25519_SHA256] = kex_gen_server; ///// OQS_TEMPLATE_FRAGMENT_POINT_TO_KEX_GEN_SERVER_START ssh->kex->kex[KEX_KEM_FRODOKEM_640_AES_SHA256] = kex_gen_server; ssh->kex->kex[KEX_KEM_FRODOKEM_640_AES_X25519_SHA256] = kex_gen_server; @@ -166,10 +168,8 @@ ssh_init(struct ssh **sshp, int is_server, struct kex_params *kex_params) ssh->kex->kex[KEX_KEM_ML_KEM_512_SHA256] = kex_gen_server; ssh->kex->kex[KEX_KEM_ML_KEM_512_X25519_SHA256] = kex_gen_server; ssh->kex->kex[KEX_KEM_ML_KEM_768_SHA256] = kex_gen_server; - ssh->kex->kex[KEX_KEM_ML_KEM_768_X25519_SHA256] = kex_gen_server; ssh->kex->kex[KEX_KEM_ML_KEM_1024_SHA384] = kex_gen_server; ssh->kex->kex[KEX_KEM_NTRUPRIME_SNTRUP761_SHA512] = kex_gen_server; - ssh->kex->kex[KEX_KEM_NTRUPRIME_SNTRUP761_X25519_SHA512] = kex_gen_server; #ifdef WITH_OPENSSL #ifdef OPENSSL_HAS_ECC ssh->kex->kex[KEX_KEM_FRODOKEM_640_AES_ECDH_NISTP256_SHA256] = kex_gen_server; @@ -217,6 +217,8 @@ ssh_init(struct ssh **sshp, int is_server, struct kex_params *kex_params) # endif #endif /* WITH_OPENSSL */ ssh->kex->kex[KEX_C25519_SHA256] = kex_gen_client; + ssh->kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_client; + ssh->kex->kex[KEX_KEM_MLKEM768X25519_SHA256] = kex_gen_client; ///// OQS_TEMPLATE_FRAGMENT_POINT_TO_KEX_GEN_CLIENT_START ssh->kex->kex[KEX_KEM_FRODOKEM_640_AES_SHA256] = kex_gen_client; ssh->kex->kex[KEX_KEM_FRODOKEM_640_AES_X25519_SHA256] = kex_gen_client; @@ -249,10 +251,8 @@ ssh_init(struct ssh **sshp, int is_server, struct kex_params *kex_params) ssh->kex->kex[KEX_KEM_ML_KEM_512_SHA256] = kex_gen_client; ssh->kex->kex[KEX_KEM_ML_KEM_512_X25519_SHA256] = kex_gen_client; ssh->kex->kex[KEX_KEM_ML_KEM_768_SHA256] = kex_gen_client; - ssh->kex->kex[KEX_KEM_ML_KEM_768_X25519_SHA256] = kex_gen_client; ssh->kex->kex[KEX_KEM_ML_KEM_1024_SHA384] = kex_gen_client; ssh->kex->kex[KEX_KEM_NTRUPRIME_SNTRUP761_SHA512] = kex_gen_client; - ssh->kex->kex[KEX_KEM_NTRUPRIME_SNTRUP761_X25519_SHA512] = kex_gen_client; #ifdef WITH_OPENSSL #ifdef OPENSSL_HAS_ECC ssh->kex->kex[KEX_KEM_FRODOKEM_640_AES_ECDH_NISTP256_SHA256] = kex_gen_client; diff --git a/sshconnect2.c b/sshconnect2.c index dc734b369754..96280d207b18 100644 --- a/sshconnect2.c +++ b/sshconnect2.c @@ -278,6 +278,8 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr_storage *hostaddr, # endif #endif ssh->kex->kex[KEX_C25519_SHA256] = kex_gen_client; + ssh->kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_client; + ssh->kex->kex[KEX_KEM_MLKEM768X25519_SHA256] = kex_gen_client; ///// OQS_TEMPLATE_FRAGMENT_POINT_TO_KEX_GEN_START ssh->kex->kex[KEX_KEM_FRODOKEM_640_AES_SHA256] = kex_gen_client; ssh->kex->kex[KEX_KEM_FRODOKEM_640_AES_X25519_SHA256] = kex_gen_client; @@ -310,10 +312,8 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr_storage *hostaddr, ssh->kex->kex[KEX_KEM_ML_KEM_512_SHA256] = kex_gen_client; ssh->kex->kex[KEX_KEM_ML_KEM_512_X25519_SHA256] = kex_gen_client; ssh->kex->kex[KEX_KEM_ML_KEM_768_SHA256] = kex_gen_client; - ssh->kex->kex[KEX_KEM_ML_KEM_768_X25519_SHA256] = kex_gen_client; ssh->kex->kex[KEX_KEM_ML_KEM_1024_SHA384] = kex_gen_client; ssh->kex->kex[KEX_KEM_NTRUPRIME_SNTRUP761_SHA512] = kex_gen_client; - ssh->kex->kex[KEX_KEM_NTRUPRIME_SNTRUP761_X25519_SHA512] = kex_gen_client; #ifdef WITH_OPENSSL #ifdef OPENSSL_HAS_ECC ssh->kex->kex[KEX_KEM_FRODOKEM_640_AES_ECDH_NISTP256_SHA256] = kex_gen_client; diff --git a/sshd-auth.c b/sshd-auth.c index 725c612603ad..c736260d9fd3 100644 --- a/sshd-auth.c +++ b/sshd-auth.c @@ -817,6 +817,8 @@ do_ssh2_kex(struct ssh *ssh) # endif /* OPENSSL_HAS_ECC */ #endif /* WITH_OPENSSL */ kex->kex[KEX_C25519_SHA256] = kex_gen_server; + kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_server; + kex->kex[KEX_KEM_MLKEM768X25519_SHA256] = kex_gen_server; ///// OQS_TEMPLATE_FRAGMENT_POINT_TO_KEX_GEN_START kex->kex[KEX_KEM_FRODOKEM_640_AES_SHA256] = kex_gen_server; kex->kex[KEX_KEM_FRODOKEM_640_AES_X25519_SHA256] = kex_gen_server; @@ -849,10 +851,8 @@ do_ssh2_kex(struct ssh *ssh) kex->kex[KEX_KEM_ML_KEM_512_SHA256] = kex_gen_server; kex->kex[KEX_KEM_ML_KEM_512_X25519_SHA256] = kex_gen_server; kex->kex[KEX_KEM_ML_KEM_768_SHA256] = kex_gen_server; - kex->kex[KEX_KEM_ML_KEM_768_X25519_SHA256] = kex_gen_server; kex->kex[KEX_KEM_ML_KEM_1024_SHA384] = kex_gen_server; kex->kex[KEX_KEM_NTRUPRIME_SNTRUP761_SHA512] = kex_gen_server; - kex->kex[KEX_KEM_NTRUPRIME_SNTRUP761_X25519_SHA512] = kex_gen_server; #ifdef WITH_OPENSSL #ifdef OPENSSL_HAS_ECC kex->kex[KEX_KEM_FRODOKEM_640_AES_ECDH_NISTP256_SHA256] = kex_gen_server;